From 8c0a33cd6fdaada3730394c021d8932250b709e7 Mon Sep 17 00:00:00 2001 From: Laurent Lalanne Date: Sun, 1 Feb 2015 06:22:38 +0100 Subject: [PATCH 1/5] OP-1698 First commit : Add Accessory0,1,2 to Output --- .../src/plugins/config/airframe_multirotor.ui | 373 ++++++++++++++---- .../configmultirotorwidget.cpp | 90 ++++- .../cfg_vehicletypes/configmultirotorwidget.h | 3 + .../config/cfg_vehicletypes/vehicleconfig.h | 5 +- 4 files changed, 392 insertions(+), 79 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui b/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui index 4d96dce60..7b8bbb11c 100644 --- a/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui +++ b/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui @@ -511,7 +511,7 @@ Typical value is 50% for + or X configuration on quads. Motor output channels - + 9 @@ -524,19 +524,31 @@ Typical value is 50% for + or X configuration on quads. 9 - - + + QLayout::SetMaximumSize QFormLayout::AllNonFixedFieldsGrow - - 6 + + 10 - + + + + 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); @@ -545,19 +557,59 @@ font: bold 12px; margin:1px; - 1 + RC Input + + + Qt::AlignCenter - + + + + 0 + 0 + + + + + 80 + 0 + + - Assign your motor output channels using the drawing above as a reference. Respect propeller rotation. + RcOutput channels + + + 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 Output + + + Qt::AlignCenter - + + + + 0 + 0 + + + + + 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); @@ -566,19 +618,40 @@ font: bold 12px; margin:1px; - 2 + Accessory0 + + + Qt::AlignCenter - + + + + 0 + 0 + + + + + 80 + 0 + + - Assign your motor output channels using the drawing above as a reference. Respect propeller rotation. + 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); @@ -587,19 +660,40 @@ font: bold 12px; margin:1px; - 3 + Accessory1 + + + Qt::AlignCenter - + + + + 0 + 0 + + + + + 80 + 0 + + - Assign your motor output channels using the drawing above as a reference. Respect propeller rotation. + Select output channel for Accessory1 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); @@ -608,19 +702,63 @@ font: bold 12px; margin:1px; - 4 + Accessory2 + + + Qt::AlignCenter - + + + + 0 + 0 + + + + + 80 + 0 + + - Assign your motor output channels using the drawing above as a reference. Respect propeller rotation. + Select output channel for Accessory2 RcInput + + + + + 0 + 0 + + + + + 0 + 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; + + + Tricopter Yaw Servo channel + + + Qt::AlignCenter + + + @@ -749,7 +887,143 @@ margin:1px; - + + + + true + + + + 0 + 0 + + + + + 40 + 20 + + + + + + + + QLayout::SetMaximumSize + + + QFormLayout::AllNonFixedFieldsGrow + + + 6 + + + + + 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; + + + 1 + + + + + + + Assign your motor output channels using the drawing above as a reference. Respect propeller rotation. + + + + + + + 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; + + + 2 + + + + + + + Assign your motor output channels using the drawing above as a reference. Respect propeller rotation. + + + + + + + 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; + + + 3 + + + + + + + Assign your motor output channels using the drawing above as a reference. Respect propeller rotation. + + + + + + + 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; + + + 4 + + + + + + + Assign your motor output channels using the drawing above as a reference. Respect propeller rotation. + + + + + + + + + Qt::Vertical + + + + + + + + 0 + 20 + + + + Reverse all motors + + + + @@ -778,61 +1052,6 @@ margin:1px; - - - - true - - - - 0 - 0 - - - - - 40 - 0 - - - - - - - - - 0 - 0 - - - - - 0 - 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; - - - Tricopter Yaw Servo channel - - - Qt::AlignCenter - - - - - - - Reverse all motors - - - diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp index e186a5972..ac95e4a30 100644 --- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp @@ -110,6 +110,17 @@ QStringList ConfigMultiRotorWidget::getChannelDescriptions() if (multi.TRIYaw > 0 && multi.TRIYaw <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { channelDesc[multi.TRIYaw - 1] = QString("Tri-Yaw"); } + + if (multi.Accessory0 > 0 && multi.Accessory0 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { + channelDesc[multi.Accessory0 - 1] = QString("Accessory0"); + } + if (multi.Accessory1 > 0 && multi.Accessory1 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { + channelDesc[multi.Accessory1 - 1] = QString("Accessory1"); + } + if (multi.Accessory2 > 0 && multi.Accessory2 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) { + channelDesc[multi.Accessory2 - 1] = QString("Accessory2"); + } + return channelDesc; } @@ -319,6 +330,9 @@ void ConfigMultiRotorWidget::registerWidgets(ConfigTaskWidget &parent) parent.addWidget(m_aircraft->mrYawMixLevel); parent.addWidget(m_aircraft->triYawChannelBox); parent.addWidget(m_aircraft->MultirotorRevMixerCheckBox); + parent.addWidget(m_aircraft->rcOutputChannelBox1); + parent.addWidget(m_aircraft->rcOutputChannelBox2); + parent.addWidget(m_aircraft->rcOutputChannelBox3); } void ConfigMultiRotorWidget::resetActuators(GUIConfigDataUnion *configData) @@ -342,6 +356,29 @@ void ConfigMultiRotorWidget::resetActuators(GUIConfigDataUnion *configData) configData->multi.VTOLMotorNNW = 0; } +void ConfigMultiRotorWidget::resetRcOutputs(GUIConfigDataUnion *configData) +{ + configData->multi.Accessory0 = 0; + configData->multi.Accessory1 = 0; + configData->multi.Accessory2 = 0; +} + +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); + } +} + /** Helper function to refresh the UI widget values */ @@ -457,6 +494,10 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType) setComboCurrentIndex(m_aircraft->triYawChannelBox, multi.TRIYaw); } + setComboCurrentIndex(m_aircraft->rcOutputChannelBox1, multi.Accessory0); + setComboCurrentIndex(m_aircraft->rcOutputChannelBox2, multi.Accessory1); + setComboCurrentIndex(m_aircraft->rcOutputChannelBox3, multi.Accessory2); + // 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")); @@ -476,6 +517,13 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets() Q_ASSERT(mixer); + // Reset all Mixers + resetMixers(); + + QList rcOutputList; + rcOutputList << "Accessory0" << "Accessory1" << "Accessory2"; + setupRcOutputs(rcOutputList); + // Curve is also common to all quads: setThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, m_aircraft->multiThrottleCurve->getCurve()); @@ -731,7 +779,6 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets() m_aircraft->mrStatusLabel->setText(tr("Configuration OK")); } - return airframeType; } @@ -816,6 +863,47 @@ void ConfigMultiRotorWidget::setupQuadMotor(int channel, double pitch, double ro setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, yaw * 127); } +/** + Helper function: setup rc outputs. Takes a list of channel names in input. + */ +void ConfigMultiRotorWidget::setupRcOutputs(QList rcOutputList) +{ + QList rcList; + rcList << m_aircraft->rcOutputChannelBox1 << m_aircraft->rcOutputChannelBox2 << m_aircraft->rcOutputChannelBox3; + + GUIConfigDataUnion configData = getConfigData(); + resetRcOutputs(&configData); + + UAVDataObject *mixer = dynamic_cast(getObjectManager()->getObject(QString("MixerSettings"))); + Q_ASSERT(mixer); + + 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); + } + } 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); + } + } 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); + } + } + } + setConfigData(configData); +} + + /** Helper function: setup motors. Takes a list of channel names in input. */ diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.h b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.h index dde2ced06..8140903d8 100644 --- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.h +++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.h @@ -65,12 +65,15 @@ private: virtual void registerWidgets(ConfigTaskWidget &parent); virtual void resetActuators(GUIConfigDataUnion *configData); + virtual void resetRcOutputs(GUIConfigDataUnion *configData); bool setupQuad(bool pLayout); bool setupHexa(bool pLayout); bool setupOcto(); bool setupMultiRotorMixer(double mixerFactors[8][3]); void setupMotors(QList motorList); + void setupRcOutputs(QList rcOutputList); + void resetMixers(); void setupQuadMotor(int channel, double roll, double pitch, double yaw); void setYawMixLevel(int); diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/vehicleconfig.h b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/vehicleconfig.h index 6dfe1760a..0a27e8390 100644 --- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/vehicleconfig.h +++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/vehicleconfig.h @@ -52,7 +52,10 @@ typedef struct { uint VTOLMotorWNW : 4; uint VTOLMotorNNW : 4; // 64 bits uint TRIYaw : 4; - quint32 padding : 28; // 96 bits + uint Accessory0 : 4; + uint Accessory1 : 4; + uint Accessory2 : 4; + quint32 padding : 16; // 96 bits quint32 padding1; // 128 bits } __attribute__((packed)) multiGUISettingsStruct; From f18aa3d2cbf41ce7843a6286481e677c7b0a7119 Mon Sep 17 00:00:00 2001 From: Laurent Lalanne Date: Sun, 1 Feb 2015 14:59:18 +0100 Subject: [PATCH 2/5] OP-1698 Add curve choice for all accessory outputs --- .../src/plugins/config/airframe_multirotor.ui | 140 +++++++++++------- .../configmultirotorwidget.cpp | 65 ++++++-- .../cfg_vehicletypes/configmultirotorwidget.h | 2 +- 3 files changed, 144 insertions(+), 63 deletions(-) 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); From 4423fa9d0cc3ab243a179c585464c27cf67394b6 Mon Sep 17 00:00:00 2001 From: Laurent Lalanne Date: Sun, 1 Feb 2015 18:02:19 +0100 Subject: [PATCH 3/5] OP-1698 Added channel allocation checking - Little HexaH bug - Uncrustify --- .../src/plugins/config/airframe_multirotor.ui | 8 +-- .../configmultirotorwidget.cpp | 59 +++++++++++++++---- .../config/configvehicletypewidget.cpp | 1 + 3 files changed, 52 insertions(+), 16 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui b/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui index 55df54cfd..15efc09f6 100644 --- a/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui +++ b/ground/openpilotgcs/src/plugins/config/airframe_multirotor.ui @@ -542,7 +542,7 @@ Typical value is 50% for + or X configuration on quads. - 80 + 0 0 @@ -584,7 +584,7 @@ margin:1px; - 80 + 120 0 @@ -674,7 +674,7 @@ margin:1px; - 80 + 0 0 @@ -693,7 +693,7 @@ margin:1px; - 80 + 0 0 diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp index ac2c3b800..f6ed74605 100644 --- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp @@ -377,6 +377,7 @@ 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++) { @@ -387,6 +388,7 @@ void ConfigMultiRotorWidget::resetMixers() void ConfigMultiRotorWidget::updateRcCurvesUsed() { UAVDataObject *mixer = dynamic_cast(getObjectManager()->getObject(QString("MixerSettings"))); + Q_ASSERT(mixer); setComboCurrentIndex(m_aircraft->rcOutputCurveBox1, VehicleConfig::MIXER_THROTTLECURVE1); @@ -400,7 +402,7 @@ void ConfigMultiRotorWidget::updateRcCurvesUsed() } 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); + setComboCurrentIndex(m_aircraft->rcOutputCurveBox3, VehicleConfig::MIXER_THROTTLECURVE2); } } } @@ -905,20 +907,21 @@ 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(); - + 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); if (curveAccessory0) { - setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2 , 127); + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 127); } else { - setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1 , 127); + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127); } } } else if (rc_output == QString("Accessory1")) { @@ -926,9 +929,9 @@ void ConfigMultiRotorWidget::setupRcOutputs(QList rcOutputList) if (index) { setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY1); if (curveAccessory1) { - setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2 , 127); + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 127); } else { - setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1 , 127); + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127); } } } else if (rc_output == QString("Accessory2")) { @@ -936,9 +939,9 @@ void ConfigMultiRotorWidget::setupRcOutputs(QList rcOutputList) if (index) { setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY2); if (curveAccessory2) { - setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2 , 127); + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 127); } else { - setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1 , 127); + setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127); } } } @@ -1183,6 +1186,7 @@ bool ConfigMultiRotorWidget::throwConfigError(int numMotors) { // Initialize configuration error flag bool error = false; + QString channelNames = ""; // Iterate through all instances of multiMotorChannelBox for (int i = 0; i < numMotors; i++) { @@ -1195,9 +1199,40 @@ bool ConfigMultiRotorWidget::throwConfigError(int numMotors) pixmap.fill(QColor("red")); combobox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes error = true; + } else if (channelNames.contains(combobox->currentText(), Qt::CaseInsensitive)) { + int size = combobox->style()->pixelMetric(QStyle::PM_SmallIconSize); + QPixmap pixmap(size, size); + pixmap.fill(QColor("orange")); + combobox->setItemData(combobox->currentIndex(), pixmap, Qt::DecorationRole); // Set color palettes + combobox->setToolTip(tr("Duplicate channel in motor outputs")); } else { - combobox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes + for (int index = 0; index < (int)ConfigMultiRotorWidget::CHANNEL_NUMELEM; index++) { + combobox->setItemData(index, 0, Qt::DecorationRole); // Reset all color palettes + combobox->setToolTip(""); + } } + channelNames += combobox->currentText() == "None" ? "" : combobox->currentText(); + } + } + + // Iterate through all instances of rcOutputChannelBox + for (int i = 0; i < 3; i++) { + // Fine widgets with text "rcOutputChannelBox.x", where x is an integer + QComboBox *combobox = this->findChild("rcOutputChannelBox" + QString::number(i + 1)); + if (combobox) { + if (channelNames.contains(combobox->currentText(), Qt::CaseInsensitive)) { + int size = combobox->style()->pixelMetric(QStyle::PM_SmallIconSize); + QPixmap pixmap(size, size); + pixmap.fill(QColor("orange")); + combobox->setItemData(combobox->currentIndex(), pixmap, Qt::DecorationRole); // Set color palettes + combobox->setToolTip(tr("Channel already used")); + } else { + for (int index = 0; index < (int)ConfigMultiRotorWidget::CHANNEL_NUMELEM; index++) { + combobox->setItemData(index, 0, Qt::DecorationRole); // Reset all color palettes + combobox->setToolTip(tr("Select output channel for Accessory%1 RcInput").arg(i)); + } + } + channelNames += combobox->currentText() == "None" ? "" : combobox->currentText(); } } diff --git a/ground/openpilotgcs/src/plugins/config/configvehicletypewidget.cpp b/ground/openpilotgcs/src/plugins/config/configvehicletypewidget.cpp index 02ecb5b65..198753877 100644 --- a/ground/openpilotgcs/src/plugins/config/configvehicletypewidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configvehicletypewidget.cpp @@ -94,6 +94,7 @@ QStringList ConfigVehicleTypeWidget::getChannelDescriptions() case SystemSettings::AIRFRAMETYPE_HEXAX: case SystemSettings::AIRFRAMETYPE_HEXACOAX: case SystemSettings::AIRFRAMETYPE_HEXA: + case SystemSettings::AIRFRAMETYPE_HEXAH: // multirotor channelDesc = ConfigMultiRotorWidget::getChannelDescriptions(); break; From 4ca715bddf6ab313e5ac7a84260195ac8dec383a Mon Sep 17 00:00:00 2001 From: Laurent Lalanne Date: Sun, 1 Feb 2015 18:30:39 +0100 Subject: [PATCH 4/5] OP-1698 Removed empty lines --- .../plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp index f6ed74605..62a59a62a 100644 --- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp @@ -137,7 +137,6 @@ ConfigMultiRotorWidget::ConfigMultiRotorWidget(QWidget *parent) : 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); @@ -949,7 +948,6 @@ void ConfigMultiRotorWidget::setupRcOutputs(QList rcOutputList) setConfigData(configData); } - /** Helper function: setup motors. Takes a list of channel names in input. */ From d567d882161a1b64b2108a58052dc9fb1f3f3e5c Mon Sep 17 00:00:00 2001 From: Laurent Lalanne Date: Sun, 1 Feb 2015 23:19:04 +0100 Subject: [PATCH 5/5] OP-1698 Changes from review --- .../config/cfg_vehicletypes/configmultirotorwidget.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp index 62a59a62a..6681a5b17 100644 --- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configmultirotorwidget.cpp @@ -1188,7 +1188,7 @@ bool ConfigMultiRotorWidget::throwConfigError(int numMotors) // Iterate through all instances of multiMotorChannelBox for (int i = 0; i < numMotors; i++) { - // Fine widgets with text "multiMotorChannelBox.x", where x is an integer + // Find widgets with his name "multiMotorChannelBox.x", where x is an integer QComboBox *combobox = this->findChild("multiMotorChannelBox" + QString::number(i + 1)); if (combobox) { if (combobox->currentText() == "None") { @@ -1209,13 +1209,13 @@ bool ConfigMultiRotorWidget::throwConfigError(int numMotors) combobox->setToolTip(""); } } - channelNames += combobox->currentText() == "None" ? "" : combobox->currentText(); + channelNames += (combobox->currentText() == "None") ? "" : combobox->currentText(); } } // Iterate through all instances of rcOutputChannelBox for (int i = 0; i < 3; i++) { - // Fine widgets with text "rcOutputChannelBox.x", where x is an integer + // Find widgets with his name "rcOutputChannelBox.x", where x is an integer QComboBox *combobox = this->findChild("rcOutputChannelBox" + QString::number(i + 1)); if (combobox) { if (channelNames.contains(combobox->currentText(), Qt::CaseInsensitive)) { @@ -1230,7 +1230,7 @@ bool ConfigMultiRotorWidget::throwConfigError(int numMotors) combobox->setToolTip(tr("Select output channel for Accessory%1 RcInput").arg(i)); } } - channelNames += combobox->currentText() == "None" ? "" : combobox->currentText(); + channelNames += (combobox->currentText() == "None") ? "" : combobox->currentText(); } }