diff --git a/ground/openpilotgcs/src/plugins/config/airframe_fixedwing.ui b/ground/openpilotgcs/src/plugins/config/airframe_fixedwing.ui
index 4786f9e40..01897f547 100644
--- a/ground/openpilotgcs/src/plugins/config/airframe_fixedwing.ui
+++ b/ground/openpilotgcs/src/plugins/config/airframe_fixedwing.ui
@@ -469,6 +469,12 @@ margin:1px;
-
+
+
+ 70
+ 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);
@@ -499,6 +505,12 @@ margin:1px;
-
+
+
+ 70
+ 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);
@@ -523,6 +535,12 @@ margin:1px;
-
+
+
+ 70
+ 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);
@@ -560,6 +578,12 @@ margin:1px;
-
+
+
+ 70
+ 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);
@@ -581,6 +605,12 @@ margin:1px;
-
+
+
+ 70
+ 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);
@@ -602,6 +632,12 @@ margin:1px;
-
+
+
+ 70
+ 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);
@@ -623,6 +659,12 @@ margin:1px;
-
+
+
+ 70
+ 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);
diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configfixedwingwidget.cpp b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configfixedwingwidget.cpp
index 948d99dfa..dae3f20d5 100644
--- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configfixedwingwidget.cpp
+++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configfixedwingwidget.cpp
@@ -2,7 +2,7 @@
******************************************************************************
*
* @file configfixedwidget.cpp
- * @author E. Lafargue & The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
+ * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2014.
* @addtogroup GCSPlugins GCS Plugins
* @{
* @addtogroup ConfigPlugin Config Plugin
@@ -36,40 +36,10 @@
#include
#include
#include
-#include
#include
#include
#include
-const QString ConfigFixedWingWidget::CHANNELBOXNAME = QString("fixedWingChannelBox");
-
-ConfigFixedWingWidget::ConfigFixedWingWidget(QWidget *parent) :
- VehicleConfig(parent), m_aircraft(new Ui_FixedWingConfigWidget()),
- plane(NULL)
-{
- m_aircraft->setupUi(this);
-
- plane = new QGraphicsSvgItem();
- populateChannelComboBoxes();
-
- QStringList fixedWingTypes;
- fixedWingTypes << "Aileron" << "Elevon";
- m_aircraft->fixedWingType->addItems(fixedWingTypes);
-
- // Set default model to "Aileron"
- m_aircraft->fixedWingType->setCurrentIndex(m_aircraft->fixedWingType->findText("Aileron"));
-
- setupUI(m_aircraft->fixedWingType->currentText());
-
- connect(m_aircraft->fixedWingType, SIGNAL(currentIndexChanged(QString)), this, SLOT(setupUI(QString)));
- updateEnableControls();
-}
-
-ConfigFixedWingWidget::~ConfigFixedWingWidget()
-{
- delete m_aircraft;
-}
-
QStringList ConfigFixedWingWidget::getChannelDescriptions()
{
// init a channel_numelem list of channel desc defaults
@@ -81,65 +51,72 @@ QStringList ConfigFixedWingWidget::getChannelDescriptions()
// get the gui config data
GUIConfigDataUnion configData = getConfigData();
- fixedGUISettingsStruct fixed = configData.fixedwing;
- if (fixed.FixedWingThrottle > 0 && fixed.FixedWingThrottle <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
- channelDesc[fixed.FixedWingThrottle - 1] = QString("WingThrottle");
+ if (configData.fixedwing.FixedWingPitch1 > 0) {
+ channelDesc[configData.fixedwing.FixedWingPitch1 - 1] = QString("FixedWingPitch1");
}
- if (fixed.FixedWingPitch1 > 0 && fixed.FixedWingPitch1 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
- channelDesc[fixed.FixedWingPitch1 - 1] = QString("FixedWingPitch1");
+ if (configData.fixedwing.FixedWingPitch2 > 0) {
+ channelDesc[configData.fixedwing.FixedWingPitch2 - 1] = QString("FixedWingPitch2");
}
- if (fixed.FixedWingPitch2 > 0 && fixed.FixedWingPitch2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
- channelDesc[fixed.FixedWingPitch2 - 1] = QString("FixedWingPitch2");
+ if (configData.fixedwing.FixedWingRoll1 > 0) {
+ channelDesc[configData.fixedwing.FixedWingRoll1 - 1] = QString("FixedWingRoll1");
}
- if (fixed.FixedWingRoll1 > 0 && fixed.FixedWingRoll1 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
- channelDesc[fixed.FixedWingRoll1 - 1] = QString("FixedWingRoll1");
+ if (configData.fixedwing.FixedWingRoll2 > 0) {
+ channelDesc[configData.fixedwing.FixedWingRoll2 - 1] = QString("FixedWingRoll2");
}
- if (fixed.FixedWingRoll2 > 0 && fixed.FixedWingRoll2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
- channelDesc[fixed.FixedWingRoll2 - 1] = QString("FixedWingRoll2");
+ if (configData.fixedwing.FixedWingYaw1 > 0) {
+ channelDesc[configData.fixedwing.FixedWingYaw1 - 1] = QString("FixedWingYaw1");
}
- if (fixed.FixedWingYaw1 > 0 && fixed.FixedWingYaw1 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
- channelDesc[fixed.FixedWingYaw1 - 1] = QString("FixedWingYaw1");
+ if (configData.fixedwing.FixedWingYaw2 > 0) {
+ channelDesc[configData.fixedwing.FixedWingYaw2 - 1] = QString("FixedWingYaw2");
}
- if (fixed.FixedWingYaw2 > 0 && fixed.FixedWingYaw2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
- channelDesc[fixed.FixedWingYaw2 - 1] = QString("FixedWingYaw2");
+ if (configData.fixedwing.FixedWingThrottle > 0) {
+ channelDesc[configData.fixedwing.FixedWingThrottle - 1] = QString("FixedWingThrottle");
}
return channelDesc;
}
-void ConfigFixedWingWidget::resetChannelboxesAndSliders()
+ConfigFixedWingWidget::ConfigFixedWingWidget(QWidget *parent) :
+ VehicleConfig(parent), m_aircraft(new Ui_FixedWingConfigWidget())
{
- m_aircraft->fwRudder1ChannelBox->setEnabled(false);
- m_aircraft->fwRudder2ChannelBox->setEnabled(false);
- m_aircraft->fwElevator1ChannelBox->setEnabled(false);
- m_aircraft->fwElevator2ChannelBox->setEnabled(false);
- m_aircraft->fwAileron1ChannelBox->setEnabled(false);
- m_aircraft->fwAileron2ChannelBox->setEnabled(false);
- m_aircraft->elevonSlider1->setEnabled(false);
- m_aircraft->elevonSlider2->setEnabled(false);
+ m_aircraft->setupUi(this);
+
+ planeimg = new QGraphicsSvgItem();
+
+ populateChannelComboBoxes();
+
+ QStringList fixedWingTypes;
+ fixedWingTypes << "Aileron" << "Elevon" << "Vtail";
+ m_aircraft->fixedWingType->addItems(fixedWingTypes);
+
+ // Set default model to "Aileron"
+ connect(m_aircraft->fixedWingType, SIGNAL(currentIndexChanged(QString)), this, SLOT(setupUI(QString)));
+ m_aircraft->fixedWingType->setCurrentIndex(m_aircraft->fixedWingType->findText("Aileron"));
+ setupUI(m_aircraft->fixedWingType->currentText());
}
+ConfigFixedWingWidget::~ConfigFixedWingWidget()
+{
+ delete m_aircraft;
+}
+
+/**
+ Virtual function to setup the UI
+ */
void ConfigFixedWingWidget::setupUI(QString frameType)
{
Q_ASSERT(m_aircraft);
- Q_ASSERT(plane);
- // This had to be moved from ConfigFixedWingWidget() here since m_aircraft->fixedWingType->currentText()
- // did not seem to work properly to choose alternate .svg files.
- m_aircraft->planeShape->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ m_aircraft->planeShape->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_aircraft->planeShape->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
QSvgRenderer *renderer = new QSvgRenderer();
renderer->load(QString(":/configgadget/images/fixedwing-shapes.svg"));
- plane = new QGraphicsSvgItem();
- plane->setSharedRenderer(renderer);
-
- qDebug() << "Current Aircraft type: \n" << m_aircraft->fixedWingType->currentText();
+ planeimg = new QGraphicsSvgItem();
+ planeimg->setSharedRenderer(renderer);
if (frameType == "FixedWing" || frameType == "Aileron") {
- plane->setElementId("aileron");
+ planeimg->setElementId("aileron");
setComboCurrentIndex(m_aircraft->fixedWingType, m_aircraft->fixedWingType->findText("Aileron"));
- resetChannelboxesAndSliders();
-
m_aircraft->fwRudder1ChannelBox->setEnabled(true);
m_aircraft->fwRudder2ChannelBox->setEnabled(true);
m_aircraft->fwElevator1ChannelBox->setEnabled(true);
@@ -152,59 +129,50 @@ void ConfigFixedWingWidget::setupUI(QString frameType)
m_aircraft->fwElevator1Label->setText("Elevator 1");
m_aircraft->fwElevator2Label->setText("Elevator 2");
- } else if (frameType == "FixedWingVtail" || frameType == "Vtail") {
- // do nothing for now
+ m_aircraft->elevonSlider1->setEnabled(false);
+ m_aircraft->elevonSlider2->setEnabled(false);
} else if (frameType == "FixedWingElevon" || frameType == "Elevon") {
- plane->setElementId("elevon");
+ planeimg->setElementId("elevon");
setComboCurrentIndex(m_aircraft->fixedWingType, m_aircraft->fixedWingType->findText("Elevon"));
- resetChannelboxesAndSliders();
-
- m_aircraft->fwElevator1Label->setText("Elevon 1");
- m_aircraft->fwElevator1ChannelBox->setEnabled(true);
-
- m_aircraft->fwElevator2Label->setText("Elevon 2");
- m_aircraft->fwElevator2ChannelBox->setEnabled(true);
-
- m_aircraft->fwAileron1Label->setText("Aileron 1");
- m_aircraft->fwAileron2Label->setText("Aileron 2");
+ m_aircraft->fwAileron1Label->setText("Elevon 1");
+ m_aircraft->fwAileron2Label->setText("Elevon 2");
+ m_aircraft->fwElevator1ChannelBox->setEnabled(false);
+ m_aircraft->fwElevator2ChannelBox->setEnabled(false);
+ m_aircraft->fwRudder1ChannelBox->setEnabled(true);
+ m_aircraft->fwRudder2ChannelBox->setEnabled(true);
+ m_aircraft->fwElevator1Label->setText("Elevator 1");
+ m_aircraft->fwElevator2Label->setText("Elevator 2");
m_aircraft->elevonLabel1->setText("Roll");
m_aircraft->elevonLabel2->setText("Pitch");
m_aircraft->elevonSlider1->setEnabled(true);
m_aircraft->elevonSlider2->setEnabled(true);
- }
+ } else if (frameType == "FixedWingVtail" || frameType == "Vtail") {
+ planeimg->setElementId("aileron");
+ setComboCurrentIndex(m_aircraft->fixedWingType, m_aircraft->fixedWingType->findText("Vtail"));
+ m_aircraft->fwRudder1ChannelBox->setEnabled(false);
+ m_aircraft->fwRudder2ChannelBox->setEnabled(false);
+ m_aircraft->fwElevator1Label->setText("Vtail 1");
+ m_aircraft->fwElevator1ChannelBox->setEnabled(true);
+
+ m_aircraft->fwElevator2Label->setText("Vtail 2");
+ m_aircraft->fwElevator2ChannelBox->setEnabled(true);
+
+ m_aircraft->fwAileron1Label->setText("Aileron 1");
+ m_aircraft->fwAileron2Label->setText("Aileron 2");
+ m_aircraft->elevonLabel1->setText("Rudd");
+ m_aircraft->elevonLabel2->setText("Pitch");
+
+ m_aircraft->elevonSlider1->setEnabled(true);
+ m_aircraft->elevonSlider2->setEnabled(true);
+ }
QGraphicsScene *scene = new QGraphicsScene();
- scene->addItem(plane);
- scene->setSceneRect(plane->boundingRect());
+ scene->addItem(planeimg);
+ scene->setSceneRect(planeimg->boundingRect());
m_aircraft->planeShape->setScene(scene);
- setupEnabledControls(frameType);
- // Draw the appropriate airframe
- updateAirframe(frameType);
-}
-
-void ConfigFixedWingWidget::setupEnabledControls(QString frameType)
-{
-
- // disable all motor channel boxes
- for (int i = 1; i <= 8; i++) {
- // do it manually so we can turn off any error decorations
- QComboBox *combobox = this->findChild("fixedWingChannelBox" + QString::number(i));
- if (combobox) {
- combobox->setEnabled(false);
- combobox->setItemData(0, 0, Qt::DecorationRole);
- }
- }
-
- if (frameType == "Vtail" || frameType == "vtail") {
- // enableComboBoxes(this, CHANNELBOXNAME, 3, true);
- } else if (frameType == "Elevon" || frameType == "Elevon") {
- enableComboBoxes(this, CHANNELBOXNAME, 3, true);
- } else if (frameType == "aileron" || frameType == "Aileron") {
- enableComboBoxes(this, CHANNELBOXNAME, 4, true);
- }
}
void ConfigFixedWingWidget::registerWidgets(ConfigTaskWidget &parent)
@@ -268,11 +236,13 @@ void ConfigFixedWingWidget::refreshWidgetsValues(QString frameType)
setComboCurrentIndex(m_aircraft->fwAileron2ChannelBox, fixed.FixedWingRoll2);
setComboCurrentIndex(m_aircraft->fwElevator1ChannelBox, fixed.FixedWingPitch1);
setComboCurrentIndex(m_aircraft->fwElevator2ChannelBox, fixed.FixedWingPitch2);
+ setComboCurrentIndex(m_aircraft->fwRudder1ChannelBox, fixed.FixedWingYaw1);
+ setComboCurrentIndex(m_aircraft->fwRudder2ChannelBox, fixed.FixedWingYaw2);
if (frameType == "FixedWingElevon") {
// If the airframe is elevon, restore the slider setting
// Find the channel number for Elevon1 (FixedWingRoll1)
- int channel = m_aircraft->fwElevator1ChannelBox->currentIndex() - 1;
+ int channel = m_aircraft->fwAileron1ChannelBox->currentIndex() - 1;
if (channel > -1) {
// If for some reason the actuators were incoherent, we might fail here, hence the check.
m_aircraft->elevonSlider1->setValue(
@@ -280,114 +250,49 @@ void ConfigFixedWingWidget::refreshWidgetsValues(QString frameType)
m_aircraft->elevonSlider2->setValue(
getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH) * 100);
}
+ } else if (frameType == "FixedWingVtail") {
+ int channel = m_aircraft->fwElevator1ChannelBox->currentIndex() - 1;
+ if (channel > -1) {
+ // If for some reason the actuators were incoherent, we might fail here, hence the check.
+ m_aircraft->elevonSlider1->setValue(
+ getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW) * 100);
+ m_aircraft->elevonSlider2->setValue(
+ getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH) * 100);
+ }
}
-
- updateAirframe(frameType);
}
/**
- Helper function to update the UI widget objects
+ Virtual function to update the UI widget objects
*/
QString ConfigFixedWingWidget::updateConfigObjectsFromWidgets()
{
+ QString airframeType = "FixedWing";
+
+ // Save the curve (common to all Fixed wing frames)
UAVDataObject *mixer = dynamic_cast(getObjectManager()->getObject(QString("MixerSettings")));
Q_ASSERT(mixer);
- // Curve is also common to all quads:
- setThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, m_aircraft->fixedWingThrottle->getCurve());
-
- QString airframeType;
- QList motor_servo_List;
-
- if (m_aircraft->fixedWingType->currentText() == "Aileron") {
- airframeType = "FixedWing";
- setupFrameFixedWing(airframeType);
-
- motor_servo_List << "FixedWingThrottle" << "FixedWingPitch1" << "FixedWingPitch2" << "FixedWingRoll1" << "FixedWingRoll2" << "FixedWingYaw1" << "FixedWingYaw2";
- setupMotors(motor_servo_List);
-
- GUIConfigDataUnion config = getConfigData();
- setConfigData(config);
-
- m_aircraft->fwStatusLabel->setText(tr("Configuration OK"));
-
- }
- else if (m_aircraft->fixedWingType->currentText() == "elevon") {
- airframeType = "FixedWingElevon";
- setupFrameElevon(airframeType);
-
- motor_servo_List << "FixedWingThrottle" << "FixedWingRoll1" << "FixedWingRoll2";
- setupMotors(motor_servo_List);
-
- GUIConfigDataUnion config = getConfigData();
- setConfigData(config);
-
- // Elevon Layout:
- // pitch roll yaw
- double mixerMatrix[8][3] = {
- { 0, 0, 0 },
- { 1, -1, 0 },
- { -1, 1, 0 },
- { 0, 0, 0 },
- { 0, 0, 0 },
- { 0, 0, 0 },
- { 0, 0, 0 },
- { 0, 0, 0 }
- };
- setupFixedWingElevonMixer(mixerMatrix);
-
- m_aircraft->fwStatusLabel->setText(tr("Configuration OK"));
-
- }
-
// Remove Feed Forward, it is pointless on a plane:
setMixerValue(mixer, "FeedForward", 0.0);
- return airframeType;
-}
+ // Set the throttle curve
+ setThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, m_aircraft->fixedWingThrottle->getCurve());
-void ConfigFixedWingWidget::setupMotors(QList motorList)
-{
- QList mmList;
- mmList << m_aircraft->fwEngineChannelBox << m_aircraft->fwAileron1ChannelBox
- << m_aircraft->fwAileron2ChannelBox << m_aircraft->fwElevator1ChannelBox
- << m_aircraft->fwElevator2ChannelBox << m_aircraft->fwRudder1ChannelBox
- << m_aircraft->fwRudder2ChannelBox;
-
- GUIConfigDataUnion configData = getConfigData();
- resetActuators(&configData);
-
- foreach(QString motor, motorList) {
- int index = mmList.takeFirst()->currentIndex();
-
- if (motor == QString("FixedWingThrottle")) {
- configData.fixedwing.FixedWingThrottle = index;
- } else if (motor == QString("FixedWingPitch1")) {
- configData.fixedwing.FixedWingPitch1 = index;
- } else if (motor == QString("FixedWingPitch2")) {
- configData.fixedwing.FixedWingPitch2 = index;
- } else if (motor == QString("FixedWingRoll1")) {
- configData.fixedwing.FixedWingRoll1 = index;
- } else if (motor == QString("FixedWingRoll2")) {
- configData.fixedwing.FixedWingRoll2 = index;
- } else if (motor == QString("FixedWingYaw1")) {
- configData.fixedwing.FixedWingYaw1 = index;
- } else if (motor == QString("FixedWingYaw2")) {
- configData.fixedwing.FixedWingYaw1 = index;
- }
+ // All airframe types must start with "FixedWing"
+ if (m_aircraft->fixedWingType->currentText() == "Aileron") {
+ airframeType = "FixedWing";
+ setupFrameFixedWing(airframeType);
+ } else if (m_aircraft->fixedWingType->currentText() == "Elevon") {
+ airframeType = "FixedWingElevon";
+ setupFrameElevon(airframeType);
+ } else { // "Vtail"
+ airframeType = "FixedWingVtail";
+ setupFrameVtail(airframeType);
}
- setConfigData(configData);
-}
-void ConfigFixedWingWidget::updateAirframe(QString frameType)
-{
- qDebug() << "ConfigFixedWingWidget::updateAirframe - frame type" << frameType;
-
- // this is not doing anything right now
-
- m_aircraft->planeShape->setSceneRect(plane->boundingRect());
- m_aircraft->planeShape->fitInView(plane, Qt::KeepAspectRatio);
+ return airframeType;
}
/**
@@ -414,7 +319,6 @@ bool ConfigFixedWingWidget::setupFrameFixedWing(QString airframeType)
config.fixedwing.FixedWingRoll1 = m_aircraft->fwAileron1ChannelBox->currentIndex();
config.fixedwing.FixedWingRoll2 = m_aircraft->fwAileron2ChannelBox->currentIndex();
config.fixedwing.FixedWingYaw1 = m_aircraft->fwRudder1ChannelBox->currentIndex();
- config.fixedwing.FixedWingYaw2 = m_aircraft->fwRudder2ChannelBox->currentIndex();
config.fixedwing.FixedWingThrottle = m_aircraft->fwEngineChannelBox->currentIndex();
setConfigData(config);
@@ -480,8 +384,78 @@ bool ConfigFixedWingWidget::setupFrameElevon(QString airframeType)
GUIConfigDataUnion config = getConfigData();
resetActuators(&config);
+ config.fixedwing.FixedWingRoll1 = m_aircraft->fwAileron1ChannelBox->currentIndex();
+ config.fixedwing.FixedWingRoll2 = m_aircraft->fwAileron2ChannelBox->currentIndex();
+ config.fixedwing.FixedWingYaw1 = m_aircraft->fwRudder1ChannelBox->currentIndex();
+ config.fixedwing.FixedWingYaw2 = m_aircraft->fwRudder2ChannelBox->currentIndex();
+ config.fixedwing.FixedWingThrottle = m_aircraft->fwEngineChannelBox->currentIndex();
+
+ setConfigData(config);
+
+ UAVDataObject *mixer = dynamic_cast(getObjectManager()->getObject(QString("MixerSettings")));
+ Q_ASSERT(mixer);
+ resetMotorAndServoMixers(mixer);
+
+ // Save the curve:
+ // ... and compute the matrix:
+ // In order to make code a bit nicer, we assume:
+ // - Channel dropdowns start with 'None', then 0 to 7
+
+ // 1. Assign the servo/motor/none for each channel
+
+ double value;
+
+ // motor
+ int channel = m_aircraft->fwEngineChannelBox->currentIndex() - 1;
+ setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_MOTOR);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
+
+ // rudders
+ channel = m_aircraft->fwRudder1ChannelBox->currentIndex() - 1;
+ setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, 127);
+
+ channel = m_aircraft->fwRudder2ChannelBox->currentIndex() - 1;
+ setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, -127);
+
+ // ailerons
+ channel = m_aircraft->fwAileron1ChannelBox->currentIndex() - 1;
+ if (channel > -1) {
+ setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
+ value = (double)(m_aircraft->elevonSlider2->value() * 1.27);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, value);
+ value = (double)(m_aircraft->elevonSlider1->value() * 1.27);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, value);
+
+ channel = m_aircraft->fwAileron2ChannelBox->currentIndex() - 1;
+ setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
+ value = (double)(m_aircraft->elevonSlider2->value() * 1.27);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, value);
+ value = (double)(m_aircraft->elevonSlider1->value() * 1.27);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, -value);
+ }
+
+ m_aircraft->fwStatusLabel->setText("Mixer generated");
+ return true;
+}
+
+/**
+ Setup VTail
+ */
+bool ConfigFixedWingWidget::setupFrameVtail(QString airframeType)
+{
+ // Check coherence:
+ // Show any config errors in GUI
+ if (throwConfigError(airframeType)) {
+ return false;
+ }
+
+ GUIConfigDataUnion config = getConfigData();
+ resetActuators(&config);
+
config.fixedwing.FixedWingPitch1 = m_aircraft->fwElevator1ChannelBox->currentIndex();
- config.fixedwing.FixedWingPitch2 = m_aircraft->fwElevator2ChannelBox->currentIndex();
+ config.fixedwing.FixedWingPitch2 = m_aircraft->fwElevator2ChannelBox->currentIndex();
config.fixedwing.FixedWingRoll1 = m_aircraft->fwAileron1ChannelBox->currentIndex();
config.fixedwing.FixedWingRoll2 = m_aircraft->fwAileron2ChannelBox->currentIndex();
config.fixedwing.FixedWingThrottle = m_aircraft->fwEngineChannelBox->currentIndex();
@@ -504,76 +478,54 @@ bool ConfigFixedWingWidget::setupFrameElevon(QString airframeType)
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_MOTOR);
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
+ // rudders
+ channel = m_aircraft->fwRudder1ChannelBox->currentIndex() - 1;
+ setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, 127);
+
+ channel = m_aircraft->fwRudder2ChannelBox->currentIndex() - 1;
+ setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, -127);
+
// ailerons
channel = m_aircraft->fwAileron1ChannelBox->currentIndex() - 1;
if (channel > -1) {
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
- setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, 127);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, 127);
channel = m_aircraft->fwAileron2ChannelBox->currentIndex() - 1;
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
- setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, -127);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, -127);
}
- // elevon
+ // vtail
channel = m_aircraft->fwElevator1ChannelBox->currentIndex() - 1;
if (channel > -1) {
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
- setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, 127);
+ double value = (double)(m_aircraft->elevonSlider2->value() * 1.27);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, value);
+ value = (double)(m_aircraft->elevonSlider1->value() * 1.27);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, value);
channel = m_aircraft->fwElevator2ChannelBox->currentIndex() - 1;
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
- setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, -127);
+ value = (double)(m_aircraft->elevonSlider2->value() * 1.27);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, value);
+ value = (double)(m_aircraft->elevonSlider1->value() * 1.27);
+ setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW, -value);
}
m_aircraft->fwStatusLabel->setText("Mixer generated");
return true;
-
-
}
-/**
- Helper function: setupElevonServo
- */
-void ConfigFixedWingWidget::setupElevonServo(int channel, double pitch, double roll)
+void ConfigFixedWingWidget::enableControls(bool enable)
{
- UAVDataObject *mixer = dynamic_cast(getObjectManager()->getObject(QString("MixerSettings")));
+ ConfigTaskWidget::enableControls(enable);
- Q_ASSERT(mixer);
-
- setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_SERVO);
-
- setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL, roll * 127);
- setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH, pitch * 127);
-}
-
-/**
- This function sets up the elevon fixed wing mixer values.
- */
-bool ConfigFixedWingWidget::setupFixedWingElevonMixer(double mixerFactors[8][3]){
- UAVDataObject *mixer = dynamic_cast(getObjectManager()->getObject(QString("MixerSettings")));
-
- Q_ASSERT(mixer);
- resetMotorAndServoMixers(mixer);
-
- // and enable only the relevant channels:
- double pFactor = (double)m_aircraft->elevonSlider1->value() / 100.0;
- double rFactor = (double)m_aircraft->elevonSlider2->value() / 100.0;
-
- QList mmList;
- mmList << m_aircraft->fwEngineChannelBox << m_aircraft->fwAileron1ChannelBox
- << m_aircraft->fwAileron2ChannelBox << m_aircraft->fwElevator1ChannelBox
- << m_aircraft->fwElevator2ChannelBox;
-
- for (int i = 0; i < 8; i++) {
- if (mmList.at(i)->isEnabled()) {
- int channel = mmList.at(i)->currentIndex() - 1;
- if (channel > -1) {
- setupElevonServo(channel, mixerFactors[i][0] * pFactor, rFactor * mixerFactors[i][1]);
- }
- }
+ if (enable) {
+ setupUI(m_aircraft->fixedWingType->currentText());
}
- return true;
}
/**
@@ -616,7 +568,27 @@ bool ConfigFixedWingWidget::throwConfigError(QString airframeType)
m_aircraft->fwRudder1ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
}
} else if (airframeType == "FixedWingElevon") {
-/*
+ if (m_aircraft->fwEngineChannelBox->currentText() == "None") {
+ m_aircraft->fwEngineChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
+ error = true;
+ } else {
+ m_aircraft->fwEngineChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
+ }
+
+ if (m_aircraft->fwAileron1ChannelBox->currentText() == "None") {
+ m_aircraft->fwAileron1ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
+ error = true;
+ } else {
+ m_aircraft->fwAileron1ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
+ }
+
+ if (m_aircraft->fwAileron2ChannelBox->currentText() == "None") {
+ m_aircraft->fwAileron2ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
+ error = true;
+ } else {
+ m_aircraft->fwAileron2ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
+ }
+ } else if (airframeType == "FixedWingVtail") {
if (m_aircraft->fwEngineChannelBox->currentText() == "None") {
m_aircraft->fwEngineChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
error = true;
@@ -635,9 +607,8 @@ bool ConfigFixedWingWidget::throwConfigError(QString airframeType)
m_aircraft->fwElevator2ChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
error = true;
} else {
- m_aircraft->fwElevator2ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
+ m_aircraft->fwElevator2ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
}
-*/
}
if (error) {
@@ -646,30 +617,3 @@ bool ConfigFixedWingWidget::throwConfigError(QString airframeType)
return error;
}
-
-void ConfigFixedWingWidget::showEvent(QShowEvent *event)
-{
- Q_UNUSED(event)
- Q_ASSERT(plane);
- m_aircraft->planeShape->fitInView(plane, Qt::KeepAspectRatio);
-}
-
-/**
- Resize the GUI contents when the user changes the window size
- */
-void ConfigFixedWingWidget::resizeEvent(QResizeEvent *event)
-{
- Q_UNUSED(event);
- Q_ASSERT(plane);
- m_aircraft->planeShape->fitInView(plane, Qt::KeepAspectRatio);
-}
-
-void ConfigFixedWingWidget::enableControls(bool enable)
-{
- ConfigTaskWidget::enableControls(enable);
-
- if (enable) {
- setupEnabledControls(m_aircraft->fixedWingType->currentText());
- }
-}
-
diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configfixedwingwidget.h b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configfixedwingwidget.h
index 295be3b4c..f749d4ae0 100644
--- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configfixedwingwidget.h
+++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configfixedwingwidget.h
@@ -44,7 +44,6 @@ class ConfigFixedWingWidget : public VehicleConfig {
Q_OBJECT
public:
- static const QString CHANNELBOXNAME;
static QStringList getChannelDescriptions();
ConfigFixedWingWidget(QWidget *parent = 0);
@@ -53,29 +52,20 @@ public:
virtual void refreshWidgetsValues(QString frameType);
virtual QString updateConfigObjectsFromWidgets();
- void resetChannelboxesAndSliders();
-protected:
- void showEvent(QShowEvent *event);
- void resizeEvent(QResizeEvent *event);
- void enableControls(bool enable);
-
private:
Ui_FixedWingConfigWidget *m_aircraft;
- QGraphicsSvgItem *plane;
+ QGraphicsSvgItem *planeimg;
virtual void registerWidgets(ConfigTaskWidget &parent);
virtual void resetActuators(GUIConfigDataUnion *configData);
bool setupFrameFixedWing(QString airframeType);
- bool setupFrameVtail(QString airframeType);
bool setupFrameElevon(QString airframeType);
- bool setupFixedWingMixer(double mixerFactors[8][3]);
- bool setupFixedWingElevonMixer(double mixerFactors[8][3]);
- void setupMotors(QList motorList);
- void setupElevonServo(int channel, double roll, double pitch);
+ bool setupFrameVtail(QString airframeType);
+
+protected:
+ void enableControls(bool enable);
- void updateAirframe(QString multiRotorType);
- void setupEnabledControls(QString airframeType);
private slots:
virtual void setupUI(QString airframeType);
virtual bool throwConfigError(QString airframeType);