mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-04 12:24:11 +01:00
Merge remote-tracking branch 'origin/kfinisterre/FixedWingWizard' into thread/OP-1222_Fixed_Wing_Wizard_Support
Conflicts: ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configfixedwingwidget.h ground/openpilotgcs/src/plugins/config/configvehicletypewidget.cpp
This commit is contained in:
commit
f8e6e8c183
@ -37,6 +37,14 @@
|
|||||||
<string>Airplane type:</string>
|
<string>Airplane type:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QGraphicsView" name="planeShape">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="fixedWingType"/>
|
<widget class="QComboBox" name="fixedWingType"/>
|
||||||
|
@ -36,10 +36,13 @@
|
|||||||
#include <QTextEdit>
|
#include <QTextEdit>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
|
#include <QComboBox>
|
||||||
#include <QBrush>
|
#include <QBrush>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
const QString ConfigFixedWingWidget::CHANNELBOXNAME = QString("fixedWingChannelBox");
|
||||||
|
|
||||||
QStringList ConfigFixedWingWidget::getChannelDescriptions()
|
QStringList ConfigFixedWingWidget::getChannelDescriptions()
|
||||||
{
|
{
|
||||||
// init a channel_numelem list of channel desc defaults
|
// init a channel_numelem list of channel desc defaults
|
||||||
@ -51,27 +54,28 @@ QStringList ConfigFixedWingWidget::getChannelDescriptions()
|
|||||||
|
|
||||||
// get the gui config data
|
// get the gui config data
|
||||||
GUIConfigDataUnion configData = getConfigData();
|
GUIConfigDataUnion configData = getConfigData();
|
||||||
|
fixedGUISettingsStruct fixed = configData.fixedwing;
|
||||||
|
|
||||||
if (configData.fixedwing.FixedWingPitch1 > 0) {
|
if (fixed.FixedWingThrottle > 0 && fixed.FixedWingThrottle <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
|
||||||
channelDesc[configData.fixedwing.FixedWingPitch1 - 1] = QString("FixedWingPitch1");
|
channelDesc[fixed.FixedWingThrottle - 1] = QString("WingThrottle");
|
||||||
}
|
}
|
||||||
if (configData.fixedwing.FixedWingPitch2 > 0) {
|
if (fixed.FixedWingPitch1 > 0 && fixed.FixedWingPitch1 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
|
||||||
channelDesc[configData.fixedwing.FixedWingPitch2 - 1] = QString("FixedWingPitch2");
|
channelDesc[fixed.FixedWingPitch1 - 1] = QString("FixedWingPitch1");
|
||||||
}
|
}
|
||||||
if (configData.fixedwing.FixedWingRoll1 > 0) {
|
if (fixed.FixedWingPitch2 > 0 && fixed.FixedWingPitch2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
|
||||||
channelDesc[configData.fixedwing.FixedWingRoll1 - 1] = QString("FixedWingRoll1");
|
channelDesc[fixed.FixedWingPitch2 - 1] = QString("FixedWingPitch2");
|
||||||
}
|
}
|
||||||
if (configData.fixedwing.FixedWingRoll2 > 0) {
|
if (fixed.FixedWingRoll1 > 0 && fixed.FixedWingRoll1 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
|
||||||
channelDesc[configData.fixedwing.FixedWingRoll2 - 1] = QString("FixedWingRoll2");
|
channelDesc[fixed.FixedWingRoll1 - 1] = QString("FixedWingRoll1");
|
||||||
}
|
}
|
||||||
if (configData.fixedwing.FixedWingYaw1 > 0) {
|
if (fixed.FixedWingRoll2 > 0 && fixed.FixedWingRoll2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
|
||||||
channelDesc[configData.fixedwing.FixedWingYaw1 - 1] = QString("FixedWingYaw1");
|
channelDesc[fixed.FixedWingRoll2 - 1] = QString("FixedWingRoll2");
|
||||||
}
|
}
|
||||||
if (configData.fixedwing.FixedWingYaw2 > 0) {
|
if (fixed.FixedWingYaw1 > 0 && fixed.FixedWingYaw1 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
|
||||||
channelDesc[configData.fixedwing.FixedWingYaw2 - 1] = QString("FixedWingYaw2");
|
channelDesc[fixed.FixedWingYaw1 - 1] = QString("FixedWingYaw1");
|
||||||
}
|
}
|
||||||
if (configData.fixedwing.FixedWingThrottle > 0) {
|
if (fixed.FixedWingYaw2 > 0 && fixed.FixedWingYaw2 <= ConfigFixedWingWidget::CHANNEL_NUMELEM) {
|
||||||
channelDesc[configData.fixedwing.FixedWingThrottle - 1] = QString("FixedWingThrottle");
|
channelDesc[fixed.FixedWingYaw2 - 1] = QString("FixedWingYaw2");
|
||||||
}
|
}
|
||||||
return channelDesc;
|
return channelDesc;
|
||||||
}
|
}
|
||||||
@ -84,13 +88,16 @@ ConfigFixedWingWidget::ConfigFixedWingWidget(QWidget *parent) :
|
|||||||
populateChannelComboBoxes();
|
populateChannelComboBoxes();
|
||||||
|
|
||||||
QStringList fixedWingTypes;
|
QStringList fixedWingTypes;
|
||||||
fixedWingTypes << "Elevator aileron rudder" << "Elevon" << "Vtail";
|
fixedWingTypes << "Elevator aileron rudder" << "Vtail";
|
||||||
m_aircraft->fixedWingType->addItems(fixedWingTypes);
|
m_aircraft->fixedWingType->addItems(fixedWingTypes);
|
||||||
|
|
||||||
// Set default model to "Elevator aileron rudder"
|
// Set default model to "Elevator aileron rudder"
|
||||||
connect(m_aircraft->fixedWingType, SIGNAL(currentIndexChanged(QString)), this, SLOT(setupUI(QString)));
|
|
||||||
m_aircraft->fixedWingType->setCurrentIndex(m_aircraft->fixedWingType->findText("Elevator aileron rudder"));
|
m_aircraft->fixedWingType->setCurrentIndex(m_aircraft->fixedWingType->findText("Elevator aileron rudder"));
|
||||||
setupUI(m_aircraft->fixedWingType->currentText());
|
|
||||||
|
// setupUI(m_aircraft->fixedWingType->currentText());
|
||||||
|
|
||||||
|
connect(m_aircraft->fixedWingType, SIGNAL(currentIndexChanged(QString)), this, SLOT(setupUI(QString)));
|
||||||
|
updateEnableControls();
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigFixedWingWidget::~ConfigFixedWingWidget()
|
ConfigFixedWingWidget::~ConfigFixedWingWidget()
|
||||||
@ -98,14 +105,24 @@ ConfigFixedWingWidget::~ConfigFixedWingWidget()
|
|||||||
delete m_aircraft;
|
delete m_aircraft;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Virtual function to setup the UI
|
|
||||||
*/
|
|
||||||
void ConfigFixedWingWidget::setupUI(QString frameType)
|
void ConfigFixedWingWidget::setupUI(QString frameType)
|
||||||
{
|
{
|
||||||
Q_ASSERT(m_aircraft);
|
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->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();
|
||||||
|
|
||||||
if (frameType == "FixedWing" || frameType == "Elevator aileron rudder") {
|
if (frameType == "FixedWing" || frameType == "Elevator aileron rudder") {
|
||||||
|
plane->setElementId("aileron");
|
||||||
setComboCurrentIndex(m_aircraft->fixedWingType, m_aircraft->fixedWingType->findText("Elevator aileron rudder"));
|
setComboCurrentIndex(m_aircraft->fixedWingType, m_aircraft->fixedWingType->findText("Elevator aileron rudder"));
|
||||||
m_aircraft->fwRudder1ChannelBox->setEnabled(true);
|
m_aircraft->fwRudder1ChannelBox->setEnabled(true);
|
||||||
m_aircraft->fwRudder2ChannelBox->setEnabled(true);
|
m_aircraft->fwRudder2ChannelBox->setEnabled(true);
|
||||||
@ -121,23 +138,8 @@ void ConfigFixedWingWidget::setupUI(QString frameType)
|
|||||||
|
|
||||||
m_aircraft->elevonSlider1->setEnabled(false);
|
m_aircraft->elevonSlider1->setEnabled(false);
|
||||||
m_aircraft->elevonSlider2->setEnabled(false);
|
m_aircraft->elevonSlider2->setEnabled(false);
|
||||||
} else if (frameType == "FixedWingElevon" || frameType == "Elevon") {
|
|
||||||
setComboCurrentIndex(m_aircraft->fixedWingType, m_aircraft->fixedWingType->findText("Elevon"));
|
|
||||||
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") {
|
} else if (frameType == "FixedWingVtail" || frameType == "Vtail") {
|
||||||
|
plane->setElementId("vtail");
|
||||||
setComboCurrentIndex(m_aircraft->fixedWingType, m_aircraft->fixedWingType->findText("Vtail"));
|
setComboCurrentIndex(m_aircraft->fixedWingType, m_aircraft->fixedWingType->findText("Vtail"));
|
||||||
m_aircraft->fwRudder1ChannelBox->setEnabled(false);
|
m_aircraft->fwRudder1ChannelBox->setEnabled(false);
|
||||||
m_aircraft->fwRudder2ChannelBox->setEnabled(false);
|
m_aircraft->fwRudder2ChannelBox->setEnabled(false);
|
||||||
@ -156,6 +158,35 @@ void ConfigFixedWingWidget::setupUI(QString frameType)
|
|||||||
m_aircraft->elevonSlider1->setEnabled(true);
|
m_aircraft->elevonSlider1->setEnabled(true);
|
||||||
m_aircraft->elevonSlider2->setEnabled(true);
|
m_aircraft->elevonSlider2->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QGraphicsScene *scene = new QGraphicsScene();
|
||||||
|
scene->addItem(plane);
|
||||||
|
scene->setSceneRect(plane->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<QComboBox *>("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 == "aileron" || frameType == "Elevator aileron rudder") {
|
||||||
|
enableComboBoxes(this, CHANNELBOXNAME, 4, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigFixedWingWidget::registerWidgets(ConfigTaskWidget &parent)
|
void ConfigFixedWingWidget::registerWidgets(ConfigTaskWidget &parent)
|
||||||
@ -222,18 +253,9 @@ void ConfigFixedWingWidget::refreshWidgetsValues(QString frameType)
|
|||||||
setComboCurrentIndex(m_aircraft->fwRudder1ChannelBox, fixed.FixedWingYaw1);
|
setComboCurrentIndex(m_aircraft->fwRudder1ChannelBox, fixed.FixedWingYaw1);
|
||||||
setComboCurrentIndex(m_aircraft->fwRudder2ChannelBox, fixed.FixedWingYaw2);
|
setComboCurrentIndex(m_aircraft->fwRudder2ChannelBox, fixed.FixedWingYaw2);
|
||||||
|
|
||||||
if (frameType == "FixedWingElevon") {
|
if (frameType == "FixedWingVtail") {
|
||||||
// If the airframe is elevon, restore the slider setting
|
// If the airframe is vtail, restore the slider setting
|
||||||
// Find the channel number for Elevon1 (FixedWingRoll1)
|
// Find the channel number for Elevon1 (FixedWingRoll1)
|
||||||
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(
|
|
||||||
getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_ROLL) * 100);
|
|
||||||
m_aircraft->elevonSlider2->setValue(
|
|
||||||
getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH) * 100);
|
|
||||||
}
|
|
||||||
} else if (frameType == "FixedWingVtail") {
|
|
||||||
int channel = m_aircraft->fwElevator1ChannelBox->currentIndex() - 1;
|
int channel = m_aircraft->fwElevator1ChannelBox->currentIndex() - 1;
|
||||||
if (channel > -1) {
|
if (channel > -1) {
|
||||||
// If for some reason the actuators were incoherent, we might fail here, hence the check.
|
// If for some reason the actuators were incoherent, we might fail here, hence the check.
|
||||||
@ -243,41 +265,115 @@ void ConfigFixedWingWidget::refreshWidgetsValues(QString frameType)
|
|||||||
getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH) * 100);
|
getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_PITCH) * 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateAirframe(frameType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Virtual function to update the UI widget objects
|
Helper function to update the UI widget objects
|
||||||
*/
|
*/
|
||||||
QString ConfigFixedWingWidget::updateConfigObjectsFromWidgets()
|
QString ConfigFixedWingWidget::updateConfigObjectsFromWidgets()
|
||||||
{
|
{
|
||||||
QString airframeType = "FixedWing";
|
|
||||||
|
|
||||||
// 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(QString("MixerSettings")));
|
||||||
|
|
||||||
Q_ASSERT(mixer);
|
Q_ASSERT(mixer);
|
||||||
|
|
||||||
// Remove Feed Forward, it is pointless on a plane:
|
// Curve is also common to all quads:
|
||||||
setMixerValue(mixer, "FeedForward", 0.0);
|
|
||||||
|
|
||||||
// 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 airframeType;
|
||||||
|
QList<QString> motor_servo_List;
|
||||||
|
|
||||||
if (m_aircraft->fixedWingType->currentText() == "Elevator aileron rudder") {
|
if (m_aircraft->fixedWingType->currentText() == "Elevator aileron rudder") {
|
||||||
airframeType = "FixedWing";
|
airframeType = "FixedWing";
|
||||||
setupFrameFixedWing(airframeType);
|
setupFrameFixedWing(airframeType);
|
||||||
} else if (m_aircraft->fixedWingType->currentText() == "Elevon") {
|
|
||||||
airframeType = "FixedWingElevon";
|
motor_servo_List << "FixedWingThrottle" << "FixedWingPitch1" << "FixedWingPitch2" << "FixedWingRoll1" << "FixedWingRoll2" << "FixedWingYaw1" << "FixedWingYaw2";
|
||||||
setupFrameElevon(airframeType);
|
setupMotors(motor_servo_List);
|
||||||
} else { // "Vtail"
|
|
||||||
|
GUIConfigDataUnion config = getConfigData();
|
||||||
|
setConfigData(config);
|
||||||
|
|
||||||
|
m_aircraft->fwStatusLabel->setText(tr("Configuration OK"));
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (m_aircraft->fixedWingType->currentText() == "vtail") {
|
||||||
airframeType = "FixedWingVtail";
|
airframeType = "FixedWingVtail";
|
||||||
setupFrameVtail(airframeType);
|
setupFrameVtail(airframeType);
|
||||||
|
|
||||||
|
motor_servo_List << "FixedWingThrottle" << "FixedWingRoll1" << "FixedWingRoll2";
|
||||||
|
setupMotors(motor_servo_List);
|
||||||
|
|
||||||
|
GUIConfigDataUnion config = getConfigData();
|
||||||
|
setConfigData(config);
|
||||||
|
|
||||||
|
// Vtail Layout:
|
||||||
|
// pitch roll yaw
|
||||||
|
double mixerMatrix[8][3] = {
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
{ 0, 0, 0 },
|
||||||
|
{ 0, 0, 0 }
|
||||||
|
};
|
||||||
|
setupFixedWingMixer(mixerMatrix);
|
||||||
|
|
||||||
|
m_aircraft->fwStatusLabel->setText(tr("Configuration OK"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove Feed Forward, it is pointless on a plane:
|
||||||
|
setMixerValue(mixer, "FeedForward", 0.0);
|
||||||
|
|
||||||
return airframeType;
|
return airframeType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConfigFixedWingWidget::setupMotors(QList<QString> motorList)
|
||||||
|
{
|
||||||
|
QList<QComboBox *> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Setup Elevator/Aileron/Rudder airframe.
|
Setup Elevator/Aileron/Rudder airframe.
|
||||||
|
|
||||||
@ -302,6 +398,7 @@ bool ConfigFixedWingWidget::setupFrameFixedWing(QString airframeType)
|
|||||||
config.fixedwing.FixedWingRoll1 = m_aircraft->fwAileron1ChannelBox->currentIndex();
|
config.fixedwing.FixedWingRoll1 = m_aircraft->fwAileron1ChannelBox->currentIndex();
|
||||||
config.fixedwing.FixedWingRoll2 = m_aircraft->fwAileron2ChannelBox->currentIndex();
|
config.fixedwing.FixedWingRoll2 = m_aircraft->fwAileron2ChannelBox->currentIndex();
|
||||||
config.fixedwing.FixedWingYaw1 = m_aircraft->fwRudder1ChannelBox->currentIndex();
|
config.fixedwing.FixedWingYaw1 = m_aircraft->fwRudder1ChannelBox->currentIndex();
|
||||||
|
config.fixedwing.FixedWingYaw2 = m_aircraft->fwRudder2ChannelBox->currentIndex();
|
||||||
config.fixedwing.FixedWingThrottle = m_aircraft->fwEngineChannelBox->currentIndex();
|
config.fixedwing.FixedWingThrottle = m_aircraft->fwEngineChannelBox->currentIndex();
|
||||||
|
|
||||||
setConfigData(config);
|
setConfigData(config);
|
||||||
@ -353,76 +450,6 @@ bool ConfigFixedWingWidget::setupFrameFixedWing(QString airframeType)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Setup Elevon
|
|
||||||
*/
|
|
||||||
bool ConfigFixedWingWidget::setupFrameElevon(QString airframeType)
|
|
||||||
{
|
|
||||||
// Check coherence:
|
|
||||||
// Show any config errors in GUI
|
|
||||||
if (throwConfigError(airframeType)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
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<UAVDataObject *>(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
|
Setup VTail
|
||||||
*/
|
*/
|
||||||
@ -502,13 +529,39 @@ bool ConfigFixedWingWidget::setupFrameVtail(QString airframeType)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigFixedWingWidget::enableControls(bool enable)
|
/**
|
||||||
|
This function sets up the vtail fixed wing mixer values.
|
||||||
|
*/
|
||||||
|
bool ConfigFixedWingWidget::setupFixedWingMixer(double mixerFactors[8][3])
|
||||||
{
|
{
|
||||||
ConfigTaskWidget::enableControls(enable);
|
UAVDataObject *mixer = dynamic_cast<UAVDataObject *>(getObjectManager()->getObject(QString("MixerSettings")));
|
||||||
|
|
||||||
if (enable) {
|
Q_ASSERT(mixer);
|
||||||
setupUI(m_aircraft->fixedWingType->currentText());
|
resetMotorAndServoMixers(mixer);
|
||||||
|
|
||||||
|
// and enable only the relevant channels:
|
||||||
|
// double pFactor = (double)m_aircraft->fwPitchMixLevel->value() / 100.0;
|
||||||
|
// double rFactor = (double)m_aircraft->fwRollMixLevel->value() / 100.0;
|
||||||
|
//invertMotors = m_aircraft->MultirotorRevMixerCheckBox->isChecked();
|
||||||
|
// double yFactor = (double)m_aircraft->fwYawMixLevel->value() / 100.0;
|
||||||
|
|
||||||
|
QList<QComboBox *> mmList;
|
||||||
|
mmList << m_aircraft->fwEngineChannelBox << m_aircraft->fwAileron1ChannelBox
|
||||||
|
<< m_aircraft->fwAileron2ChannelBox << m_aircraft->fwElevator1ChannelBox
|
||||||
|
<< m_aircraft->fwElevator2ChannelBox << m_aircraft->fwRudder1ChannelBox
|
||||||
|
<< m_aircraft->fwRudder2ChannelBox;
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
if (mmList.at(i)->isEnabled()) {
|
||||||
|
int channel = mmList.at(i)->currentIndex() - 1;
|
||||||
|
if (channel > -1) {
|
||||||
|
qDebug() << "code needs to be written here!";
|
||||||
|
// setupQuadMotor(channel, mixerFactors[i][0] * pFactor, rFactor * mixerFactors[i][1],
|
||||||
|
// yFactor * mixerFactors[i][2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -550,27 +603,6 @@ bool ConfigFixedWingWidget::throwConfigError(QString airframeType)
|
|||||||
m_aircraft->fwAileron1ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
|
m_aircraft->fwAileron1ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
|
||||||
m_aircraft->fwRudder1ChannelBox->setItemData(0, 0, Qt::DecorationRole); // Reset color palettes
|
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") {
|
} else if (airframeType == "FixedWingVtail") {
|
||||||
if (m_aircraft->fwEngineChannelBox->currentText() == "None") {
|
if (m_aircraft->fwEngineChannelBox->currentText() == "None") {
|
||||||
m_aircraft->fwEngineChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
|
m_aircraft->fwEngineChannelBox->setItemData(0, pixmap, Qt::DecorationRole); // Set color palettes
|
||||||
@ -600,3 +632,34 @@ bool ConfigFixedWingWidget::throwConfigError(QString airframeType)
|
|||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
WHAT DOES THIS DO???
|
||||||
|
*/
|
||||||
|
void ConfigFixedWingWidget::showEvent(QShowEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event)
|
||||||
|
// Thit fitInView method should only be called now, once the
|
||||||
|
// widget is shown, otherwise it cannot compute its values and
|
||||||
|
// the result is usually a ahrsbargraph that is way too small.
|
||||||
|
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);
|
||||||
|
m_aircraft->planeShape->fitInView(plane, Qt::KeepAspectRatio);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigFixedWingWidget::enableControls(bool enable)
|
||||||
|
{
|
||||||
|
ConfigTaskWidget::enableControls(enable);
|
||||||
|
|
||||||
|
if (enable) {
|
||||||
|
setupEnabledControls(m_aircraft->fixedWingType->currentText());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ class ConfigFixedWingWidget : public VehicleConfig {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static const QString CHANNELBOXNAME;
|
||||||
static QStringList getChannelDescriptions();
|
static QStringList getChannelDescriptions();
|
||||||
|
|
||||||
ConfigFixedWingWidget(QWidget *parent = 0);
|
ConfigFixedWingWidget(QWidget *parent = 0);
|
||||||
@ -52,19 +53,25 @@ public:
|
|||||||
virtual void refreshWidgetsValues(QString frameType);
|
virtual void refreshWidgetsValues(QString frameType);
|
||||||
virtual QString updateConfigObjectsFromWidgets();
|
virtual QString updateConfigObjectsFromWidgets();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void showEvent(QShowEvent *event);
|
||||||
|
void resizeEvent(QResizeEvent *event);
|
||||||
|
void enableControls(bool enable);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui_FixedWingConfigWidget *m_aircraft;
|
Ui_FixedWingConfigWidget *m_aircraft;
|
||||||
|
QGraphicsSvgItem *plane;
|
||||||
|
|
||||||
virtual void registerWidgets(ConfigTaskWidget &parent);
|
virtual void registerWidgets(ConfigTaskWidget &parent);
|
||||||
virtual void resetActuators(GUIConfigDataUnion *configData);
|
virtual void resetActuators(GUIConfigDataUnion *configData);
|
||||||
|
|
||||||
bool setupFrameFixedWing(QString airframeType);
|
bool setupFrameFixedWing(QString airframeType);
|
||||||
bool setupFrameElevon(QString airframeType);
|
|
||||||
bool setupFrameVtail(QString airframeType);
|
bool setupFrameVtail(QString airframeType);
|
||||||
|
bool setupFixedWingMixer(double mixerFactors[8][3]);
|
||||||
|
void setupMotors(QList<QString> motorList);
|
||||||
|
|
||||||
protected:
|
void updateAirframe(QString multiRotorType);
|
||||||
void enableControls(bool enable);
|
void setupEnabledControls(QString airframeType);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
virtual void setupUI(QString airframeType);
|
virtual void setupUI(QString airframeType);
|
||||||
virtual bool throwConfigError(QString airframeType);
|
virtual bool throwConfigError(QString airframeType);
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
<file>images/ahrs-calib.svg</file>
|
<file>images/ahrs-calib.svg</file>
|
||||||
<file>images/paper-plane.svg</file>
|
<file>images/paper-plane.svg</file>
|
||||||
<file>images/multirotor-shapes.svg</file>
|
<file>images/multirotor-shapes.svg</file>
|
||||||
|
<!-- these are different from the files in /setupwiz/resources -->
|
||||||
|
<file>images/fixedwing-shapes.svg</file>
|
||||||
<file>images/ccpm_setup.svg</file>
|
<file>images/ccpm_setup.svg</file>
|
||||||
<file>images/PipXtreme.png</file>
|
<file>images/PipXtreme.png</file>
|
||||||
<file>images/help.png</file>
|
<file>images/help.png</file>
|
||||||
|
@ -68,9 +68,11 @@ QStringList ConfigVehicleTypeWidget::getChannelDescriptions()
|
|||||||
QStringList channelDesc;
|
QStringList channelDesc;
|
||||||
switch (systemSettingsData.AirframeType) {
|
switch (systemSettingsData.AirframeType) {
|
||||||
case SystemSettings::AIRFRAMETYPE_FIXEDWING:
|
case SystemSettings::AIRFRAMETYPE_FIXEDWING:
|
||||||
|
channelDesc = ConfigFixedWingWidget::getChannelDescriptions();
|
||||||
|
break;
|
||||||
case SystemSettings::AIRFRAMETYPE_FIXEDWINGELEVON:
|
case SystemSettings::AIRFRAMETYPE_FIXEDWINGELEVON:
|
||||||
|
// do nothing for elevon support for the time being.
|
||||||
case SystemSettings::AIRFRAMETYPE_FIXEDWINGVTAIL:
|
case SystemSettings::AIRFRAMETYPE_FIXEDWINGVTAIL:
|
||||||
// fixed wing
|
|
||||||
channelDesc = ConfigFixedWingWidget::getChannelDescriptions();
|
channelDesc = ConfigFixedWingWidget::getChannelDescriptions();
|
||||||
break;
|
break;
|
||||||
case SystemSettings::AIRFRAMETYPE_HELICP:
|
case SystemSettings::AIRFRAMETYPE_HELICP:
|
||||||
|
2789
ground/openpilotgcs/src/plugins/config/images/fixedwing-shapes.svg
Normal file
2789
ground/openpilotgcs/src/plugins/config/images/fixedwing-shapes.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 135 KiB |
@ -118,6 +118,16 @@ void ConnectionDiagram::setupGraphicsScene()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VehicleConfigurationSource::VEHICLE_FIXEDWING:
|
case VehicleConfigurationSource::VEHICLE_FIXEDWING:
|
||||||
|
switch (m_configSource->getVehicleSubType()) {
|
||||||
|
case VehicleConfigurationSource::FIXED_WING_AILERON:
|
||||||
|
elementsToShow << "aileron";
|
||||||
|
break;
|
||||||
|
case VehicleConfigurationSource::FIXED_WING_VTAIL:
|
||||||
|
elementsToShow << "vtail";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
case VehicleConfigurationSource::VEHICLE_HELI:
|
case VehicleConfigurationSource::VEHICLE_HELI:
|
||||||
case VehicleConfigurationSource::VEHICLE_SURFACE:
|
case VehicleConfigurationSource::VEHICLE_SURFACE:
|
||||||
default:
|
default:
|
||||||
|
@ -27,16 +27,96 @@
|
|||||||
|
|
||||||
#include "fixedwingpage.h"
|
#include "fixedwingpage.h"
|
||||||
#include "ui_fixedwingpage.h"
|
#include "ui_fixedwingpage.h"
|
||||||
|
#include "setupwizard.h"
|
||||||
|
|
||||||
FixedWingPage::FixedWingPage(SetupWizard *wizard, QWidget *parent) :
|
FixedWingPage::FixedWingPage(SetupWizard *wizard, QWidget *parent) :
|
||||||
AbstractWizardPage(wizard, parent),
|
AbstractWizardPage(wizard, parent),
|
||||||
ui(new Ui::FixedWingPage)
|
ui(new Ui::FixedWingPage)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
setFinalPage(true);
|
QSvgRenderer *renderer = new QSvgRenderer();
|
||||||
|
renderer->load(QString(":/configgadget/images/fixedwing-shapes.svg"));
|
||||||
|
m_fixedwingPic = new QGraphicsSvgItem();
|
||||||
|
m_fixedwingPic->setSharedRenderer(renderer);
|
||||||
|
QGraphicsScene *scene = new QGraphicsScene(this);
|
||||||
|
scene->addItem(m_fixedwingPic);
|
||||||
|
ui->typeGraphicsView->setScene(scene);
|
||||||
|
|
||||||
|
setupFixedWingTypesCombo();
|
||||||
|
|
||||||
|
// Default to Aileron setup
|
||||||
|
ui->typeCombo->setCurrentIndex(0);
|
||||||
|
connect(ui->typeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(updateImageAndDescription()));
|
||||||
|
ui->typeGraphicsView->setSceneRect(m_fixedwingPic->boundingRect());
|
||||||
|
ui->typeGraphicsView->fitInView(m_fixedwingPic, Qt::KeepAspectRatio);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FixedWingPage::~FixedWingPage()
|
FixedWingPage::~FixedWingPage()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FixedWingPage::initializePage()
|
||||||
|
{
|
||||||
|
updateAvailableTypes();
|
||||||
|
updateImageAndDescription();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FixedWingPage::validatePage()
|
||||||
|
{
|
||||||
|
SetupWizard::VEHICLE_SUB_TYPE type = (SetupWizard::VEHICLE_SUB_TYPE)ui->typeCombo->itemData(ui->typeCombo->currentIndex()).toInt();
|
||||||
|
|
||||||
|
getWizard()->setVehicleSubType(type);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FixedWingPage::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event);
|
||||||
|
if (m_fixedwingPic) {
|
||||||
|
ui->typeGraphicsView->setSceneRect(m_fixedwingPic->boundingRect());
|
||||||
|
ui->typeGraphicsView->fitInView(m_fixedwingPic, Qt::KeepAspectRatio);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FixedWingPage::setupFixedWingTypesCombo()
|
||||||
|
{
|
||||||
|
ui->typeCombo->addItem(tr("Aileron, Elevator, Rudder"), SetupWizard::FIXED_WING_AILERON);
|
||||||
|
m_descriptions << tr("This setup currently expects a traditional 4 channel setup including two ailerons (not connected by Y adapter), an elevator and a rudder. ");
|
||||||
|
|
||||||
|
ui->typeCombo->addItem(tr("V-Tail"), SetupWizard::FIXED_WING_VTAIL);
|
||||||
|
m_descriptions << tr("This setup currently expects a flying-wing setup, an elevon plus rudder setup is not yet supported. Setup should include only two elevons, and should explicitly not include a rudder.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void FixedWingPage::updateAvailableTypes()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void FixedWingPage::updateImageAndDescription()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
SetupWizard::VEHICLE_SUB_TYPE type = (SetupWizard::VEHICLE_SUB_TYPE)ui->typeCombo->itemData(ui->typeCombo->currentIndex()).toInt();
|
||||||
|
QString elementId = "";
|
||||||
|
QString description = m_descriptions.at(ui->typeCombo->currentIndex());
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case SetupWizard::FIXED_WING_AILERON:
|
||||||
|
elementId = "aileron";
|
||||||
|
break;
|
||||||
|
case SetupWizard::FIXED_WING_VTAIL:
|
||||||
|
elementId = "vtail";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
elementId = "";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
m_fixedwingPic->setElementId(elementId);
|
||||||
|
ui->typeGraphicsView->setSceneRect(m_fixedwingPic->boundingRect());
|
||||||
|
ui->typeGraphicsView->fitInView(m_fixedwingPic, Qt::KeepAspectRatio);
|
||||||
|
|
||||||
|
ui->typeDescription->setText(description);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,10 @@
|
|||||||
#ifndef FIXEDWINGPAGE_H
|
#ifndef FIXEDWINGPAGE_H
|
||||||
#define FIXEDWINGPAGE_H
|
#define FIXEDWINGPAGE_H
|
||||||
|
|
||||||
|
#include <QtSvg/QGraphicsSvgItem>
|
||||||
|
#include <QtSvg/QSvgRenderer>
|
||||||
|
#include <QList>
|
||||||
|
|
||||||
#include "abstractwizardpage.h"
|
#include "abstractwizardpage.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
@ -41,8 +45,21 @@ public:
|
|||||||
explicit FixedWingPage(SetupWizard *wizard, QWidget *parent = 0);
|
explicit FixedWingPage(SetupWizard *wizard, QWidget *parent = 0);
|
||||||
~FixedWingPage();
|
~FixedWingPage();
|
||||||
|
|
||||||
|
void initializePage();
|
||||||
|
bool validatePage();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void resizeEvent(QResizeEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::FixedWingPage *ui;
|
Ui::FixedWingPage *ui;
|
||||||
|
void setupFixedWingTypesCombo();
|
||||||
|
QGraphicsSvgItem *m_fixedwingPic;
|
||||||
|
void updateAvailableTypes();
|
||||||
|
QList<QString> m_descriptions;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void updateImageAndDescription();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FIXEDWINGPAGE_H
|
#endif // FIXEDWINGPAGE_H
|
||||||
|
@ -15,22 +15,147 @@
|
|||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||||
p, li { white-space: pre-wrap; }
|
p, li { white-space: pre-wrap; }
|
||||||
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
|
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;">
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">The Fixed Wing section of the OpenPilot Setup Wizard is not yet implemented</span></p>
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600;">OpenPilot fixedwing configuration</span></p>
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"></p></body></html></string>
|
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:12pt; font-weight:600;"><br /></p>
|
||||||
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">This part of the wizard will set up the OpenPilot controller for use with a flying platform utilizing multiple rotors. The wizard supports the most common types of fixedwings. Other variants of fixedwings can be configured by using custom configuration options in the Configuration plugin in the GCS.</span></p>
|
||||||
|
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt;"><br /></p>
|
||||||
|
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Please select the type of fixedwing you want to create a configuration for below:</span></p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>4</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment">
|
<item>
|
||||||
<set>Qt::AlignCenter</set>
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
</property>
|
<item>
|
||||||
<property name="wordWrap">
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
<bool>true</bool>
|
<property name="rightMargin">
|
||||||
</property>
|
<number>4</number>
|
||||||
</widget>
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>125</width>
|
||||||
|
<height>36</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>FixedWing type:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="typeCombo">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>125</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTextEdit" name="typeDescription">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Maximum" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="verticalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOn</enum>
|
||||||
|
</property>
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGraphicsView" name="typeGraphicsView">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>200</width>
|
||||||
|
<height>200</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape">
|
||||||
|
<enum>QFrame::NoFrame</enum>
|
||||||
|
</property>
|
||||||
|
<property name="lineWidth">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="midLineWidth">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="verticalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="backgroundBrush">
|
||||||
|
<brush brushstyle="NoBrush">
|
||||||
|
<color alpha="0">
|
||||||
|
<red>0</red>
|
||||||
|
<green>0</green>
|
||||||
|
<blue>0</blue>
|
||||||
|
</color>
|
||||||
|
</brush>
|
||||||
|
</property>
|
||||||
|
<property name="foregroundBrush">
|
||||||
|
<brush brushstyle="NoBrush">
|
||||||
|
<color alpha="0">
|
||||||
|
<red>0</red>
|
||||||
|
<green>0</green>
|
||||||
|
<blue>0</blue>
|
||||||
|
</color>
|
||||||
|
</brush>
|
||||||
|
</property>
|
||||||
|
<property name="interactive">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -36,13 +36,13 @@ OutputCalibrationPage::OutputCalibrationPage(SetupWizard *wizard, QWidget *paren
|
|||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
qDebug() << "calling output calibration page";
|
||||||
m_vehicleRenderer = new QSvgRenderer();
|
m_vehicleRenderer = new QSvgRenderer();
|
||||||
if (QFile::exists(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
|
||||||
m_vehicleRenderer->load(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
// move the code that was here to setupVehicle() so we can determine which image to use.
|
||||||
m_vehicleRenderer->isValid()) {
|
m_vehicleScene = new QGraphicsScene(this);
|
||||||
m_vehicleScene = new QGraphicsScene(this);
|
ui->vehicleView->setScene(m_vehicleScene);
|
||||||
ui->vehicleView->setScene(m_vehicleScene);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputCalibrationPage::~OutputCalibrationPage()
|
OutputCalibrationPage::~OutputCalibrationPage()
|
||||||
@ -63,8 +63,18 @@ void OutputCalibrationPage::setupVehicle()
|
|||||||
m_channelIndex.clear();
|
m_channelIndex.clear();
|
||||||
m_currentWizardIndex = 0;
|
m_currentWizardIndex = 0;
|
||||||
m_vehicleScene->clear();
|
m_vehicleScene->clear();
|
||||||
|
|
||||||
|
// KF moved code from OutputCalibrationPage() here so it can be used to detect the current vehicle
|
||||||
|
// needs to be slimmed down and not repeated.
|
||||||
|
|
||||||
switch (getWizard()->getVehicleSubType()) {
|
switch (getWizard()->getVehicleSubType()) {
|
||||||
case SetupWizard::MULTI_ROTOR_TRI_Y:
|
case SetupWizard::MULTI_ROTOR_TRI_Y:
|
||||||
|
if (QFile::exists(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->load(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->isValid()) {
|
||||||
|
ui->vehicleView->setScene(m_vehicleScene);
|
||||||
|
}
|
||||||
|
|
||||||
m_wizardIndexes << 0 << 1 << 1 << 1 << 2 << 3 << 4;
|
m_wizardIndexes << 0 << 1 << 1 << 1 << 2 << 3 << 4;
|
||||||
m_vehicleElementIds << "tri" << "tri-frame" << "tri-m1" << "tri-m2" << "tri-m3" << "tri-s1";
|
m_vehicleElementIds << "tri" << "tri-frame" << "tri-m1" << "tri-m2" << "tri-m3" << "tri-s1";
|
||||||
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 4 << 4;
|
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 4 << 4;
|
||||||
@ -75,35 +85,116 @@ void OutputCalibrationPage::setupVehicle()
|
|||||||
getWizard()->setActuatorSettings(m_actuatorSettings);
|
getWizard()->setActuatorSettings(m_actuatorSettings);
|
||||||
break;
|
break;
|
||||||
case SetupWizard::MULTI_ROTOR_QUAD_X:
|
case SetupWizard::MULTI_ROTOR_QUAD_X:
|
||||||
|
if (QFile::exists(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->load(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->isValid()) {
|
||||||
|
ui->vehicleView->setScene(m_vehicleScene);
|
||||||
|
}
|
||||||
m_wizardIndexes << 0 << 1 << 1 << 1 << 1;
|
m_wizardIndexes << 0 << 1 << 1 << 1 << 1;
|
||||||
m_vehicleElementIds << "quad-x" << "quad-x-frame" << "quad-x-m1" << "quad-x-m2" << "quad-x-m3" << "quad-x-m4";
|
m_vehicleElementIds << "quad-x" << "quad-x-frame" << "quad-x-m1" << "quad-x-m2" << "quad-x-m3" << "quad-x-m4";
|
||||||
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4;
|
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4;
|
||||||
m_channelIndex << 0 << 0 << 1 << 2 << 3;
|
m_channelIndex << 0 << 0 << 1 << 2 << 3;
|
||||||
break;
|
break;
|
||||||
case SetupWizard::MULTI_ROTOR_QUAD_PLUS:
|
case SetupWizard::MULTI_ROTOR_QUAD_PLUS:
|
||||||
|
if (QFile::exists(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->load(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->isValid()) {
|
||||||
|
ui->vehicleView->setScene(m_vehicleScene);
|
||||||
|
}
|
||||||
m_wizardIndexes << 0 << 1 << 1 << 1 << 1;
|
m_wizardIndexes << 0 << 1 << 1 << 1 << 1;
|
||||||
m_vehicleElementIds << "quad-p" << "quad-p-frame" << "quad-p-m1" << "quad-p-m2" << "quad-p-m3" << "quad-p-m4";
|
m_vehicleElementIds << "quad-p" << "quad-p-frame" << "quad-p-m1" << "quad-p-m2" << "quad-p-m3" << "quad-p-m4";
|
||||||
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4;
|
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4;
|
||||||
m_channelIndex << 0 << 0 << 1 << 2 << 3;
|
m_channelIndex << 0 << 0 << 1 << 2 << 3;
|
||||||
break;
|
break;
|
||||||
case SetupWizard::MULTI_ROTOR_HEXA:
|
case SetupWizard::MULTI_ROTOR_HEXA:
|
||||||
|
if (QFile::exists(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->load(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->isValid()) {
|
||||||
|
ui->vehicleView->setScene(m_vehicleScene);
|
||||||
|
}
|
||||||
m_wizardIndexes << 0 << 1 << 1 << 1 << 1 << 1 << 1;
|
m_wizardIndexes << 0 << 1 << 1 << 1 << 1 << 1 << 1;
|
||||||
m_vehicleElementIds << "hexa" << "hexa-frame" << "hexa-m1" << "hexa-m2" << "hexa-m3" << "hexa-m4" << "hexa-m5" << "hexa-m6";
|
m_vehicleElementIds << "hexa" << "hexa-frame" << "hexa-m1" << "hexa-m2" << "hexa-m3" << "hexa-m4" << "hexa-m5" << "hexa-m6";
|
||||||
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 5 << 6;
|
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 5 << 6;
|
||||||
m_channelIndex << 0 << 0 << 1 << 2 << 3 << 4 << 5;
|
m_channelIndex << 0 << 0 << 1 << 2 << 3 << 4 << 5;
|
||||||
break;
|
break;
|
||||||
case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y:
|
case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y:
|
||||||
|
if (QFile::exists(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->load(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->isValid()) {
|
||||||
|
ui->vehicleView->setScene(m_vehicleScene);
|
||||||
|
}
|
||||||
m_wizardIndexes << 0 << 1 << 1 << 1 << 1 << 1 << 1;
|
m_wizardIndexes << 0 << 1 << 1 << 1 << 1 << 1 << 1;
|
||||||
m_vehicleElementIds << "hexa-y6" << "hexa-y6-frame" << "hexa-y6-m2" << "hexa-y6-m1" << "hexa-y6-m4" << "hexa-y6-m3" << "hexa-y6-m6" << "hexa-y6-m5";
|
m_vehicleElementIds << "hexa-y6" << "hexa-y6-frame" << "hexa-y6-m2" << "hexa-y6-m1" << "hexa-y6-m4" << "hexa-y6-m3" << "hexa-y6-m6" << "hexa-y6-m5";
|
||||||
m_vehicleHighlightElementIndexes << 0 << 2 << 1 << 4 << 3 << 6 << 5;
|
m_vehicleHighlightElementIndexes << 0 << 2 << 1 << 4 << 3 << 6 << 5;
|
||||||
m_channelIndex << 0 << 0 << 1 << 2 << 3 << 4 << 5;
|
m_channelIndex << 0 << 0 << 1 << 2 << 3 << 4 << 5;
|
||||||
break;
|
break;
|
||||||
case SetupWizard::MULTI_ROTOR_HEXA_H:
|
case SetupWizard::MULTI_ROTOR_HEXA_H:
|
||||||
|
if (QFile::exists(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->load(QString(":/setupwizard/resources/multirotor-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->isValid()) {
|
||||||
|
ui->vehicleView->setScene(m_vehicleScene);
|
||||||
|
}
|
||||||
m_wizardIndexes << 0 << 1 << 1 << 1 << 1 << 1 << 1;
|
m_wizardIndexes << 0 << 1 << 1 << 1 << 1 << 1 << 1;
|
||||||
m_vehicleElementIds << "hexa-h" << "hexa-h-frame" << "hexa-h-m1" << "hexa-h-m2" << "hexa-h-m3" << "hexa-h-m4" << "hexa-h-m5" << "hexa-h-m6";
|
m_vehicleElementIds << "hexa-h" << "hexa-h-frame" << "hexa-h-m1" << "hexa-h-m2" << "hexa-h-m3" << "hexa-h-m4" << "hexa-h-m5" << "hexa-h-m6";
|
||||||
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 5 << 6;
|
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 5 << 6;
|
||||||
m_channelIndex << 0 << 0 << 1 << 2 << 3 << 4 << 5;
|
m_channelIndex << 0 << 0 << 1 << 2 << 3 << 4 << 5;
|
||||||
break;
|
break;
|
||||||
|
// KF hack
|
||||||
|
case SetupWizard::FIXED_WING_AILERON:
|
||||||
|
if (QFile::exists(QString(":/setupwizard/resources/fixedwing-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->load(QString(":/setupwizard/resources/fixedwing-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->isValid()) {
|
||||||
|
ui->vehicleView->setScene(m_vehicleScene);
|
||||||
|
}
|
||||||
|
qDebug() << "no clue what a wizard index is!";
|
||||||
|
m_wizardIndexes << 0 << 1 << 3 << 3 << 3 << 3; // These come from OutputCalibrationPage::setWizardPage()
|
||||||
|
m_vehicleElementIds << "fixed-aileron" << "aileron";
|
||||||
|
m_vehicleHighlightElementIndexes << 0 << 1;
|
||||||
|
m_channelIndex << 0 << 0 << 1 << 2 << 3 << 4;
|
||||||
|
|
||||||
|
// see Servo city for an example. 1500 usec is center on MS85mg for example. - http://www.servocity.com/html/hs-85mg__mighty_micro.html
|
||||||
|
// make sure Aileron servo one does not go to an extreme value
|
||||||
|
m_actuatorSettings[1].channelMin = 1500;
|
||||||
|
m_actuatorSettings[1].channelNeutral = 1500;
|
||||||
|
m_actuatorSettings[1].channelMax = 1500;
|
||||||
|
// make sure Aileron servo two does not go to an extreme value
|
||||||
|
m_actuatorSettings[2].channelMin = 1500;
|
||||||
|
m_actuatorSettings[2].channelNeutral = 1500;
|
||||||
|
m_actuatorSettings[2].channelMax = 1500;
|
||||||
|
// make sure Elevator servo one does not go to an extreme value
|
||||||
|
m_actuatorSettings[3].channelMin = 1500;
|
||||||
|
m_actuatorSettings[4].channelNeutral = 1500;
|
||||||
|
m_actuatorSettings[3].channelMax = 1500;
|
||||||
|
// make sure Rudder servo one does not go to an extreme value
|
||||||
|
m_actuatorSettings[4].channelMin = 1500;
|
||||||
|
m_actuatorSettings[4].channelNeutral = 1500;
|
||||||
|
m_actuatorSettings[4].channelMax = 1500;
|
||||||
|
|
||||||
|
getWizard()->setActuatorSettings(m_actuatorSettings);
|
||||||
|
break;
|
||||||
|
case SetupWizard::FIXED_WING_VTAIL:
|
||||||
|
if (QFile::exists(QString(":/setupwizard/resources/fixedwing-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->load(QString(":/setupwizard/resources/fixedwing-shapes.svg")) &&
|
||||||
|
m_vehicleRenderer->isValid()) {
|
||||||
|
ui->vehicleView->setScene(m_vehicleScene);
|
||||||
|
}
|
||||||
|
qDebug() << "no clue what a wizard index is!";
|
||||||
|
m_wizardIndexes << 0 << 1 << 3 << 3; // These come from OutputCalibrationPage::setWizardPage()
|
||||||
|
m_vehicleElementIds << "fixed-vtail" << "vtail";
|
||||||
|
m_vehicleHighlightElementIndexes << 0 << 1;
|
||||||
|
m_channelIndex << 0 << 0 << 1 << 2;
|
||||||
|
|
||||||
|
// make sure elevon servo one does not go to an extreme value
|
||||||
|
m_actuatorSettings[1].channelMin = 1500;
|
||||||
|
m_actuatorSettings[1].channelNeutral = 1500;
|
||||||
|
m_actuatorSettings[1].channelMax = 1500;
|
||||||
|
// make sure elevon servo two does not go to an extreme value
|
||||||
|
m_actuatorSettings[2].channelMin = 1500;
|
||||||
|
m_actuatorSettings[2].channelNeutral = 1500;
|
||||||
|
m_actuatorSettings[2].channelMax = 1500;
|
||||||
|
|
||||||
|
getWizard()->setActuatorSettings(m_actuatorSettings);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -191,7 +282,7 @@ void OutputCalibrationPage::setWizardPage()
|
|||||||
ui->servoMaxAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMax);
|
ui->servoMaxAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMax);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setupVehicleHighlightedPart();
|
// setupVehicleHighlightedPart(); // turn this off for now, need to fix fixedwing image elements
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputCalibrationPage::initializePage()
|
void OutputCalibrationPage::initializePage()
|
||||||
|
@ -146,7 +146,7 @@ p, li { white-space: pre-wrap; }
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="fixedwingButton">
|
<widget class="QToolButton" name="fixedwingButton">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
|
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 135 KiB |
@ -112,6 +112,9 @@ int SetupWizard::nextId() const
|
|||||||
case PAGE_MULTI:
|
case PAGE_MULTI:
|
||||||
return PAGE_OUTPUT;
|
return PAGE_OUTPUT;
|
||||||
|
|
||||||
|
case PAGE_FIXEDWING:
|
||||||
|
return PAGE_OUTPUT;
|
||||||
|
|
||||||
case PAGE_INPUT:
|
case PAGE_INPUT:
|
||||||
if (isRestartNeeded()) {
|
if (isRestartNeeded()) {
|
||||||
saveHardwareSettings();
|
saveHardwareSettings();
|
||||||
@ -225,7 +228,22 @@ QString SetupWizard::getSummaryText()
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case VEHICLE_FIXEDWING:
|
case VEHICLE_FIXEDWING:
|
||||||
summary.append(tr("Fixed wing"));
|
summary.append(tr("Fixed wing"));
|
||||||
|
|
||||||
|
summary.append("<br>");
|
||||||
|
summary.append("<b>").append(tr("Vehicle sub type: ")).append("</b>");
|
||||||
|
switch (getVehicleSubType()) {
|
||||||
|
case SetupWizard::FIXED_WING_AILERON:
|
||||||
|
summary.append(tr("Aileron"));
|
||||||
|
break;
|
||||||
|
case SetupWizard::FIXED_WING_VTAIL:
|
||||||
|
summary.append(tr("Vtail"));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
summary.append(tr("Unknown"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case VEHICLE_HELI:
|
case VEHICLE_HELI:
|
||||||
summary.append(tr("Helicopter"));
|
summary.append(tr("Helicopter"));
|
||||||
|
@ -214,6 +214,19 @@ void VehicleConfigurationHelper::applyVehicleConfiguration()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case VehicleConfigurationSource::VEHICLE_FIXEDWING:
|
case VehicleConfigurationSource::VEHICLE_FIXEDWING:
|
||||||
|
{
|
||||||
|
switch (m_configSource->getVehicleSubType()) {
|
||||||
|
case VehicleConfigurationSource::FIXED_WING_AILERON:
|
||||||
|
setupAileron();
|
||||||
|
break;
|
||||||
|
case VehicleConfigurationSource::FIXED_WING_VTAIL:
|
||||||
|
setupVtail();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case VehicleConfigurationSource::VEHICLE_HELI:
|
case VehicleConfigurationSource::VEHICLE_HELI:
|
||||||
case VehicleConfigurationSource::VEHICLE_SURFACE:
|
case VehicleConfigurationSource::VEHICLE_SURFACE:
|
||||||
// TODO: Implement settings for other vehicle types?
|
// TODO: Implement settings for other vehicle types?
|
||||||
@ -293,7 +306,23 @@ void VehicleConfigurationHelper::applyActuatorConfiguration()
|
|||||||
addModifiedObject(actSettings, tr("Writing actuator settings"));
|
addModifiedObject(actSettings, tr("Writing actuator settings"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
case VehicleConfigurationSource::VEHICLE_FIXEDWING:
|
case VehicleConfigurationSource::VEHICLE_FIXEDWING:
|
||||||
|
{
|
||||||
|
ActuatorSettings::DataFields data = actSettings->getData();
|
||||||
|
|
||||||
|
qDebug() << "Override center pulse for fixed wing servos\n";
|
||||||
|
// move all but first chan to 1500 center pluse
|
||||||
|
QList<actuatorChannelSettings> actuatorSettings = m_configSource->getActuatorSettings();
|
||||||
|
for (quint16 i = 1; i < ActuatorSettings::CHANNELMAX_NUMELEM; i++) {
|
||||||
|
data.ChannelType[i] = ActuatorSettings::CHANNELTYPE_PWM;
|
||||||
|
data.ChannelAddr[i] = i;
|
||||||
|
data.ChannelMin[i] = 1500;
|
||||||
|
data.ChannelNeutral[i] = 1500;
|
||||||
|
data.ChannelMax[i] = 1500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
case VehicleConfigurationSource::VEHICLE_HELI:
|
case VehicleConfigurationSource::VEHICLE_HELI:
|
||||||
case VehicleConfigurationSource::VEHICLE_SURFACE:
|
case VehicleConfigurationSource::VEHICLE_SURFACE:
|
||||||
// TODO: Implement settings for other vehicle types?
|
// TODO: Implement settings for other vehicle types?
|
||||||
@ -1287,3 +1316,93 @@ void VehicleConfigurationHelper::setupOctoCopter()
|
|||||||
applyMixerConfiguration(channels);
|
applyMixerConfiguration(channels);
|
||||||
applyMultiGUISettings(frame, guiSettings);
|
applyMultiGUISettings(frame, guiSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VehicleConfigurationHelper::setupVtail()
|
||||||
|
{
|
||||||
|
|
||||||
|
mixerChannelSettings channels[10];
|
||||||
|
GUIConfigDataUnion guiSettings = getGUIConfigData();
|
||||||
|
|
||||||
|
channels[0].type = MIXER_TYPE_MOTOR;
|
||||||
|
channels[0].throttle1 = 100;
|
||||||
|
channels[0].throttle2 = 0;
|
||||||
|
channels[0].roll = 0;
|
||||||
|
channels[0].pitch = 0;
|
||||||
|
channels[0].yaw = 0;
|
||||||
|
|
||||||
|
channels[1].type = MIXER_TYPE_SERVO;
|
||||||
|
channels[1].throttle1 = 0;
|
||||||
|
channels[1].throttle2 = 0;
|
||||||
|
channels[1].roll = -100;
|
||||||
|
channels[1].pitch = 50;
|
||||||
|
channels[1].yaw = 0;
|
||||||
|
|
||||||
|
channels[2].type = MIXER_TYPE_SERVO;
|
||||||
|
channels[2].throttle1 = 0;
|
||||||
|
channels[2].throttle2 = 0;
|
||||||
|
channels[2].roll = 100;
|
||||||
|
channels[2].pitch = -50;
|
||||||
|
channels[2].yaw = 0;
|
||||||
|
|
||||||
|
guiSettings.fixedwing.FixedWingThrottle = 1;
|
||||||
|
guiSettings.fixedwing.FixedWingRoll1 = 2;
|
||||||
|
guiSettings.fixedwing.FixedWingRoll2 = 3;
|
||||||
|
|
||||||
|
applyMixerConfiguration(channels);
|
||||||
|
applyMultiGUISettings(SystemSettings::AIRFRAMETYPE_FIXEDWINGVTAIL, guiSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VehicleConfigurationHelper::setupAileron()
|
||||||
|
{
|
||||||
|
// Typical vehicle setup
|
||||||
|
// 1. Setup mixer data
|
||||||
|
// 2. Setup GUI data
|
||||||
|
// 3. Apply changes
|
||||||
|
|
||||||
|
mixerChannelSettings channels[10];
|
||||||
|
GUIConfigDataUnion guiSettings = getGUIConfigData();
|
||||||
|
|
||||||
|
channels[0].type = MIXER_TYPE_MOTOR;
|
||||||
|
channels[0].throttle1 = 100;
|
||||||
|
channels[0].throttle2 = 0;
|
||||||
|
channels[0].roll = 0;
|
||||||
|
channels[0].pitch = 0;
|
||||||
|
channels[0].yaw = 0;
|
||||||
|
|
||||||
|
channels[1].type = MIXER_TYPE_SERVO;
|
||||||
|
channels[1].throttle1 = 0;
|
||||||
|
channels[1].throttle2 = 0;
|
||||||
|
channels[1].roll = -100;
|
||||||
|
channels[1].pitch = 0;
|
||||||
|
channels[1].yaw = 0;
|
||||||
|
|
||||||
|
channels[2].type = MIXER_TYPE_SERVO;
|
||||||
|
channels[2].throttle1 = 0;
|
||||||
|
channels[2].throttle2 = 0;
|
||||||
|
channels[2].roll = 100;
|
||||||
|
channels[2].pitch = 0;
|
||||||
|
channels[2].yaw = 0;
|
||||||
|
|
||||||
|
channels[3].type = MIXER_TYPE_SERVO;
|
||||||
|
channels[3].throttle1 = 0;
|
||||||
|
channels[3].throttle2 = 0;
|
||||||
|
channels[3].roll = 0;
|
||||||
|
channels[3].pitch = 100;
|
||||||
|
channels[3].yaw = 0;
|
||||||
|
|
||||||
|
channels[3].type = MIXER_TYPE_SERVO;
|
||||||
|
channels[3].throttle1 = 0;
|
||||||
|
channels[3].throttle2 = 0;
|
||||||
|
channels[3].roll = 0;
|
||||||
|
channels[3].pitch = 0;
|
||||||
|
channels[3].yaw = 100;
|
||||||
|
|
||||||
|
guiSettings.fixedwing.FixedWingThrottle = 1;
|
||||||
|
guiSettings.fixedwing.FixedWingRoll1 = 2;
|
||||||
|
guiSettings.fixedwing.FixedWingRoll2 = 3;
|
||||||
|
guiSettings.fixedwing.FixedWingPitch1 = 4;
|
||||||
|
guiSettings.fixedwing.FixedWingYaw1 = 5;
|
||||||
|
|
||||||
|
applyMixerConfiguration(channels);
|
||||||
|
applyMultiGUISettings(SystemSettings::AIRFRAMETYPE_FIXEDWING, guiSettings);
|
||||||
|
}
|
||||||
|
@ -103,6 +103,8 @@ private:
|
|||||||
void setupQuadCopter();
|
void setupQuadCopter();
|
||||||
void setupHexaCopter();
|
void setupHexaCopter();
|
||||||
void setupOctoCopter();
|
void setupOctoCopter();
|
||||||
|
void setupVtail();
|
||||||
|
void setupAileron();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void uAVOTransactionCompleted(UAVObject *object, bool success);
|
void uAVOTransactionCompleted(UAVObject *object, bool success);
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
<file>resources/bttn-turbo-down.png</file>
|
<file>resources/bttn-turbo-down.png</file>
|
||||||
<file>resources/bttn-turbo-up.png</file>
|
<file>resources/bttn-turbo-up.png</file>
|
||||||
<file>resources/multirotor-shapes.svg</file>
|
<file>resources/multirotor-shapes.svg</file>
|
||||||
|
<!-- these are different from the files in /config/images -->
|
||||||
|
<file>resources/fixedwing-shapes.svg</file>
|
||||||
<file>resources/bttn-illustration-down.png</file>
|
<file>resources/bttn-illustration-down.png</file>
|
||||||
<file>resources/bttn-illustration-up.png</file>
|
<file>resources/bttn-illustration-up.png</file>
|
||||||
<file>resources/bttn-save-down.png</file>
|
<file>resources/bttn-save-down.png</file>
|
||||||
|
Loading…
Reference in New Issue
Block a user