From e891cd2dc36a1dcdafab1ad4d15cefbd659ceaf5 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Wed, 1 Aug 2012 00:21:15 +0200 Subject: [PATCH 01/56] Added some more wizard pages. The basic structure for multirotors is in place. --- .../setupwizard/pages/controllerpage.cpp | 19 +- .../src/plugins/setupwizard/pages/endpage.ui | 37 ++-- .../plugins/setupwizard/pages/flashpage.cpp | 48 +++++ .../src/plugins/setupwizard/pages/flashpage.h | 50 +++++ .../plugins/setupwizard/pages/flashpage.ui | 70 +++++++ .../plugins/setupwizard/pages/inputpage.cpp | 64 +++++++ .../src/plugins/setupwizard/pages/inputpage.h | 50 +++++ .../plugins/setupwizard/pages/inputpage.ui | 177 ++++++++++++++++++ .../setupwizard/pages/levellingpage.cpp | 48 +++++ .../plugins/setupwizard/pages/levellingpage.h | 50 +++++ .../setupwizard/pages/levellingpage.ui | 96 ++++++++++ .../plugins/setupwizard/pages/outputpage.cpp | 55 ++++++ .../plugins/setupwizard/pages/outputpage.h | 50 +++++ .../plugins/setupwizard/pages/outputpage.ui | 123 ++++++++++++ .../plugins/setupwizard/pages/summarypage.cpp | 52 +++++ .../plugins/setupwizard/pages/summarypage.h | 51 +++++ .../plugins/setupwizard/pages/summarypage.ui | 124 ++++++++++++ .../src/plugins/setupwizard/setupwizard.cpp | 114 ++++++++++- .../src/plugins/setupwizard/setupwizard.h | 20 +- .../src/plugins/setupwizard/setupwizard.pro | 26 ++- 20 files changed, 1283 insertions(+), 41 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.h create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.cpp create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.h create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.cpp create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.h create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp index 7d66957d9..a0bff4c73 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp @@ -78,6 +78,7 @@ bool ControllerPage::isComplete() const bool ControllerPage::validatePage() { getWizard()->setControllerType((SetupWizard::CONTROLLER_TYPE)ui->boardTypeCombo->itemData(ui->boardTypeCombo->currentIndex()).toInt()); + getWizard()->setControllerSelectionMode(ui->manualCB->isChecked() ? SetupWizard::CONTROLLER_SELECTION_MANUAL : SetupWizard::CONTROLLER_SELECTION_AUTOMATIC); return true; } @@ -115,13 +116,13 @@ void ControllerPage::setupDeviceList() void ControllerPage::setupBoardTypes() { QVariant v(0); - ui->boardTypeCombo->addItem("", SetupWizard::CONTROLLER_UNKNOWN); - ui->boardTypeCombo->addItem("OpenPilot CopterControl (CC)", SetupWizard::CONTROLLER_CC); - ui->boardTypeCombo->addItem("OpenPilot CopterControl (CC3D)", SetupWizard::CONTROLLER_CC3D); - ui->boardTypeCombo->addItem("OpenPilot Revolution", SetupWizard::CONTROLLER_REVO); - ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(ui->boardTypeCombo->count() - 1, 0), v, Qt::UserRole - 1); - ui->boardTypeCombo->addItem("OP PipX Modem", SetupWizard::CONTROLLER_PIPX); - ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(ui->boardTypeCombo->count() - 1, 0), v, Qt::UserRole - 1); + ui->boardTypeCombo->addItem(tr(""), SetupWizard::CONTROLLER_UNKNOWN); + ui->boardTypeCombo->addItem(tr("OpenPilot CopterControl"), SetupWizard::CONTROLLER_CC); + ui->boardTypeCombo->addItem(tr("OpenPilot CopterControl 3D"), SetupWizard::CONTROLLER_CC3D); + ui->boardTypeCombo->addItem(tr("OpenPilot Revolution"), SetupWizard::CONTROLLER_REVO); + //ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(ui->boardTypeCombo->count() - 1, 0), v, Qt::UserRole - 1); + ui->boardTypeCombo->addItem(tr("OpenPilot PipX Radio Modem"), SetupWizard::CONTROLLER_PIPX); + //ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(ui->boardTypeCombo->count() - 1, 0), v, Qt::UserRole - 1); } void ControllerPage::setControllerType(SetupWizard::CONTROLLER_TYPE type) @@ -201,12 +202,12 @@ void ControllerPage::identificationModeChanged() ui->boardTypeCombo->setEnabled(true); ui->connectButton->setEnabled(false); ui->boardTypeCombo->setCurrentIndex(1); - ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(0, 0), QVariant(0), Qt::UserRole - 1); + //ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(0, 0), QVariant(0), Qt::UserRole - 1); } else { ui->connectButton->setEnabled(ui->deviceCombo->count() > 0); ui->deviceCombo->setEnabled(!m_connectionManager->isConnected()); - ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(0, 0), QVariant(1), Qt::UserRole - 1); + //ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(0, 0), QVariant(1), Qt::UserRole - 1); ui->boardTypeCombo->setCurrentIndex(0); ui->boardTypeCombo->setEnabled(false); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui index f72b2d718..4c52939d1 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui @@ -25,7 +25,7 @@ 20 20 550 - 141 + 281 @@ -33,13 +33,15 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> 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;"> -<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;">Setup complete</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> -<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;">The wizard have now gathered enough information to create a baseline configuration for your OpenPilot controller board to use with your vehicle.</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;">Congratulations!</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;">Setup wizard is completed.</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:12pt; font-weight:600;"></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 setup procedure is now complete and you are one step away from having a complete setup of your OpenPilot controller.</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;"></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;">You now have two choices:</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:10pt;">- Upload configuration directly to the currently connected OpenPilot controller board.</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:10pt;">- Save the configuration to a file for later uploading using the configuration import plugin in GCS.</span></p></body></html> +<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;">To complete the setup please push the Input Wizard button below to close this wizard and go directly to the Input Wizard.</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;"></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;">Or close this wizard and go to the Input tab in the Configuration Plugin and run the wizard to configure the input signals to be used before trying to operate your vehicle. If you already have performed the Input configuration you can skip this step. </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;"></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -48,30 +50,17 @@ p, li { white-space: pre-wrap; } true - + - 420 - 290 - 125 - 23 - - - - Save configuration... - - - - - - 420 + 430 340 - 125 + 131 23 - Upload configuration + Go to Input Wizard... diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp new file mode 100644 index 000000000..452adaf02 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp @@ -0,0 +1,48 @@ +/** + ****************************************************************************** + * + * @file flashpage.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup FlashPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "flashpage.h" +#include "ui_flashpage.h" +#include "setupwizard.h" + +FlashPage::FlashPage(SetupWizard *wizard, QWidget *parent) : + AbstractWizardPage(wizard, parent), + + ui(new Ui::FlashPage) +{ + ui->setupUi(this); +} + +FlashPage::~FlashPage() +{ + delete ui; +} + +bool FlashPage::validatePage() +{ + return true; +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h new file mode 100644 index 000000000..7aeb7ffc4 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h @@ -0,0 +1,50 @@ +/** + ****************************************************************************** + * + * @file flashpage.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup FlashPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef FLASHPAGE_H +#define FLASHPAGE_H + +#include "abstractwizardpage.h" + +namespace Ui { +class FlashPage; +} + +class FlashPage : public AbstractWizardPage +{ + Q_OBJECT + +public: + explicit FlashPage(SetupWizard *wizard, QWidget *parent = 0); + ~FlashPage(); + bool validatePage(); + +private: + Ui::FlashPage *ui; +}; + +#endif // FLASHPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui new file mode 100644 index 000000000..fccf257e4 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui @@ -0,0 +1,70 @@ + + + FlashPage + + + + 0 + 0 + 600 + 400 + + + + WizardPage + + + + + 20 + 20 + 541 + 201 + + + + <!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"> +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;"> +<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 configuration ready to save</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:12pt; font-weight:600;"></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;">The wizard is now ready to write the configuration directly to your OpenPilot controller. This is only possible if the controller is connected and identified in the first step of this wizard. If the controller is not connected, or if the controller type was selected manually you can instead of writing the configuration to the controller save it to disk for later use.</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;"></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;">If any of the selections made in this wizard requires a reboot of the controller then that will be performed in this step.</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;"></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;">If you by any reason do not want to write the configuration directly to the controller you can choose to save the configuration to disk and then exit this wizard.</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + 20 + 240 + 561 + 141 + + + + + 0 + 0 + + + + Write configuration to controller or save + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp new file mode 100644 index 000000000..706077a57 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp @@ -0,0 +1,64 @@ +/** + ****************************************************************************** + * + * @file inputpage.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup InputPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "inputpage.h" +#include "ui_inputpage.h" +#include "setupwizard.h" + +InputPage::InputPage(SetupWizard *wizard, QWidget *parent) : + AbstractWizardPage(wizard, parent), + + ui(new Ui::InputPage) +{ + ui->setupUi(this); +} + +InputPage::~InputPage() +{ + delete ui; +} + +bool InputPage::validatePage() +{ + if(ui->pwmButton->isChecked()) { + getWizard()->setInputType(SetupWizard::INPUT_PWM); + } + else if(ui->ppmButton->isChecked()) { + getWizard()->setInputType(SetupWizard::INPUT_PPM); + } + else if(ui->sbusButton->isChecked()) { + getWizard()->setInputType(SetupWizard::INPUT_SBUS); + } + else if(ui->spectrumButton->isChecked()) { + getWizard()->setInputType(SetupWizard::INPUT_DSM); + } + else { + getWizard()->setInputType(SetupWizard::INPUT_PWM); + } + + return true; +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.h new file mode 100644 index 000000000..162146859 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.h @@ -0,0 +1,50 @@ +/** + ****************************************************************************** + * + * @file inputpage.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup InputPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef INPUTPAGE_H +#define INPUTPAGE_H + +#include "abstractwizardpage.h" + +namespace Ui { +class InputPage; +} + +class InputPage : public AbstractWizardPage +{ + Q_OBJECT + +public: + explicit InputPage(SetupWizard *wizard, QWidget *parent = 0); + ~InputPage(); + bool validatePage(); + +private: + Ui::InputPage *ui; +}; + +#endif // INPUTPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui new file mode 100644 index 000000000..0313ea314 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui @@ -0,0 +1,177 @@ + + + InputPage + + + + 0 + 0 + 600 + 400 + + + + WizardPage + + + + + 20 + 20 + 541 + 171 + + + + <!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"> +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;"> +<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 basic input signal 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:12pt; font-weight:600;"></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;">The OpenPilot controller supports many different types of input signals. Please select the type of input that matches your Receiver configuration. If you are unsure leave the default option selected and continue the wizard.</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;"></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;">Some input options require the OpenPilot controller to be rebooted before the changes can take place. If an option that requires a reboot is selected the controller will be rebooted at the end of this wizard after the configuration is written to the controller.</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + 20 + 200 + 561 + 181 + + + + + 0 + 0 + + + + Supported input signal types + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + 50 + 40 + 100 + 100 + + + + Tricopter, Quadcopter, Hexacopter, Octocopter + + + PWM +One cable +per channel + + + true + + + true + + + true + + + false + + + + + + 170 + 40 + 100 + 100 + + + + Airplane, Sloper, Jet + + + PPM +One cable +for all channels + + + true + + + true + + + false + + + + + + 290 + 40 + 100 + 100 + + + + Airplane, Sloper, Jet + + + Futaba +S.Bus + + + true + + + true + + + false + + + + + + 410 + 40 + 100 + 100 + + + + Airplane, Sloper, Jet + + + Spectrum +Satellite + + + true + + + true + + + false + + + + + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp new file mode 100644 index 000000000..0fbf9a385 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -0,0 +1,48 @@ +/** + ****************************************************************************** + * + * @file levellingpage.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup LevellingPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "levellingpage.h" +#include "ui_levellingpage.h" +#include "setupwizard.h" + +LevellingPage::LevellingPage(SetupWizard *wizard, QWidget *parent) : + AbstractWizardPage(wizard, parent), + + ui(new Ui::LevellingPage) +{ + ui->setupUi(this); +} + +LevellingPage::~LevellingPage() +{ + delete ui; +} + +bool LevellingPage::validatePage() +{ + return true; +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h new file mode 100644 index 000000000..4d45729a8 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h @@ -0,0 +1,50 @@ +/** + ****************************************************************************** + * + * @file levellingpage.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup LevellingPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef LEVELLINGPAGE_H +#define LEVELLINGPAGE_H + +#include "abstractwizardpage.h" + +namespace Ui { +class LevellingPage; +} + +class LevellingPage : public AbstractWizardPage +{ + Q_OBJECT + +public: + explicit LevellingPage(SetupWizard *wizard, QWidget *parent = 0); + ~LevellingPage(); + bool validatePage(); + +private: + Ui::LevellingPage *ui; +}; + +#endif // LEVELLINGPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui new file mode 100644 index 000000000..2fa973dfd --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui @@ -0,0 +1,96 @@ + + + LevellingPage + + + + 0 + 0 + 600 + 400 + + + + WizardPage + + + + + 20 + 20 + 541 + 201 + + + + <!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"> +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;"> +<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 controller levelling procedure</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:12pt; font-weight:600;"></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 step can only be performed if you have the OpenPilot controller connected and identified by the first step in this wizard.</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;"></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;">The wizard needs to get information from the controller about in which position the vehicle normally is considered to be level. To be able to successfully perform these measurements you need to place the vehicle on a flat and as level as possible surface. Example of such surfaces could be a table top or the floor. Be careful to assure that the vehicle really is level since this step will affect the accelerometer and gyro bias in the controller software.</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;"></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;">To perform the levelling, please push the Level button and wait for the process to finish.</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + 20 + 250 + 561 + 131 + + + + + 0 + 0 + + + + Accelerometer and gyro bias measurement + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + 20 + 90 + 531 + 23 + + + + 0 + + + + + + 424 + 40 + 91 + 23 + + + + Level... + + + + + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.cpp new file mode 100644 index 000000000..3e7313c37 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.cpp @@ -0,0 +1,55 @@ +/** + ****************************************************************************** + * + * @file outputpage.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup OutputPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "outputpage.h" +#include "ui_outputpage.h" +#include "setupwizard.h" + +OutputPage::OutputPage(SetupWizard *wizard, QWidget *parent) : + AbstractWizardPage(wizard, parent), + + ui(new Ui::OutputPage) +{ + ui->setupUi(this); +} + +OutputPage::~OutputPage() +{ + delete ui; +} + +bool OutputPage::validatePage() +{ + if(ui->rapidESCButton->isChecked()) { + getWizard()->setESCType(SetupWizard::ESC_RAPID); + } + else { + getWizard()->setESCType(SetupWizard::ESC_DEFAULT); + } + + return true; +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.h new file mode 100644 index 000000000..3a7130238 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.h @@ -0,0 +1,50 @@ +/** + ****************************************************************************** + * + * @file outputpage.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup OutputPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef OUTPUTPAGE_H +#define OUTPUTPAGE_H + +#include "abstractwizardpage.h" + +namespace Ui { +class OutputPage; +} + +class OutputPage : public AbstractWizardPage +{ + Q_OBJECT + +public: + explicit OutputPage(SetupWizard *wizard, QWidget *parent = 0); + ~OutputPage(); + bool validatePage(); + +private: + Ui::OutputPage *ui; +}; + +#endif // OUTPUTPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui new file mode 100644 index 000000000..37a5a9bb5 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui @@ -0,0 +1,123 @@ + + + OutputPage + + + + 0 + 0 + 600 + 400 + + + + WizardPage + + + + + 20 + 20 + 541 + 151 + + + + <!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"> +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;"> +<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 basic output signal 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:12pt; font-weight:600;"></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;">To set an optimal configuration of the output signals powering your motors used by your OpenPilot controller the wizard needs to know what type of Electronic Speed Controllers (ESC) you will use and what their capabilities are.</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;"></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 one of the options below. If you are unsure about the capabilities of your ESC:s just leave the default option selected and continue the wizard.</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + 20 + 200 + 561 + 181 + + + + + 0 + 0 + + + + Supported speed controller types + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + 50 + 40 + 100 + 100 + + + + Tricopter, Quadcopter, Hexacopter, Octocopter + + + Default ESC +50 Hz + + + true + + + true + + + true + + + false + + + + + + 170 + 40 + 100 + 100 + + + + Airplane, Sloper, Jet + + + Rapid ESC +400 Hz + + + true + + + true + + + false + + + + + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.cpp new file mode 100644 index 000000000..046fd6ae2 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.cpp @@ -0,0 +1,52 @@ +/** + ****************************************************************************** + * + * @file summarypage.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup SummaryPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "summarypage.h" +#include "ui_summarypage.h" +#include "setupwizard.h" + +SummaryPage::SummaryPage(SetupWizard *wizard, QWidget *parent) : + AbstractWizardPage(wizard, parent), + ui(new Ui::SummaryPage) +{ + ui->setupUi(this); +} + +SummaryPage::~SummaryPage() +{ + delete ui; +} + +bool SummaryPage::validatePage() +{ + return true; +} + +void SummaryPage::initializePage() +{ + ui->configurationSummary->setText(getWizard()->getSummaryText()); +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.h new file mode 100644 index 000000000..3f21a39e8 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.h @@ -0,0 +1,51 @@ +/** + ****************************************************************************** + * + * @file summarypage.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup SummaryPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef SUMMARYPAGE_H +#define SUMMARYPAGE_H + +#include "abstractwizardpage.h" + +namespace Ui { +class SummaryPage; +} + +class SummaryPage : public AbstractWizardPage +{ + Q_OBJECT + +public: + explicit SummaryPage(SetupWizard *wizard, QWidget *parent = 0); + ~SummaryPage(); + bool validatePage(); + void initializePage(); + +private: + Ui::SummaryPage *ui; +}; + +#endif // SUMMARYPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui new file mode 100644 index 000000000..4c91ec369 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui @@ -0,0 +1,124 @@ + + + SummaryPage + + + + 0 + 0 + 600 + 400 + + + + WizardPage + + + + + 20 + 20 + 541 + 211 + + + + <!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"> +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;"> +<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 configuration summary</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:12pt; font-weight:600;"></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;">The first part of this wizard is now complete. The information required to create a basic OpenPilot controller configuration has been collected and a configuration can be created and saved.</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;"></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;">Below is a summary of the configuration and a button that links to a schematic picture illustrating how to connect selected hardware and the OpenPilotController with the current 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:10pt;"></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;">To complete the wizard and write the confguration directly to the OpenPilot controller, or if no OpenPilotController is connected save the configuration to disk for later usage, please continue to the next and last step of this wizard.</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + 20 + 240 + 561 + 140 + + + + + 0 + 0 + + + + Summary of configuration + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + 440 + 20 + 100 + 100 + + + + Tricopter, Quadcopter, Hexacopter, Octocopter + + + Hardware +Configuration +Illustration + + + false + + + false + + + true + + + false + + + + + + 20 + 20 + 400 + 100 + + + + + 10 + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAlwaysOff + + + Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index f11762bf6..ba56e556e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -34,13 +34,21 @@ #include "pages/fixedwingpage.h" #include "pages/helipage.h" #include "pages/surfacepage.h" +#include "pages/inputpage.h" +#include "pages/outputpage.h" +#include "pages/levellingpage.h" +#include "pages/summarypage.h" +#include "pages/flashpage.h" #include "pages/notyetimplementedpage.h" SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent) { setWindowTitle("OpenPilot Setup Wizard"); + m_controllerSelectionMode = CONTROLLER_SELECTION_UNKNOWN; m_controllerType = CONTROLLER_UNKNOWN; m_vehicleType = VEHICLE_UNKNOWN; + m_escType = ESC_UNKNOWN; + m_inputType = INPUT_UNKNOWN; createPages(); } @@ -55,6 +63,8 @@ int SetupWizard::nextId() const case CONTROLLER_CC: case CONTROLLER_CC3D: return PAGE_VEHICLES; + case CONTROLLER_REVO: + case CONTROLLER_PIPX: default: return PAGE_NOTYETIMPLEMENTED; } @@ -62,19 +72,35 @@ int SetupWizard::nextId() const case PAGE_VEHICLES: { switch(getVehicleType()) { + case VEHICLE_MULTI: + return PAGE_MULTI; case VEHICLE_FIXEDWING: return PAGE_FIXEDWING; case VEHICLE_HELI: return PAGE_HELI; case VEHICLE_SURFACE: return PAGE_SURFACE; - case VEHICLE_MULTI: - return PAGE_MULTI; default: return PAGE_NOTYETIMPLEMENTED; } } case PAGE_MULTI: + return PAGE_INPUT; + case PAGE_INPUT: + return PAGE_OUTPUT; + case PAGE_OUTPUT: + { + if(getControllerSelectionMode() == CONTROLLER_SELECTION_AUTOMATIC) { + return PAGE_LEVELLING; + } else { + return PAGE_SUMMARY; + } + } + case PAGE_LEVELLING: + return PAGE_SUMMARY; + case PAGE_SUMMARY: + return PAGE_FLASH; + case PAGE_FLASH: return PAGE_END; case PAGE_NOTYETIMPLEMENTED: return PAGE_END; @@ -83,6 +109,85 @@ int SetupWizard::nextId() const } } +QString SetupWizard::getSummaryText() +{ + QString summary = ""; + summary.append(tr("Controller type: ")); + switch(getControllerType()) + { + case CONTROLLER_CC: + summary.append(tr("OpenPilot CopterControl")); + break; + case CONTROLLER_CC3D: + summary.append(tr("OpenPilot CopterControl 3D")); + break; + case CONTROLLER_REVO: + summary.append(tr("OpenPilot Revolution")); + break; + case CONTROLLER_PIPX: + summary.append(tr("OpenPilot PipX Radio Modem")); + break; + default: + summary.append(tr("Unknown")); + break; + } + + summary.append('\n'); + summary.append(tr("Vehicle type: ")); + switch (getVehicleType()) + { + case VEHICLE_MULTI: + summary.append(tr("Multirotor")); + break; + case VEHICLE_FIXEDWING: + summary.append(tr("Fixed wing")); + break; + case VEHICLE_HELI: + summary.append(tr("Helicopter")); + break; + case VEHICLE_SURFACE: + summary.append(tr("Surface vehicle")); + break; + default: + summary.append(tr("Unknown")); + } + + summary.append('\n'); + summary.append(tr("Input type: ")); + switch (getInputType()) + { + case INPUT_PWM: + summary.append(tr("PWM (One cable per channel)")); + break; + case INPUT_PPM: + summary.append(tr("PPM (One cable for all channels)")); + break; + case INPUT_SBUS: + summary.append(tr("Futaba S.Bus")); + break; + case INPUT_DSM: + summary.append(tr("Spectrum satellite")); + break; + default: + summary.append(tr("Unknown")); + } + + summary.append('\n'); + summary.append(tr("ESC type: ")); + switch (getInputType()) + { + case ESC_DEFAULT: + summary.append(tr("Default ESC (50 Hz)")); + break; + case ESC_RAPID: + summary.append(tr("Rapid ESC (400 Hz)")); + break; + default: + summary.append(tr("Unknown")); + } + return summary; +} + void SetupWizard::createPages() { setPage(PAGE_START, new StartPage(this)); @@ -92,6 +197,11 @@ void SetupWizard::createPages() setPage(PAGE_FIXEDWING, new FixedWingPage(this)); setPage(PAGE_HELI, new HeliPage(this)); setPage(PAGE_SURFACE, new SurfacePage(this)); + setPage(PAGE_INPUT, new InputPage(this)); + setPage(PAGE_OUTPUT, new OutputPage(this)); + setPage(PAGE_LEVELLING, new LevellingPage(this)); + setPage(PAGE_SUMMARY, new SummaryPage(this)); + setPage(PAGE_FLASH, new FlashPage(this)); setPage(PAGE_NOTYETIMPLEMENTED, new NotYetImplementedPage(this)); setPage(PAGE_END, new EndPage(this)); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h index 34b20dd81..4eec34156 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h @@ -37,11 +37,17 @@ class SetupWizard : public QWizard public: SetupWizard(QWidget *parent = 0); int nextId() const; + enum CONTROLLER_SELECTION_MODE {CONTROLLER_SELECTION_AUTOMATIC, CONTROLLER_SELECTION_MANUAL, CONTROLLER_SELECTION_UNKNOWN}; enum CONTROLLER_TYPE {CONTROLLER_UNKNOWN, CONTROLLER_CC, CONTROLLER_CC3D, CONTROLLER_REVO, CONTROLLER_PIPX}; enum VEHICLE_TYPE {VEHICLE_UNKNOWN, VEHICLE_MULTI, VEHICLE_FIXEDWING, VEHICLE_HELI, VEHICLE_SURFACE}; enum MULTI_ROTOR_SUB_TYPE {MULTI_ROTOR_UNKNOWN, MULTI_ROTOR_TRI_Y, MULTI_ROTOR_QUAD_X, MULTI_ROTOR_QUAD_PLUS, MULTI_ROTOR_HEXA, MULTI_ROTOR_HEXA_H, MULTI_ROTOR_HEXA_COAX_Y, MULTI_ROTOR_OCTO, MULTI_ROTOR_OCTO_V, MULTI_ROTOR_OCTO_COAX_X, MULTI_ROTOR_OCTO_COAX_PLUS}; + enum ESC_TYPE {ESC_DEFAULT, ESC_RAPID, ESC_UNKNOWN}; + enum INPUT_TYPE {INPUT_PWM, INPUT_PPM, INPUT_SBUS, INPUT_DSM, INPUT_UNKNOWN}; + + void setControllerSelectionMode(SetupWizard::CONTROLLER_SELECTION_MODE mode) { m_controllerSelectionMode = mode; } + SetupWizard::CONTROLLER_SELECTION_MODE getControllerSelectionMode() const { return m_controllerSelectionMode; } void setControllerType(SetupWizard::CONTROLLER_TYPE type) { m_controllerType = type; } SetupWizard::CONTROLLER_TYPE getControllerType() const { return m_controllerType; } @@ -49,13 +55,25 @@ public: void setVehicleType(SetupWizard::VEHICLE_TYPE type) { m_vehicleType = type; } SetupWizard::VEHICLE_TYPE getVehicleType() const { return m_vehicleType; } + void setInputType(SetupWizard::INPUT_TYPE type) { m_inputType = type; } + SetupWizard::INPUT_TYPE getInputType() const { return m_inputType; } + + void setESCType(SetupWizard::ESC_TYPE type) { m_escType = type; } + SetupWizard::ESC_TYPE getESCType() const { return m_escType; } + + QString getSummaryText(); + private: enum {PAGE_START, PAGE_CONTROLLER, PAGE_VEHICLES, PAGE_MULTI, PAGE_FIXEDWING, - PAGE_HELI, PAGE_SURFACE, PAGE_NOTYETIMPLEMENTED, PAGE_END}; + PAGE_HELI, PAGE_SURFACE, PAGE_INPUT, PAGE_OUTPUT, PAGE_LEVELLING, + PAGE_FLASH, PAGE_SUMMARY, PAGE_NOTYETIMPLEMENTED, PAGE_END}; void createPages(); + CONTROLLER_SELECTION_MODE m_controllerSelectionMode; CONTROLLER_TYPE m_controllerType; VEHICLE_TYPE m_vehicleType; + INPUT_TYPE m_inputType; + ESC_TYPE m_escType; }; #endif // SETUPWIZARD_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro index 98ece1c83..721f76ed6 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro @@ -18,8 +18,14 @@ HEADERS += setupwizardplugin.h \ pages/fixedwingpage.h \ pages/helipage.h \ pages/surfacepage.h \ - pages/abstractwizardpage.h -SOURCES += setupwizardplugin.cpp \ + pages/abstractwizardpage.h \ + pages/outputpage.h \ + pages/inputpage.h \ + pages/summarypage.h \ + pages/flashpage.h \ + pages/levellingpage.h + +SOURCES += setupwizardplugin.cpp \ setupwizard.cpp \ pages/startpage.cpp \ pages/endpage.cpp \ @@ -30,8 +36,13 @@ SOURCES += setupwizardplugin.cpp \ pages/fixedwingpage.cpp \ pages/helipage.cpp \ pages/surfacepage.cpp \ - pages/abstractwizardpage.cpp - + pages/abstractwizardpage.cpp \ + pages/outputpage.cpp \ + pages/inputpage.cpp \ + pages/summarypage.cpp \ + pages/flashpage.cpp \ + pages/levellingpage.cpp + OTHER_FILES += SetupWizard.pluginspec FORMS += \ @@ -43,7 +54,12 @@ FORMS += \ pages/multipage.ui \ pages/fixedwingpage.ui \ pages/helipage.ui \ - pages/surfacepage.ui + pages/surfacepage.ui \ + pages/outputpage.ui \ + pages/inputpage.ui \ + pages/summarypage.ui \ + pages/flashpage.ui \ + pages/levellingpage.ui RESOURCES += \ wizardResources.qrc From 6913b1b4de290e75118af4c5d2ce8dc7b1b465de Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Thu, 2 Aug 2012 13:44:14 +0200 Subject: [PATCH 02/56] Added Levelling functionality. --- .../src/plugins/setupwizard/levellingutil.cpp | 179 ++++++++++++++++++ .../src/plugins/setupwizard/levellingutil.h | 95 ++++++++++ .../setupwizard/pages/controllerpage.cpp | 2 +- .../setupwizard/pages/levellingpage.cpp | 78 +++++++- .../plugins/setupwizard/pages/levellingpage.h | 14 ++ .../setupwizard/pages/levellingpage.ui | 12 +- .../src/plugins/setupwizard/setupwizard.cpp | 20 +- .../src/plugins/setupwizard/setupwizard.h | 21 ++ .../src/plugins/setupwizard/setupwizard.pro | 6 +- 9 files changed, 409 insertions(+), 18 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/levellingutil.cpp create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/levellingutil.h diff --git a/ground/openpilotgcs/src/plugins/setupwizard/levellingutil.cpp b/ground/openpilotgcs/src/plugins/setupwizard/levellingutil.cpp new file mode 100644 index 000000000..0678ad136 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/levellingutil.cpp @@ -0,0 +1,179 @@ +/** + ****************************************************************************** + * + * @file levellingutil.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup LevellingUtil + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "levellingutil.h" +#include "extensionsystem/pluginmanager.h" +#include "uavobjectmanager.h" +#include "attitudesettings.h" +#include "accels.h" +#include "gyros.h" + + +LevellingUtil::LevellingUtil(long measurementCount, long measurementPeriod) : QObject(), + m_isMeasuring(false), m_measurementCount(measurementCount), m_measurementPeriod(measurementPeriod) +{ +} + +void LevellingUtil::start() +{ + if(!m_isMeasuring) { + startMeasurement(); + + // Set up timeout timer + connect(&m_timeoutTimer, SIGNAL(timeout()), this, SLOT(timeout())); + m_timeoutTimer.start(m_measurementCount * m_measurementPeriod * 2); + } +} + +void LevellingUtil::abort() +{ + if(m_isMeasuring) { + stopMeasurement(); + } +} + +void LevellingUtil::measurementsUpdated(UAVObject *obj) +{ + QMutexLocker locker(&m_measurementMutex); + + m_receivedUpdates++; + emit progress(m_receivedUpdates, m_measurementCount); + + if(m_receivedUpdates < m_measurementCount) { + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager * uavObjectManager = pm->getObject(); + Q_ASSERT(uavObjectManager); + + Accels * accels = Accels::GetInstance(uavObjectManager); + Accels::DataFields accelsData = accels->getData(); + + m_accelerometerX.append(accelsData.x); + m_accelerometerY.append(accelsData.y); + m_accelerometerZ.append(accelsData.z); + + Gyros * gyros = Gyros::GetInstance(uavObjectManager); + Gyros::DataFields gyrosData = gyros->getData(); + + m_gyroX.append(gyrosData.x); + m_gyroY.append(gyrosData.y); + m_gyroZ.append(gyrosData.z); + } + else if (m_receivedUpdates >= m_measurementCount) { + stopMeasurement(); + emit done(calculateLevellingData()); + } +} + +void LevellingUtil::timeout() +{ + QMutexLocker locker(&m_measurementMutex); + + stopMeasurement(); + emit timeout(tr("Calibration timed out before receiving required updates.")); +} + +void LevellingUtil::startMeasurement() +{ + QMutexLocker locker(&m_measurementMutex); + + m_isMeasuring = true; + + // Reset variables + m_receivedUpdates = 0; + m_accelerometerX.clear(); + m_accelerometerY.clear(); + m_accelerometerZ.clear(); + m_gyroX.clear(); + m_gyroY.clear(); + m_gyroZ.clear(); + + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager * uavObjectManager = pm->getObject(); + Q_ASSERT(uavObjectManager); + + // Disable gyro bias correction to see raw data + AttitudeSettings::DataFields attitudeSettingsData = AttitudeSettings::GetInstance(uavObjectManager)->getData(); + attitudeSettingsData.BiasCorrectGyro = AttitudeSettings::BIASCORRECTGYRO_FALSE; + AttitudeSettings::GetInstance(uavObjectManager)->setData(attitudeSettingsData); + + // Set up to receive updates + UAVDataObject *uavObject = Accels::GetInstance(uavObjectManager); + connect(uavObject, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(measurementsUpdated(UAVObject*))); + + // Set update period + m_previousMetaData = uavObject->getMetadata(); + UAVObject::Metadata newMetaData = m_previousMetaData; + UAVObject::SetFlightTelemetryUpdateMode(newMetaData, UAVObject::UPDATEMODE_PERIODIC); + newMetaData.flightTelemetryUpdatePeriod = m_measurementPeriod; + uavObject->setMetadata(newMetaData); +} + +void LevellingUtil::stopMeasurement() +{ + m_isMeasuring = false; + + //Stop timeout timer + m_timeoutTimer.stop(); + disconnect(&m_timeoutTimer, SIGNAL(timeout()), this, SLOT(timeout())); + + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager * uavObjectManager = pm->getObject(); + Q_ASSERT(uavObjectManager); + + // Stop listening for updates + UAVDataObject *uavObject = Accels::GetInstance(uavObjectManager); + disconnect(uavObject, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(measurementsUpdated(UAVObject*))); + uavObject->setMetadata(m_previousMetaData); + + // Enable gyro bias correction again + AttitudeSettings::DataFields attitudeSettingsData = AttitudeSettings::GetInstance(uavObjectManager)->getData(); + attitudeSettingsData.BiasCorrectGyro = AttitudeSettings::BIASCORRECTGYRO_TRUE; + AttitudeSettings::GetInstance(uavObjectManager)->setData(attitudeSettingsData); +} + +accelGyroBias LevellingUtil::calculateLevellingData() +{ + accelGyroBias bias; + bias.m_accelerometerXBias = listMean(m_accelerometerX) / ACCELERATION_SCALE; + bias.m_accelerometerYBias = listMean(m_accelerometerY) / ACCELERATION_SCALE; + bias.m_accelerometerZBias = (listMean(m_accelerometerZ) + G) / ACCELERATION_SCALE; + + bias.m_gyroXBias = listMean(m_gyroX) * 100.0f; + bias.m_gyroYBias = listMean(m_gyroY) * 100.0f; + bias.m_gyroZBias = listMean(m_gyroZ) * 100.0f; + return bias; +} + +double LevellingUtil::listMean(QList list) +{ + double accum = 0; + for(int i = 0; i < list.size(); i++) { + accum += list.at(i); + } + return accum / list.size(); +} + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/levellingutil.h b/ground/openpilotgcs/src/plugins/setupwizard/levellingutil.h new file mode 100644 index 000000000..0db8a23c0 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/levellingutil.h @@ -0,0 +1,95 @@ +/** + ****************************************************************************** + * + * @file levellingutil.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup LevellingUtil + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef LEVELLINGUTIL_H +#define LEVELLINGUTIL_H + +#include +#include +#include + +#include "uavobject.h" + +struct accelGyroBias { + float m_accelerometerXBias; + float m_accelerometerYBias; + float m_accelerometerZBias; + + float m_gyroXBias; + float m_gyroYBias; + float m_gyroZBias; +}; + +class LevellingUtil : public QObject +{ + Q_OBJECT +public: + explicit LevellingUtil(long measurementCount, long measurementPeriod); + +signals: + void progress(long current, long total); + void done(accelGyroBias measuredBias); + void timeout(QString message); + +public slots: + void start(); + void abort(); + +private slots: + void measurementsUpdated(UAVObject * obj); + void timeout(); + +private: + static const float G = 9.81f; + static const float ACCELERATION_SCALE = 0.004f * 9.81f; + + QMutex m_measurementMutex; + QTimer m_timeoutTimer; + + bool m_isMeasuring; + long m_receivedUpdates; + + long m_measurementCount; + long m_measurementPeriod; + + UAVObject::Metadata m_previousMetaData; + + QList m_accelerometerX; + QList m_accelerometerY; + QList m_accelerometerZ; + QList m_gyroX; + QList m_gyroY; + QList m_gyroZ; + + void stop(); + void startMeasurement(); + void stopMeasurement(); + accelGyroBias calculateLevellingData(); + double listMean(QList list); +}; + +#endif // LEVELLINGUTIL_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp index a0bff4c73..54e63ad5d 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp @@ -38,7 +38,7 @@ ControllerPage::ControllerPage(SetupWizard *wizard, QWidget *parent) : { ui->setupUi(this); - m_connectionManager = Core::ICore::instance()->connectionManager(); + m_connectionManager = getWizard()->getConnectionManager(); Q_ASSERT(m_connectionManager); connect(m_connectionManager, SIGNAL(availableDevicesChanged(QLinkedList)), this, SLOT(devicesChanged(QLinkedList))); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp index 0fbf9a385..8128a3717 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -25,20 +25,24 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include "levellingpage.h" #include "ui_levellingpage.h" #include "setupwizard.h" LevellingPage::LevellingPage(SetupWizard *wizard, QWidget *parent) : - AbstractWizardPage(wizard, parent), - - ui(new Ui::LevellingPage) + AbstractWizardPage(wizard, parent), + ui(new Ui::LevellingPage), m_levellingUtil(0) { ui->setupUi(this); + connect(ui->levelButton, SIGNAL(clicked()), this, SLOT(performLevelling())); } LevellingPage::~LevellingPage() { + if(m_levellingUtil) { + delete m_levellingUtil; + } delete ui; } @@ -46,3 +50,71 @@ bool LevellingPage::validatePage() { return true; } + +bool LevellingPage::isComplete() +{ + return getWizard()->isLevellingPerformed(); +} + +void LevellingPage::performLevelling() +{ + if(!getWizard()->getConnectionManager()->isConnected()) { + QMessageBox msgBox; + msgBox.setText(tr("An OpenPilot controller must be connected to your computer to perform bias calculations.\nPlease connect your OpenPilot controller to continue.")); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.exec(); + return; + } + + if(!m_levellingUtil) + { + ui->levelButton->setEnabled(false); + + // Measure every 100ms * 100times = 10s + m_levellingUtil = new LevellingUtil(BIAS_CYCLES, BIAS_PERIOD); + connect(m_levellingUtil, SIGNAL(progress(long,long)), this, SLOT(levellingProgress(long,long))); + connect(m_levellingUtil, SIGNAL(done(accelGyroBias)), this, SLOT(levellingDone(accelGyroBias))); + connect(m_levellingUtil, SIGNAL(timeout(QString)), this, SLOT(levellingTimeout(QString))); + } + m_levellingUtil->start(); +} + +void LevellingPage::levellingProgress(long current, long total) +{ + if(!ui->levellinProgressBar->maximum() != (int)total) { + ui->levellinProgressBar->setMaximum((int)total); + } + if(ui->levellinProgressBar->value() != (int)current) { + ui->levellinProgressBar->setValue((int)current); + } +} + +void LevellingPage::levellingDone(accelGyroBias bias) +{ + stopLevelling(); + getWizard()->setLevellingBias(bias); + emit completeChanged(); +} + +void LevellingPage::levellingTimeout(QString message) +{ + stopLevelling(); + + QMessageBox msgBox; + msgBox.setText(message); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.exec(); +} + +void LevellingPage::stopLevelling() +{ + if(m_levellingUtil) + { + disconnect(m_levellingUtil, SIGNAL(progress(long,long)), this, SLOT(levellingProgress(long,long))); + disconnect(m_levellingUtil, SIGNAL(done(accelGyroBias)), this, SLOT(levellingDone(accelGyroBias))); + disconnect(m_levellingUtil, SIGNAL(timeout(QString)), this, SLOT(levellingTimeout(QString))); + ui->levelButton->setEnabled(true); + } +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h index 4d45729a8..870ae5e6f 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h @@ -29,6 +29,7 @@ #define LEVELLINGPAGE_H #include "abstractwizardpage.h" +#include "levellingutil.h" namespace Ui { class LevellingPage; @@ -42,9 +43,22 @@ public: explicit LevellingPage(SetupWizard *wizard, QWidget *parent = 0); ~LevellingPage(); bool validatePage(); + bool isComplete(); + +private slots: + void performLevelling(); + void levellingProgress(long current, long total); + void levellingDone(accelGyroBias bias); + void levellingTimeout(QString message); private: + static const int BIAS_CYCLES = 100; + static const int BIAS_PERIOD = 100; + Ui::LevellingPage *ui; + LevellingUtil *m_levellingUtil; + + void stopLevelling(); }; #endif // LEVELLINGPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui index 2fa973dfd..9cf9ee148 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui @@ -33,7 +33,7 @@ p, li { white-space: pre-wrap; } <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;"></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;">The wizard needs to get information from the controller about in which position the vehicle normally is considered to be level. To be able to successfully perform these measurements you need to place the vehicle on a flat and as level as possible surface. Example of such surfaces could be a table top or the floor. Be careful to assure that the vehicle really is level since this step will affect the accelerometer and gyro bias in the controller software.</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;"></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;">To perform the levelling, please push the Level button and wait for the process to finish.</span></p></body></html> +<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;">To perform the levelling, please push the Calculate button and wait for the process to finish.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -63,7 +63,7 @@ p, li { white-space: pre-wrap; } Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - + 20 @@ -76,17 +76,17 @@ p, li { white-space: pre-wrap; } 0 - + - 424 + 414 40 - 91 + 101 23 - Level... + Calculate... diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index ba56e556e..2b32d7a31 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -41,14 +41,12 @@ #include "pages/flashpage.h" #include "pages/notyetimplementedpage.h" -SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent) +SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), + m_controllerSelectionMode(CONTROLLER_SELECTION_UNKNOWN), m_controllerType(CONTROLLER_UNKNOWN), + m_vehicleType(VEHICLE_UNKNOWN), m_inputType(INPUT_UNKNOWN), m_escType(ESC_UNKNOWN), + m_levellingPerformed(false), m_connectionManager(0) { setWindowTitle("OpenPilot Setup Wizard"); - m_controllerSelectionMode = CONTROLLER_SELECTION_UNKNOWN; - m_controllerType = CONTROLLER_UNKNOWN; - m_vehicleType = VEHICLE_UNKNOWN; - m_escType = ESC_UNKNOWN; - m_inputType = INPUT_UNKNOWN; createPages(); } @@ -185,6 +183,16 @@ QString SetupWizard::getSummaryText() default: summary.append(tr("Unknown")); } + + summary.append('\n'); + summary.append(tr("Accel & Gyro bias calibrated: ")); + if (isLevellingPerformed()) { + summary.append(tr("Yes")); + } + else { + summary.append(tr("No")); + } + return summary; } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h index 4eec34156..b88f5e4c9 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h @@ -29,6 +29,9 @@ #define SETUPWIZARD_H #include +#include "levellingutil.h" +#include +#include class SetupWizard : public QWizard { @@ -61,8 +64,21 @@ public: void setESCType(SetupWizard::ESC_TYPE type) { m_escType = type; } SetupWizard::ESC_TYPE getESCType() const { return m_escType; } + void setLevellingBias(accelGyroBias bias) { m_levellingBias = bias; m_levellingPerformed = true; } + bool isLevellingPerformed() { return m_levellingPerformed; } + accelGyroBias getLevellingBias() const { return m_levellingBias; } + + QString getSummaryText(); + Core::ConnectionManager* getConnectionManager() { + if (!m_connectionManager) { + m_connectionManager = Core::ICore::instance()->connectionManager(); + Q_ASSERT(m_connectionManager); + } + return m_connectionManager; + } + private: enum {PAGE_START, PAGE_CONTROLLER, PAGE_VEHICLES, PAGE_MULTI, PAGE_FIXEDWING, PAGE_HELI, PAGE_SURFACE, PAGE_INPUT, PAGE_OUTPUT, PAGE_LEVELLING, @@ -74,6 +90,11 @@ private: VEHICLE_TYPE m_vehicleType; INPUT_TYPE m_inputType; ESC_TYPE m_escType; + bool m_levellingPerformed; + accelGyroBias m_levellingBias; + + Core::ConnectionManager *m_connectionManager; + }; #endif // SETUPWIZARD_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro index 721f76ed6..ff858f29d 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro @@ -23,7 +23,8 @@ HEADERS += setupwizardplugin.h \ pages/inputpage.h \ pages/summarypage.h \ pages/flashpage.h \ - pages/levellingpage.h + pages/levellingpage.h \ + levellingutil.h SOURCES += setupwizardplugin.cpp \ setupwizard.cpp \ @@ -41,7 +42,8 @@ SOURCES += setupwizardplugin.cpp \ pages/inputpage.cpp \ pages/summarypage.cpp \ pages/flashpage.cpp \ - pages/levellingpage.cpp + pages/levellingpage.cpp \ + levellingutil.cpp OTHER_FILES += SetupWizard.pluginspec From 86f210e7f49a75a76af20efcf8d85a196cabacde Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Fri, 3 Aug 2012 18:31:47 +0200 Subject: [PATCH 03/56] OP-39 Added code to jump from the SetupWizard directly to the InputWizard in the ConfigurationPlugin to complete the vehicle setup and realize the 1-2-Fly idea. Re-factored some code in the ConfigurationPlugin. Fixed a bug in the Levelling page when performing levelling multiple times. --- .../src/libs/utils/mytabbedstackwidget.h | 1 + .../src/plugins/config/configgadgetfactory.cpp | 11 ++++++++--- .../src/plugins/config/configgadgetfactory.h | 9 ++++++++- .../src/plugins/config/configgadgetwidget.cpp | 8 ++++++++ .../src/plugins/config/configgadgetwidget.h | 1 + .../src/plugins/config/configinputwidget.cpp | 1 + .../src/plugins/config/configinputwidget.h | 6 +++--- .../src/plugins/config/configplugin.cpp | 2 +- .../src/plugins/setupwizard/pages/endpage.cpp | 18 +++++++++++++++++- .../src/plugins/setupwizard/pages/endpage.h | 3 +++ .../setupwizard/pages/levellingpage.cpp | 18 ++++++++++-------- .../plugins/setupwizard/pages/levellingpage.h | 2 +- .../src/plugins/setupwizard/setupwizard.cpp | 2 +- .../src/plugins/setupwizard/setupwizard.pro | 3 ++- 14 files changed, 65 insertions(+), 20 deletions(-) diff --git a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.h b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.h index f32524ce5..5faad8222 100644 --- a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.h +++ b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.h @@ -52,6 +52,7 @@ public: void insertCornerWidget(int index, QWidget *widget); int cornerWidgetCount() { return m_cornerWidgetCount; } QWidget * currentWidget(){return m_stackWidget->currentWidget();} + QWidget * getWidget(int index) {return m_stackWidget->widget(index);} signals: void currentAboutToShow(int index,bool * proceed); diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp b/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp index 37447b01a..b468adf02 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp +++ b/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp @@ -25,14 +25,14 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "configgadgetfactory.h" -#include "configgadgetwidget.h" #include "configgadget.h" #include "configgadgetconfiguration.h" #include "configgadgetoptionspage.h" #include ConfigGadgetFactory::ConfigGadgetFactory(QObject *parent) : - IUAVGadgetFactory(QString("ConfigGadget"), tr("Config Gadget"), parent) + IUAVGadgetFactory(QString("ConfigGadget"), tr("Config Gadget"), parent), + gadgetWidget(0) { } @@ -42,7 +42,7 @@ ConfigGadgetFactory::~ConfigGadgetFactory() Core::IUAVGadget* ConfigGadgetFactory::createGadget(QWidget *parent) { - ConfigGadgetWidget* gadgetWidget = new ConfigGadgetWidget(parent); + gadgetWidget = new ConfigGadgetWidget(parent); return new ConfigGadget(QString("ConfigGadget"), gadgetWidget, parent); } @@ -55,3 +55,8 @@ IOptionsPage *ConfigGadgetFactory::createOptionsPage(IUAVGadgetConfiguration *co { return new ConfigGadgetOptionsPage(qobject_cast(config)); } + +void ConfigGadgetFactory::startInputWizard() +{ + gadgetWidget->startInputWizard(); +} diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetfactory.h b/ground/openpilotgcs/src/plugins/config/configgadgetfactory.h index 8d371e746..77963a842 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetfactory.h +++ b/ground/openpilotgcs/src/plugins/config/configgadgetfactory.h @@ -28,6 +28,9 @@ #define CONFIGGADGETFACTORY_H #include +#include "configgadgetwidget.h" +#include "config_global.h" + namespace Core { class IUAVGadget; @@ -36,7 +39,7 @@ class IUAVGadgetFactory; using namespace Core; -class ConfigGadgetFactory: public Core::IUAVGadgetFactory +class CONFIG_EXPORT ConfigGadgetFactory: public Core::IUAVGadgetFactory { Q_OBJECT public: @@ -47,6 +50,10 @@ public: IUAVGadget *createGadget(QWidget *parent); IUAVGadgetConfiguration *createConfiguration(QSettings* qSettings); IOptionsPage *createOptionsPage(IUAVGadgetConfiguration *config); + void startInputWizard(); + +private: + ConfigGadgetWidget* gadgetWidget; }; #endif // CONFIGGADGETFACTORY_H diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp index c12dbaee8..df49eb5db 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp @@ -127,6 +127,14 @@ ConfigGadgetWidget::~ConfigGadgetWidget() // TODO: properly delete all the tabs in ftw before exiting } +void ConfigGadgetWidget::startInputWizard() +{ + ftw->setCurrentIndex(ConfigGadgetWidget::input); + ConfigInputWidget* inputWidget = dynamic_cast(ftw->getWidget(ConfigGadgetWidget::input)); + Q_ASSERT(inputWidget); + inputWidget->startInputWizard(); +} + void ConfigGadgetWidget::resizeEvent(QResizeEvent *event) { diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.h b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.h index 5e9dc6e67..0b2331329 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.h +++ b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.h @@ -51,6 +51,7 @@ public: ConfigGadgetWidget(QWidget *parent = 0); ~ConfigGadgetWidget(); enum widgetTabs {hardware=0, aircraft, input, output, sensors, stabilization, camerastabilization, txpid, pipxtreme}; + void startInputWizard(); public slots: void onAutopilotConnect(); diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 7952b3d70..27d830b01 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -280,6 +280,7 @@ void ConfigInputWidget::openHelp() QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Input+Configuration", QUrl::StrictMode) ); } + void ConfigInputWidget::goToWizard() { QMessageBox msgBox; diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.h b/ground/openpilotgcs/src/plugins/config/configinputwidget.h index 418fbdfee..25f029e63 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.h +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.h @@ -57,7 +57,7 @@ public: enum txMovements{moveLeftVerticalStick,moveRightVerticalStick,moveLeftHorizontalStick,moveRightHorizontalStick,moveAccess0,moveAccess1,moveAccess2,moveFlightMode,centerAll,moveAll,nothing}; enum txMovementType{vertical,horizontal,jump,mix}; enum txType {acro, heli}; -public slots: + void startInputWizard() { goToWizard(); } private: bool growing; @@ -133,6 +133,7 @@ private: void wizardSetUpStep(enum wizardSteps); void wizardTearDownStep(enum wizardSteps); + private slots: void wzNext(); void wzBack(); @@ -150,11 +151,10 @@ private slots: void invertControls(); void simpleCalibration(bool state); void updateCalibration(); + protected: void resizeEvent(QResizeEvent *event); virtual void enableControls(bool enable); - - }; #endif diff --git a/ground/openpilotgcs/src/plugins/config/configplugin.cpp b/ground/openpilotgcs/src/plugins/config/configplugin.cpp index 30418094c..fd3a30544 100644 --- a/ground/openpilotgcs/src/plugins/config/configplugin.cpp +++ b/ground/openpilotgcs/src/plugins/config/configplugin.cpp @@ -99,7 +99,7 @@ void ConfigPlugin::extensionsInitialized() void ConfigPlugin::shutdown() { - // Do nothing + // Do nothing } /** diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp index dda55196e..2df3f9e79 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp @@ -26,16 +26,32 @@ */ #include "endpage.h" #include "ui_endpage.h" +#include +#include +#include EndPage::EndPage(SetupWizard *wizard, QWidget *parent) : AbstractWizardPage(wizard, parent), ui(new Ui::EndPage) { - setFinalPage(true); ui->setupUi(this); + setFinalPage(true); + connect(ui->inputWizardButton, SIGNAL(clicked()), this, SLOT(openInputWizard())); } EndPage::~EndPage() { delete ui; } + +void EndPage::openInputWizard() +{ + Core::ModeManager::instance()->activateModeByWorkspaceName("Configuration"); + + getWizard()->close(); + + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + ConfigGadgetFactory* configGadgetFactory = pm->getObject(); + Q_ASSERT(configGadgetFactory); + configGadgetFactory->startInputWizard(); +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.h index afbeb6177..dfbad7942 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.h @@ -42,6 +42,9 @@ public: explicit EndPage(SetupWizard *wizard, QWidget *parent = 0); ~EndPage(); +private slots: + void openInputWizard(); + private: Ui::EndPage *ui; }; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp index 8128a3717..cabde07b7 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -51,16 +51,18 @@ bool LevellingPage::validatePage() return true; } -bool LevellingPage::isComplete() +bool LevellingPage::isComplete() const { - return getWizard()->isLevellingPerformed(); + return const_cast(this)->getWizard()->isLevellingPerformed() && + ui->levelButton->isEnabled(); } void LevellingPage::performLevelling() { if(!getWizard()->getConnectionManager()->isConnected()) { QMessageBox msgBox; - msgBox.setText(tr("An OpenPilot controller must be connected to your computer to perform bias calculations.\nPlease connect your OpenPilot controller to continue.")); + msgBox.setText(tr("An OpenPilot controller must be connected to your computer to perform bias " + "calculations.\nPlease connect your OpenPilot controller to continue.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); @@ -69,14 +71,14 @@ void LevellingPage::performLevelling() if(!m_levellingUtil) { - ui->levelButton->setEnabled(false); - // Measure every 100ms * 100times = 10s m_levellingUtil = new LevellingUtil(BIAS_CYCLES, BIAS_PERIOD); - connect(m_levellingUtil, SIGNAL(progress(long,long)), this, SLOT(levellingProgress(long,long))); - connect(m_levellingUtil, SIGNAL(done(accelGyroBias)), this, SLOT(levellingDone(accelGyroBias))); - connect(m_levellingUtil, SIGNAL(timeout(QString)), this, SLOT(levellingTimeout(QString))); } + connect(m_levellingUtil, SIGNAL(progress(long,long)), this, SLOT(levellingProgress(long,long))); + connect(m_levellingUtil, SIGNAL(done(accelGyroBias)), this, SLOT(levellingDone(accelGyroBias))); + connect(m_levellingUtil, SIGNAL(timeout(QString)), this, SLOT(levellingTimeout(QString))); + ui->levelButton->setEnabled(false); + emit completeChanged(); m_levellingUtil->start(); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h index 870ae5e6f..b5f555ecc 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h @@ -43,7 +43,7 @@ public: explicit LevellingPage(SetupWizard *wizard, QWidget *parent = 0); ~LevellingPage(); bool validatePage(); - bool isComplete(); + bool isComplete() const; private slots: void performLevelling(); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index 2b32d7a31..f68c942ef 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -172,7 +172,7 @@ QString SetupWizard::getSummaryText() summary.append('\n'); summary.append(tr("ESC type: ")); - switch (getInputType()) + switch (getESCType()) { case ESC_DEFAULT: summary.append(tr("Default ESC (50 Hz)")); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro index ff858f29d..d3a6dc0da 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro @@ -6,7 +6,8 @@ QT += svg include(../../openpilotgcsplugin.pri) include(../../plugins/coreplugin/coreplugin.pri) include(../../plugins/uavobjectutil/uavobjectutil.pri) - +include(../../plugins/config/config.pri) + HEADERS += setupwizardplugin.h \ setupwizard.h \ pages/startpage.h \ From bc6709cfb30681617326e20249e517bfe8a5d687 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Mon, 13 Aug 2012 19:52:39 +0200 Subject: [PATCH 04/56] Added button imgaes for the wizard and created a resource file to host them. --- .../plugins/setupwizard/pages/flashpage.ui | 5 +- .../plugins/setupwizard/pages/inputpage.ui | 2 +- .../plugins/setupwizard/pages/vehiclepage.ui | 118 +++++++++++++++--- .../setupwizard/resources/bttn-heli-down.png | Bin 0 -> 3474 bytes .../setupwizard/resources/bttn-heli-over.png | Bin 0 -> 3479 bytes .../setupwizard/resources/bttn-heli-up.png | Bin 0 -> 4211 bytes .../setupwizard/resources/bttn-land-down.png | Bin 0 -> 3995 bytes .../setupwizard/resources/bttn-land-over.png | Bin 0 -> 3772 bytes .../setupwizard/resources/bttn-land-up.png | Bin 0 -> 4772 bytes .../setupwizard/resources/bttn-multi-down.png | Bin 0 -> 6634 bytes .../setupwizard/resources/bttn-multi-over.png | Bin 0 -> 5990 bytes .../setupwizard/resources/bttn-multi-up.png | Bin 0 -> 7872 bytes .../setupwizard/resources/bttn-plane-down.png | Bin 0 -> 3917 bytes .../setupwizard/resources/bttn-plane-over.png | Bin 0 -> 3900 bytes .../setupwizard/resources/bttn-plane-up.png | Bin 0 -> 4773 bytes .../plugins/setupwizard/wizardResources.qrc | 15 ++- 16 files changed, 118 insertions(+), 22 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-heli-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-heli-over.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-heli-up.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-land-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-land-over.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-land-up.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-multi-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-multi-over.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-multi-up.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-plane-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-plane-over.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-plane-up.png diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui index fccf257e4..a354302b8 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui @@ -31,9 +31,8 @@ p, li { white-space: pre-wrap; } <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;"></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;">The wizard is now ready to write the configuration directly to your OpenPilot controller. This is only possible if the controller is connected and identified in the first step of this wizard. If the controller is not connected, or if the controller type was selected manually you can instead of writing the configuration to the controller save it to disk for later use.</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;"></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;">If any of the selections made in this wizard requires a reboot of the controller then that will be performed in this step.</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;"></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;">If you by any reason do not want to write the configuration directly to the controller you can choose to save the configuration to disk and then exit this wizard.</span></p></body></html> +<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;">If any of the selections made in this wizard requires a reboot of the controller then that will have to be performed after this step by power cycling the OpenPilot controller board.</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;"></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui index 0313ea314..0512ac8c3 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui @@ -31,7 +31,7 @@ p, li { white-space: pre-wrap; } <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;"></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;">The OpenPilot controller supports many different types of input signals. Please select the type of input that matches your Receiver configuration. If you are unsure leave the default option selected and continue the wizard.</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;"></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;">Some input options require the OpenPilot controller to be rebooted before the changes can take place. If an option that requires a reboot is selected the controller will be rebooted at the end of this wizard after the configuration is written to the controller.</span></p></body></html> +<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;">Some input options require the OpenPilot controller to be rebooted before the changes can take place. If an option that requires a reboot is selected the controller will need to be rebooted at the end of this wizard after the configuration is written to the controller.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui index fdc2d47d2..ef49dbd5f 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui @@ -61,21 +61,40 @@ p, li { white-space: pre-wrap; } Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - + 50 40 100 - 100 + 120 Tricopter, Quadcopter, Hexacopter, Octocopter + + false + + + QToolButton { border: none } + Multirotor + + + :/setupwizard/resources/bttn-multi-up.png + :/setupwizard/resources/bttn-multi-down.png + :/setupwizard/resources/bttn-multi-down.png + :/setupwizard/resources/bttn-multi-down.png:/setupwizard/resources/bttn-multi-up.png + + + + 100 + 100 + + true @@ -85,84 +104,149 @@ p, li { white-space: pre-wrap; } true - - false + + Qt::ToolButtonTextUnderIcon + + + true - + 170 40 100 - 100 + 120 Airplane, Sloper, Jet + + QToolButton { border: none } + Fixed wing + + + :/setupwizard/resources/bttn-plane-up.png + :/setupwizard/resources/bttn-plane-down.png + :/setupwizard/resources/bttn-plane-down.png + :/setupwizard/resources/bttn-plane-down.png:/setupwizard/resources/bttn-plane-up.png + + + + 100 + 100 + + true + + false + true - - false + + Qt::ToolButtonTextUnderIcon + + + true - + 290 40 100 - 100 + 120 + + QToolButton { border: none } + Helicopter + + + :/setupwizard/resources/bttn-heli-up.png + :/setupwizard/resources/bttn-heli-down.png + :/setupwizard/resources/bttn-heli-down.png + :/setupwizard/resources/bttn-heli-down.png:/setupwizard/resources/bttn-heli-up.png + + + + 100 + 100 + + true true - - false + + Qt::ToolButtonTextUnderIcon + + + true - + 410 40 100 - 100 + 120 Car, Boat, U-Boat + + QToolButton { border: none } + Surface + + + :/setupwizard/resources/bttn-land-up.png + :/setupwizard/resources/bttn-land-down.png + :/setupwizard/resources/bttn-land-down.png + :/setupwizard/resources/bttn-land-down.png:/setupwizard/resources/bttn-land-up.png + + + + 100 + 100 + + true true - - false + + Qt::ToolButtonTextUnderIcon + + + true - + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-heli-down.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-heli-down.png new file mode 100644 index 0000000000000000000000000000000000000000..0d75a7ba851551ce503561f451052bce00a63b07 GIT binary patch literal 3474 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-land-over.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-land-over.png new file mode 100644 index 0000000000000000000000000000000000000000..8d6336bc4830c19d39e5404108e128e7e20c1e66 GIT binary patch literal 3772 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 JN()lle*mOTjt>9; literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-land-up.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-land-up.png new file mode 100644 index 0000000000000000000000000000000000000000..7d90f4a2d49ed091aef8948ba9ee37b1a9af09ed GIT binary patch literal 4772 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-multi-down.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-multi-down.png new file mode 100644 index 0000000000000000000000000000000000000000..7da5b4fdca238a7c328497dd2c85ea8894847a67 GIT binary patch literal 6634 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-multi-up.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-multi-up.png new file mode 100644 index 0000000000000000000000000000000000000000..882d6edfa23f33de14c746a0334d2be2f7e4f52c GIT binary patch literal 7872 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-plane-down.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-plane-down.png new file mode 100644 index 0000000000000000000000000000000000000000..42bfddd28758f73deb0b9b2f5a49850588246cf5 GIT binary patch literal 3917 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 LT4G8JT*ChW*3;{I literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-plane-over.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-plane-over.png new file mode 100644 index 0000000000000000000000000000000000000000..d99efed99da4116fdf7192d311b63d9018e9cccb GIT binary patch literal 3900 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 QvvHrb#@peFEWASh2S51PrT_o{ literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-plane-up.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-plane-up.png new file mode 100644 index 0000000000000000000000000000000000000000..4ccb6567d4d2f02b0b8e7fcdbe2f45739b918909 GIT binary patch literal 4773 zcmbVQXH-*JyN-kop@>oyGNJb*)Pw*bKm-J&2~mm!2xTM$k^rF#sEG6?MG#N{8KsFx zQE7r8T~w+dy(tJvSL6#bE zWfacL0<2FW6ToUpDvGX97!0hgt^`w6Q&)#6fZZzYQdv1LFi~O41aO_8&(en#lT?( zhK4W$br>D3hea47G&KO z4(w9RI6WeofIU@TmJw>C*@QY#xFSeaDdLTf^k%JfIErbo2 z-eJ%-{Jg(0%dWQrKoZAPb1J2Hz~7PCMLUf>ZJE<%tax|0@!DZnrjWbSWcRbhJKypT z8+Uvp01^+lW20Y5N=cd9K78MAB$4{v=xx-s?pBv7o78~24Gl=I<-sDY&NJ@&RnZGP zs-kt*I0UW-d>UGTTV`H_w?;vcjf|)V{@8Za)R83$C%F5VnsUm?%UjypcdPUV0Qk#6CMU)gpM3FJfmoSj@76o> zRhuCYynAzc5;me}%AFQx=N?K^%Jlc#ZSD3eE_g|PX$uokbhaREGXrXNW-ANc|4N5{ zjl;glnp1|K!TYKd79v&n6eNP{aI5wo^#qB~a?u#cTqDp30L+oZUYZxGK8Ft3_KW(^ z*-B{@6^k{);O#inUBDUVqzcRItVUo1ZZYS@i%0w0D%YW?_Vwv0XW@jc%rhoSin!M~ zm=URbQ;hvN3{%)g31GXr%XIzmv2`I250~cVZ!{i}7ny2Xl9WQxd5qx(-n}Rx<`I*4 z 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 ajsd)E$|0q1k6k?aab#?0ZcvVKj`|O1U|=%< literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc b/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc index 1358ce976..cb4e3d5a3 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc +++ b/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc @@ -1,3 +1,16 @@ - + + resources/bttn-heli-down.png + resources/bttn-heli-over.png + resources/bttn-heli-up.png + resources/bttn-land-down.png + resources/bttn-land-over.png + resources/bttn-land-up.png + resources/bttn-multi-down.png + resources/bttn-multi-over.png + resources/bttn-multi-up.png + resources/bttn-plane-down.png + resources/bttn-plane-over.png + resources/bttn-plane-up.png + From 2b541219bf0f53fc02e1eede1aafd65345031961 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Wed, 15 Aug 2012 01:04:54 +0200 Subject: [PATCH 05/56] OP-39 Added condition for multirotor type. If PWM input option is enable only up to Hex is selectable, otherwise Octo is selectable to. Added initial configuration code that applies the users choices in the UAVOs. Changed order of pages so that Input page comes before vehicle page. --- .../plugins/setupwizard/pages/flashpage.cpp | 1 + .../plugins/setupwizard/pages/flashpage.ui | 17 +- .../plugins/setupwizard/pages/multipage.cpp | 20 +- .../src/plugins/setupwizard/pages/multipage.h | 3 + .../src/plugins/setupwizard/setupwizard.cpp | 203 +++++++++++++++++- .../src/plugins/setupwizard/setupwizard.h | 29 ++- 6 files changed, 264 insertions(+), 9 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp index 452adaf02..713270d83 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp @@ -35,6 +35,7 @@ FlashPage::FlashPage(SetupWizard *wizard, QWidget *parent) : ui(new Ui::FlashPage) { ui->setupUi(this); + connect(ui->applyButton, SIGNAL(clicked()), wizard, SLOT(writeConfiguration())); } FlashPage::~FlashPage() diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui index a354302b8..37929e802 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui @@ -45,9 +45,9 @@ p, li { white-space: pre-wrap; } 20 - 240 + 230 561 - 141 + 151 @@ -62,6 +62,19 @@ p, li { white-space: pre-wrap; } Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 440 + 30 + 100 + 100 + + + + Apply + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp index 56ffa5fb0..9963422ea 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp @@ -57,16 +57,23 @@ MultiPage::~MultiPage() void MultiPage::initializePage() { + updateAvailableTypes(); updateImageAndDescription(); } +bool MultiPage::validatePage() +{ + SetupWizard::VEHICLE_SUB_TYPE type = (SetupWizard::VEHICLE_SUB_TYPE) ui->typeCombo->itemData(ui->typeCombo->currentIndex()).toInt(); + getWizard()->setVehicleSubType(type); +} + void MultiPage::setupMultiTypesCombo() { ui->typeCombo->addItem("Tricopter", SetupWizard::MULTI_ROTOR_TRI_Y); ui->typeCombo->addItem("Quadcopter X", SetupWizard::MULTI_ROTOR_QUAD_X); ui->typeCombo->addItem("Quadcopter +", SetupWizard::MULTI_ROTOR_QUAD_PLUS); ui->typeCombo->addItem("Hexacopter", SetupWizard::MULTI_ROTOR_HEXA); - ui->typeCombo->addItem("Hexacopter Coax", SetupWizard::MULTI_ROTOR_HEXA_COAX_Y); + ui->typeCombo->addItem("Hexacopter Coax (Y6)", SetupWizard::MULTI_ROTOR_HEXA_COAX_Y); ui->typeCombo->addItem("Hexacopter H", SetupWizard::MULTI_ROTOR_HEXA_H); ui->typeCombo->addItem("Octocopter", SetupWizard::MULTI_ROTOR_OCTO); ui->typeCombo->addItem("Octocopter Coax X", SetupWizard::MULTI_ROTOR_OCTO_COAX_X); @@ -74,9 +81,18 @@ void MultiPage::setupMultiTypesCombo() ui->typeCombo->addItem("Octocopter V", SetupWizard::MULTI_ROTOR_OCTO_V); } +void MultiPage::updateAvailableTypes() +{ + QVariant enable = (getWizard()->getInputType() == SetupWizard::INPUT_PWM) ? QVariant(0) : QVariant(1 | 32); + ui->typeCombo->model()->setData(ui->typeCombo->model()->index(6, 0), enable, Qt::UserRole - 1); + ui->typeCombo->model()->setData(ui->typeCombo->model()->index(7, 0), enable, Qt::UserRole - 1); + ui->typeCombo->model()->setData(ui->typeCombo->model()->index(8, 0), enable, Qt::UserRole - 1); + ui->typeCombo->model()->setData(ui->typeCombo->model()->index(9, 0), enable, Qt::UserRole - 1); +} + void MultiPage::updateImageAndDescription() { - SetupWizard::MULTI_ROTOR_SUB_TYPE type = (SetupWizard::MULTI_ROTOR_SUB_TYPE) ui->typeCombo->itemData(ui->typeCombo->currentIndex()).toInt(); + SetupWizard::VEHICLE_SUB_TYPE type = (SetupWizard::VEHICLE_SUB_TYPE) ui->typeCombo->itemData(ui->typeCombo->currentIndex()).toInt(); QString elementId = ""; QString description = "Descriptive text with information about "; description.append(ui->typeCombo->currentText()); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.h index bc9f822ad..0ffa84a36 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.h @@ -46,11 +46,14 @@ public: ~MultiPage(); void initializePage(); + bool validatePage(); + private: Ui::MultiPage *ui; void setupMultiTypesCombo(); QGraphicsSvgItem *multiPic; + void updateAvailableTypes(); private slots: void updateImageAndDescription(); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index f68c942ef..313623248 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -40,6 +40,11 @@ #include "pages/summarypage.h" #include "pages/flashpage.h" #include "pages/notyetimplementedpage.h" +#include "extensionsystem/pluginmanager.h" +#include "hwsettings.h" +#include "actuatorsettings.h" +#include "attitudesettings.h" + SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), m_controllerSelectionMode(CONTROLLER_SELECTION_UNKNOWN), m_controllerType(CONTROLLER_UNKNOWN), @@ -47,6 +52,7 @@ SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), m_levellingPerformed(false), m_connectionManager(0) { setWindowTitle("OpenPilot Setup Wizard"); + setOption(QWizard::IndependentPages, false); createPages(); } @@ -60,7 +66,7 @@ int SetupWizard::nextId() const { case CONTROLLER_CC: case CONTROLLER_CC3D: - return PAGE_VEHICLES; + return PAGE_INPUT; case CONTROLLER_REVO: case CONTROLLER_PIPX: default: @@ -83,9 +89,9 @@ int SetupWizard::nextId() const } } case PAGE_MULTI: - return PAGE_INPUT; - case PAGE_INPUT: return PAGE_OUTPUT; + case PAGE_INPUT: + return PAGE_VEHICLES; case PAGE_OUTPUT: { if(getControllerSelectionMode() == CONTROLLER_SELECTION_AUTOMATIC) { @@ -196,6 +202,197 @@ QString SetupWizard::getSummaryText() return summary; } +void SetupWizard::applyConfiguration() +{ + UAVObjectManager* uavoMgr = getUAVObjectManager(); + applyHardwareConfiguration(uavoMgr); + applyVehicleConfiguration(uavoMgr); + applyOutputConfiguration(uavoMgr); + applyLevellingConfiguration(uavoMgr); +} + +UAVObjectManager* SetupWizard::getUAVObjectManager() +{ + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager * uavObjectManager = pm->getObject(); + Q_ASSERT(uavObjectManager); + return uavObjectManager; +} + +void SetupWizard::applyHardwareConfiguration(UAVObjectManager* uavoMgr) +{ + HwSettings* hwSettings = HwSettings::GetInstance(uavoMgr); + + switch(getControllerType()) + { + case CONTROLLER_CC: + case CONTROLLER_CC3D: + // Reset all ports + hwSettings->setCC_RcvrPort(HwSettings::CC_RCVRPORT_DISABLED); + hwSettings->setCC_FlexiPort(HwSettings::CC_FLEXIPORT_DISABLED); + hwSettings->setCC_MainPort(HwSettings::CC_MAINPORT_DISABLED); + switch(getInputType()) + { + case INPUT_PWM: + hwSettings->setCC_RcvrPort(HwSettings::CC_RCVRPORT_PWM); + break; + case INPUT_PPM: + hwSettings->setCC_RcvrPort(HwSettings::CC_RCVRPORT_PPM); + break; + case INPUT_SBUS: + hwSettings->setCC_MainPort(HwSettings::CC_MAINPORT_SBUS); + break; + case INPUT_DSM: + // TODO: Handle all of the DSM types ?? Which is most common? + hwSettings->setCC_MainPort(HwSettings::CC_MAINPORT_DSM2); + break; + } + break; + case CONTROLLER_REVO: + // TODO: Implement Revo settings + break; + } +} + +void SetupWizard::applyVehicleConfiguration(UAVObjectManager *uavoMgr) +{ + + switch(getVehicleType()) + { + case VEHICLE_MULTI: + { + switch(getVehicleSubType()) + { + case SetupWizard::MULTI_ROTOR_TRI_Y: + setupTriCopter(uavoMgr); + break; + case SetupWizard::MULTI_ROTOR_QUAD_X: + case SetupWizard::MULTI_ROTOR_QUAD_PLUS: + setupQuadCopter(uavoMgr); + break; + case SetupWizard::MULTI_ROTOR_HEXA: + case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y: + case SetupWizard::MULTI_ROTOR_HEXA_H: + setupHexaCopter(uavoMgr); + break; + case SetupWizard::MULTI_ROTOR_OCTO: + case SetupWizard::MULTI_ROTOR_OCTO_COAX_X: + case SetupWizard::MULTI_ROTOR_OCTO_COAX_PLUS: + case SetupWizard::MULTI_ROTOR_OCTO_V: + setupOctoCopter(uavoMgr); + break; + } + break; + } + case VEHICLE_FIXEDWING: + case VEHICLE_HELI: + case VEHICLE_SURFACE: + // TODO: Implement settings for other vehicle types? + break; + } +} + +void SetupWizard::applyOutputConfiguration(UAVObjectManager *uavoMgr) +{ + ActuatorSettings* actSettings = ActuatorSettings::GetInstance(uavoMgr); + switch(getVehicleType()) + { + case VEHICLE_MULTI: + { + actSettings->setChannelUpdateFreq(0, DEFAULT_ESC_FREQUENCE); + actSettings->setChannelUpdateFreq(1, DEFAULT_ESC_FREQUENCE); + actSettings->setChannelUpdateFreq(2, DEFAULT_ESC_FREQUENCE); + actSettings->setChannelUpdateFreq(3, DEFAULT_ESC_FREQUENCE); + + qint16 updateFrequence = DEFAULT_ESC_FREQUENCE; + switch(getESCType()) + { + case ESC_DEFAULT: + updateFrequence = DEFAULT_ESC_FREQUENCE; + break; + case ESC_RAPID: + updateFrequence = RAPID_ESC_FREQUENCE; + break; + } + + switch(getVehicleSubType()) + { + case SetupWizard::MULTI_ROTOR_TRI_Y: + actSettings->setChannelUpdateFreq(0, updateFrequence); + break; + case SetupWizard::MULTI_ROTOR_QUAD_X: + case SetupWizard::MULTI_ROTOR_QUAD_PLUS: + actSettings->setChannelUpdateFreq(0, updateFrequence); + actSettings->setChannelUpdateFreq(1, updateFrequence); + break; + case SetupWizard::MULTI_ROTOR_HEXA: + case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y: + case SetupWizard::MULTI_ROTOR_HEXA_H: + case SetupWizard::MULTI_ROTOR_OCTO: + case SetupWizard::MULTI_ROTOR_OCTO_COAX_X: + case SetupWizard::MULTI_ROTOR_OCTO_COAX_PLUS: + case SetupWizard::MULTI_ROTOR_OCTO_V: + actSettings->setChannelUpdateFreq(0, updateFrequence); + actSettings->setChannelUpdateFreq(1, updateFrequence); + actSettings->setChannelUpdateFreq(2, updateFrequence); + actSettings->setChannelUpdateFreq(3, updateFrequence); + break; + } + break; + } + case VEHICLE_FIXEDWING: + case VEHICLE_HELI: + case VEHICLE_SURFACE: + // TODO: Implement settings for other vehicle types? + break; + } +} + +void SetupWizard::applyLevellingConfiguration(UAVObjectManager *uavoMgr) +{ + if(isLevellingPerformed()) + { + accelGyroBias bias = getLevellingBias(); + AttitudeSettings::DataFields attitudeSettingsData = AttitudeSettings::GetInstance(uavoMgr)->getData(); + attitudeSettingsData.AccelBias[0] += bias.m_accelerometerXBias; + attitudeSettingsData.AccelBias[1] += bias.m_accelerometerYBias; + attitudeSettingsData.AccelBias[2] += bias.m_accelerometerZBias; + attitudeSettingsData.GyroBias[0] = -bias.m_gyroXBias; + attitudeSettingsData.GyroBias[1] = -bias.m_gyroYBias; + attitudeSettingsData.GyroBias[2] = -bias.m_gyroZBias; + AttitudeSettings::GetInstance(uavoMgr)->setData(attitudeSettingsData); + } +} + +void SetupWizard::setupTriCopter(UAVObjectManager *uavoMgr) +{ + +} + +void SetupWizard::setupQuadCopter(UAVObjectManager *uavoMgr) +{ +} + +void SetupWizard::setupHexaCopter(UAVObjectManager *uavoMgr) +{ +} + +void SetupWizard::setupOctoCopter(UAVObjectManager *uavoMgr) +{ +} + +void SetupWizard::exportConfiguration() +{ + applyConfiguration(); + // Call export configuration function... +} + +void SetupWizard::writeConfiguration() +{ + applyConfiguration(); + // Call Save UAVOs to controller +} + void SetupWizard::createPages() { setPage(PAGE_START, new StartPage(this)); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h index b88f5e4c9..55246afa0 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h @@ -32,6 +32,8 @@ #include "levellingutil.h" #include #include +#include "uavobjectmanager.h" + class SetupWizard : public QWizard { @@ -43,9 +45,10 @@ public: enum CONTROLLER_SELECTION_MODE {CONTROLLER_SELECTION_AUTOMATIC, CONTROLLER_SELECTION_MANUAL, CONTROLLER_SELECTION_UNKNOWN}; enum CONTROLLER_TYPE {CONTROLLER_UNKNOWN, CONTROLLER_CC, CONTROLLER_CC3D, CONTROLLER_REVO, CONTROLLER_PIPX}; enum VEHICLE_TYPE {VEHICLE_UNKNOWN, VEHICLE_MULTI, VEHICLE_FIXEDWING, VEHICLE_HELI, VEHICLE_SURFACE}; - enum MULTI_ROTOR_SUB_TYPE {MULTI_ROTOR_UNKNOWN, MULTI_ROTOR_TRI_Y, MULTI_ROTOR_QUAD_X, MULTI_ROTOR_QUAD_PLUS, + enum VEHICLE_SUB_TYPE {MULTI_ROTOR_UNKNOWN, MULTI_ROTOR_TRI_Y, MULTI_ROTOR_QUAD_X, MULTI_ROTOR_QUAD_PLUS, MULTI_ROTOR_HEXA, MULTI_ROTOR_HEXA_H, MULTI_ROTOR_HEXA_COAX_Y, MULTI_ROTOR_OCTO, - MULTI_ROTOR_OCTO_V, MULTI_ROTOR_OCTO_COAX_X, MULTI_ROTOR_OCTO_COAX_PLUS}; + MULTI_ROTOR_OCTO_V, MULTI_ROTOR_OCTO_COAX_X, MULTI_ROTOR_OCTO_COAX_PLUS, FIXED_WING_AILERON, + FIXED_WING_VTAIL, HELI_CCPM}; enum ESC_TYPE {ESC_DEFAULT, ESC_RAPID, ESC_UNKNOWN}; enum INPUT_TYPE {INPUT_PWM, INPUT_PPM, INPUT_SBUS, INPUT_DSM, INPUT_UNKNOWN}; @@ -58,6 +61,9 @@ public: void setVehicleType(SetupWizard::VEHICLE_TYPE type) { m_vehicleType = type; } SetupWizard::VEHICLE_TYPE getVehicleType() const { return m_vehicleType; } + void setVehicleSubType(SetupWizard::VEHICLE_SUB_TYPE type) { m_vehicleSubType = type; } + SetupWizard::VEHICLE_SUB_TYPE getVehicleSubType() const { return m_vehicleSubType; } + void setInputType(SetupWizard::INPUT_TYPE type) { m_inputType = type; } SetupWizard::INPUT_TYPE getInputType() const { return m_inputType; } @@ -78,8 +84,14 @@ public: } return m_connectionManager; } +public slots: + void exportConfiguration(); + void writeConfiguration(); private: + static const qint16 DEFAULT_ESC_FREQUENCE = 50; + static const qint16 RAPID_ESC_FREQUENCE = 50; + enum {PAGE_START, PAGE_CONTROLLER, PAGE_VEHICLES, PAGE_MULTI, PAGE_FIXEDWING, PAGE_HELI, PAGE_SURFACE, PAGE_INPUT, PAGE_OUTPUT, PAGE_LEVELLING, PAGE_FLASH, PAGE_SUMMARY, PAGE_NOTYETIMPLEMENTED, PAGE_END}; @@ -88,6 +100,7 @@ private: CONTROLLER_SELECTION_MODE m_controllerSelectionMode; CONTROLLER_TYPE m_controllerType; VEHICLE_TYPE m_vehicleType; + VEHICLE_SUB_TYPE m_vehicleSubType; INPUT_TYPE m_inputType; ESC_TYPE m_escType; bool m_levellingPerformed; @@ -95,6 +108,18 @@ private: Core::ConnectionManager *m_connectionManager; + UAVObjectManager *getUAVObjectManager(); + + void applyConfiguration(); + void applyHardwareConfiguration(UAVObjectManager *uavoMgr); + void applyVehicleConfiguration(UAVObjectManager *uavoMgr); + void applyOutputConfiguration(UAVObjectManager *uavoMgr); + void applyLevellingConfiguration(UAVObjectManager *uavoMgr); + + void setupTriCopter(UAVObjectManager *uavoMgr); + void setupQuadCopter(UAVObjectManager *uavoMgr); + void setupHexaCopter(UAVObjectManager *uavoMgr); + void setupOctoCopter(UAVObjectManager *uavoMgr); }; #endif // SETUPWIZARD_H From 16d0252d12e30810d59d0405b85cf0757cf72cfe Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Thu, 16 Aug 2012 00:27:40 +0200 Subject: [PATCH 06/56] OP-39 Added some basic code to reset the mixers. Started to implement mixer configuration for all multirotors. --- .../src/plugins/setupwizard/setupwizard.cpp | 83 ++++++++++++++----- .../src/plugins/setupwizard/setupwizard.h | 6 +- 2 files changed, 68 insertions(+), 21 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index 313623248..7fdcc921c 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -45,7 +45,6 @@ #include "actuatorsettings.h" #include "attitudesettings.h" - SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), m_controllerSelectionMode(CONTROLLER_SELECTION_UNKNOWN), m_controllerType(CONTROLLER_UNKNOWN), m_vehicleType(VEHICLE_UNKNOWN), m_inputType(INPUT_UNKNOWN), m_escType(ESC_UNKNOWN), @@ -222,29 +221,29 @@ UAVObjectManager* SetupWizard::getUAVObjectManager() void SetupWizard::applyHardwareConfiguration(UAVObjectManager* uavoMgr) { HwSettings* hwSettings = HwSettings::GetInstance(uavoMgr); - + HwSettings::DataFields data = hwSettings->getData(); switch(getControllerType()) { case CONTROLLER_CC: case CONTROLLER_CC3D: // Reset all ports - hwSettings->setCC_RcvrPort(HwSettings::CC_RCVRPORT_DISABLED); - hwSettings->setCC_FlexiPort(HwSettings::CC_FLEXIPORT_DISABLED); - hwSettings->setCC_MainPort(HwSettings::CC_MAINPORT_DISABLED); + data.CC_RcvrPort = HwSettings::CC_RCVRPORT_DISABLED; + data.CC_FlexiPort = HwSettings::CC_FLEXIPORT_DISABLED; + data.CC_MainPort = HwSettings::CC_MAINPORT_DISABLED; switch(getInputType()) { case INPUT_PWM: - hwSettings->setCC_RcvrPort(HwSettings::CC_RCVRPORT_PWM); + data.CC_RcvrPort = HwSettings::CC_RCVRPORT_PWM; break; case INPUT_PPM: - hwSettings->setCC_RcvrPort(HwSettings::CC_RCVRPORT_PPM); + data.CC_RcvrPort = HwSettings::CC_RCVRPORT_PPM; break; case INPUT_SBUS: - hwSettings->setCC_MainPort(HwSettings::CC_MAINPORT_SBUS); + data.CC_MainPort = HwSettings::CC_MAINPORT_SBUS; break; case INPUT_DSM: // TODO: Handle all of the DSM types ?? Which is most common? - hwSettings->setCC_MainPort(HwSettings::CC_MAINPORT_DSM2); + data.CC_MainPort = HwSettings::CC_MAINPORT_DSM2; break; } break; @@ -252,6 +251,7 @@ void SetupWizard::applyHardwareConfiguration(UAVObjectManager* uavoMgr) // TODO: Implement Revo settings break; } + hwSettings->setData(data); } void SetupWizard::applyVehicleConfiguration(UAVObjectManager *uavoMgr) @@ -261,6 +261,8 @@ void SetupWizard::applyVehicleConfiguration(UAVObjectManager *uavoMgr) { case VEHICLE_MULTI: { + resetVehicleConfig(uavoMgr); + switch(getVehicleSubType()) { case SetupWizard::MULTI_ROTOR_TRI_Y: @@ -299,10 +301,12 @@ void SetupWizard::applyOutputConfiguration(UAVObjectManager *uavoMgr) { case VEHICLE_MULTI: { - actSettings->setChannelUpdateFreq(0, DEFAULT_ESC_FREQUENCE); - actSettings->setChannelUpdateFreq(1, DEFAULT_ESC_FREQUENCE); - actSettings->setChannelUpdateFreq(2, DEFAULT_ESC_FREQUENCE); - actSettings->setChannelUpdateFreq(3, DEFAULT_ESC_FREQUENCE); + ActuatorSettings::DataFields data = actSettings->getData(); + + data.ChannelUpdateFreq[0] = DEFAULT_ESC_FREQUENCE; + data.ChannelUpdateFreq[1] = DEFAULT_ESC_FREQUENCE; + data.ChannelUpdateFreq[3] = DEFAULT_ESC_FREQUENCE; + data.ChannelUpdateFreq[4] = DEFAULT_ESC_FREQUENCE; qint16 updateFrequence = DEFAULT_ESC_FREQUENCE; switch(getESCType()) @@ -318,12 +322,12 @@ void SetupWizard::applyOutputConfiguration(UAVObjectManager *uavoMgr) switch(getVehicleSubType()) { case SetupWizard::MULTI_ROTOR_TRI_Y: - actSettings->setChannelUpdateFreq(0, updateFrequence); + data.ChannelUpdateFreq[0] = updateFrequence; break; case SetupWizard::MULTI_ROTOR_QUAD_X: case SetupWizard::MULTI_ROTOR_QUAD_PLUS: - actSettings->setChannelUpdateFreq(0, updateFrequence); - actSettings->setChannelUpdateFreq(1, updateFrequence); + data.ChannelUpdateFreq[0] = updateFrequence; + data.ChannelUpdateFreq[1] = updateFrequence; break; case SetupWizard::MULTI_ROTOR_HEXA: case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y: @@ -332,12 +336,13 @@ void SetupWizard::applyOutputConfiguration(UAVObjectManager *uavoMgr) case SetupWizard::MULTI_ROTOR_OCTO_COAX_X: case SetupWizard::MULTI_ROTOR_OCTO_COAX_PLUS: case SetupWizard::MULTI_ROTOR_OCTO_V: - actSettings->setChannelUpdateFreq(0, updateFrequence); - actSettings->setChannelUpdateFreq(1, updateFrequence); - actSettings->setChannelUpdateFreq(2, updateFrequence); - actSettings->setChannelUpdateFreq(3, updateFrequence); + data.ChannelUpdateFreq[0] = updateFrequence; + data.ChannelUpdateFreq[1] = updateFrequence; + data.ChannelUpdateFreq[3] = updateFrequence; + data.ChannelUpdateFreq[4] = updateFrequence; break; } + actSettings->setData(data); break; } case VEHICLE_FIXEDWING: @@ -364,8 +369,46 @@ void SetupWizard::applyLevellingConfiguration(UAVObjectManager *uavoMgr) } } + +void SetupWizard::resetVehicleConfig(UAVObjectManager *uavoMgr) +{ + // Reset all mixers + MixerSettings* mSettings = MixerSettings::GetInstance(uavoMgr); + + QString mixerTypePattern = "Mixer%1Type"; + QString mixerVectorPattern = "Mixer%1Vector"; + for(int i = 1; i <= 10; i++) { + UAVObjectField *field = mSettings->getField(mixerTypePattern.arg(i)); + Q_ASSERT(field); + field->setValue(field->getOptions().at(0)); + + field = mSettings->getField(mixerVectorPattern.arg(i)); + Q_ASSERT(field); + for(int i = 0; i < field->getNumElements(); i++){ + field->setValue(0, i); + } + } + mSettings->setData(mSettings->getData()); + +} + + void SetupWizard::setupTriCopter(UAVObjectManager *uavoMgr) { + // Typical vehicle setup + // 1. Setup and apply mixer + // 2. Setup GUI data + + double mixer [8][3] = { + { 0.5, 1, 0}, + { 0.5, -1, 0}, + { -1, 0, 0}, + { 0, 0, 0}, + { 0, 0, 0}, + { 0, 0, 0}, + { 0, 0, 0}, + { 0, 0, 0} + }; } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h index 55246afa0..4fcd97422 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h @@ -33,6 +33,7 @@ #include #include #include "uavobjectmanager.h" +#include "mixersettings.h" class SetupWizard : public QWizard @@ -90,7 +91,7 @@ public slots: private: static const qint16 DEFAULT_ESC_FREQUENCE = 50; - static const qint16 RAPID_ESC_FREQUENCE = 50; + static const qint16 RAPID_ESC_FREQUENCE = 400; enum {PAGE_START, PAGE_CONTROLLER, PAGE_VEHICLES, PAGE_MULTI, PAGE_FIXEDWING, PAGE_HELI, PAGE_SURFACE, PAGE_INPUT, PAGE_OUTPUT, PAGE_LEVELLING, @@ -116,6 +117,9 @@ private: void applyOutputConfiguration(UAVObjectManager *uavoMgr); void applyLevellingConfiguration(UAVObjectManager *uavoMgr); + void resetVehicleConfig(UAVObjectManager *uavoMgr); + void resetMixerVectors(MixerSettings::DataFields data, qint8 channelIndex); + void setupTriCopter(UAVObjectManager *uavoMgr); void setupQuadCopter(UAVObjectManager *uavoMgr); void setupHexaCopter(UAVObjectManager *uavoMgr); From 98b5bc305b6537f5d98f50c3f518ccf022b8bc35 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Fri, 17 Aug 2012 00:47:31 +0200 Subject: [PATCH 07/56] OP-39 Re-factored the configuration code to be implemented in a separate helper class to enable it to be used in a better and more stand alone way. The actual wizard class does not contain any uavo configuration code at all now. Added an interface that provides all configuration parameters for a vehicle. Changed the default ESC to Rapid instead of Default 50Hz. Default ESC was renamed to Legacy ESC. Started to implement mixer configuration. Started to implement flight mode configuration code. Cleaned up some code and removed warnings. --- .../src/plugins/setupwizard/levellingutil.h | 11 +- .../plugins/setupwizard/pages/outputpage.cpp | 2 +- .../plugins/setupwizard/pages/outputpage.ui | 11 +- .../src/plugins/setupwizard/setupwizard.cpp | 244 +------------- .../src/plugins/setupwizard/setupwizard.h | 34 +- .../src/plugins/setupwizard/setupwizard.pro | 8 +- .../vehicleconfigurationhelper.cpp | 298 ++++++++++++++++++ .../setupwizard/vehicleconfigurationhelper.h | 80 +++++ .../vehicleconfigurationsource.cpp | 32 ++ .../setupwizard/vehicleconfigurationsource.h | 72 +++++ 10 files changed, 506 insertions(+), 286 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.cpp create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h diff --git a/ground/openpilotgcs/src/plugins/setupwizard/levellingutil.h b/ground/openpilotgcs/src/plugins/setupwizard/levellingutil.h index 0db8a23c0..fb8ffcdce 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/levellingutil.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/levellingutil.h @@ -33,16 +33,7 @@ #include #include "uavobject.h" - -struct accelGyroBias { - float m_accelerometerXBias; - float m_accelerometerYBias; - float m_accelerometerZBias; - - float m_gyroXBias; - float m_gyroYBias; - float m_gyroZBias; -}; +#include "vehicleconfigurationsource.h" class LevellingUtil : public QObject { diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.cpp index 3e7313c37..d9903af57 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.cpp @@ -48,7 +48,7 @@ bool OutputPage::validatePage() getWizard()->setESCType(SetupWizard::ESC_RAPID); } else { - getWizard()->setESCType(SetupWizard::ESC_DEFAULT); + getWizard()->setESCType(SetupWizard::ESC_LEGACY); } return true; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui index 37a5a9bb5..7b290cece 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui @@ -64,7 +64,7 @@ p, li { white-space: pre-wrap; } - 50 + 160 40 100 100 @@ -74,14 +74,14 @@ p, li { white-space: pre-wrap; } Tricopter, Quadcopter, Hexacopter, Octocopter - Default ESC + Legacy ESC 50 Hz true - true + false true @@ -93,7 +93,7 @@ p, li { white-space: pre-wrap; } - 170 + 30 40 100 100 @@ -109,6 +109,9 @@ p, li { white-space: pre-wrap; } true + + true + true diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index 7fdcc921c..0dc44c62d 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -41,11 +41,9 @@ #include "pages/flashpage.h" #include "pages/notyetimplementedpage.h" #include "extensionsystem/pluginmanager.h" -#include "hwsettings.h" -#include "actuatorsettings.h" -#include "attitudesettings.h" +#include "vehicleconfigurationhelper.h" -SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), +SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), VehicleConfigurationSource(), m_controllerSelectionMode(CONTROLLER_SELECTION_UNKNOWN), m_controllerType(CONTROLLER_UNKNOWN), m_vehicleType(VEHICLE_UNKNOWN), m_inputType(INPUT_UNKNOWN), m_escType(ESC_UNKNOWN), m_levellingPerformed(false), m_connectionManager(0) @@ -179,8 +177,8 @@ QString SetupWizard::getSummaryText() summary.append(tr("ESC type: ")); switch (getESCType()) { - case ESC_DEFAULT: - summary.append(tr("Default ESC (50 Hz)")); + case ESC_LEGACY: + summary.append(tr("Legacy ESC (50 Hz)")); break; case ESC_RAPID: summary.append(tr("Rapid ESC (400 Hz)")); @@ -201,239 +199,11 @@ QString SetupWizard::getSummaryText() return summary; } -void SetupWizard::applyConfiguration() -{ - UAVObjectManager* uavoMgr = getUAVObjectManager(); - applyHardwareConfiguration(uavoMgr); - applyVehicleConfiguration(uavoMgr); - applyOutputConfiguration(uavoMgr); - applyLevellingConfiguration(uavoMgr); -} - -UAVObjectManager* SetupWizard::getUAVObjectManager() -{ - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager * uavObjectManager = pm->getObject(); - Q_ASSERT(uavObjectManager); - return uavObjectManager; -} - -void SetupWizard::applyHardwareConfiguration(UAVObjectManager* uavoMgr) -{ - HwSettings* hwSettings = HwSettings::GetInstance(uavoMgr); - HwSettings::DataFields data = hwSettings->getData(); - switch(getControllerType()) - { - case CONTROLLER_CC: - case CONTROLLER_CC3D: - // Reset all ports - data.CC_RcvrPort = HwSettings::CC_RCVRPORT_DISABLED; - data.CC_FlexiPort = HwSettings::CC_FLEXIPORT_DISABLED; - data.CC_MainPort = HwSettings::CC_MAINPORT_DISABLED; - switch(getInputType()) - { - case INPUT_PWM: - data.CC_RcvrPort = HwSettings::CC_RCVRPORT_PWM; - break; - case INPUT_PPM: - data.CC_RcvrPort = HwSettings::CC_RCVRPORT_PPM; - break; - case INPUT_SBUS: - data.CC_MainPort = HwSettings::CC_MAINPORT_SBUS; - break; - case INPUT_DSM: - // TODO: Handle all of the DSM types ?? Which is most common? - data.CC_MainPort = HwSettings::CC_MAINPORT_DSM2; - break; - } - break; - case CONTROLLER_REVO: - // TODO: Implement Revo settings - break; - } - hwSettings->setData(data); -} - -void SetupWizard::applyVehicleConfiguration(UAVObjectManager *uavoMgr) -{ - - switch(getVehicleType()) - { - case VEHICLE_MULTI: - { - resetVehicleConfig(uavoMgr); - - switch(getVehicleSubType()) - { - case SetupWizard::MULTI_ROTOR_TRI_Y: - setupTriCopter(uavoMgr); - break; - case SetupWizard::MULTI_ROTOR_QUAD_X: - case SetupWizard::MULTI_ROTOR_QUAD_PLUS: - setupQuadCopter(uavoMgr); - break; - case SetupWizard::MULTI_ROTOR_HEXA: - case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y: - case SetupWizard::MULTI_ROTOR_HEXA_H: - setupHexaCopter(uavoMgr); - break; - case SetupWizard::MULTI_ROTOR_OCTO: - case SetupWizard::MULTI_ROTOR_OCTO_COAX_X: - case SetupWizard::MULTI_ROTOR_OCTO_COAX_PLUS: - case SetupWizard::MULTI_ROTOR_OCTO_V: - setupOctoCopter(uavoMgr); - break; - } - break; - } - case VEHICLE_FIXEDWING: - case VEHICLE_HELI: - case VEHICLE_SURFACE: - // TODO: Implement settings for other vehicle types? - break; - } -} - -void SetupWizard::applyOutputConfiguration(UAVObjectManager *uavoMgr) -{ - ActuatorSettings* actSettings = ActuatorSettings::GetInstance(uavoMgr); - switch(getVehicleType()) - { - case VEHICLE_MULTI: - { - ActuatorSettings::DataFields data = actSettings->getData(); - - data.ChannelUpdateFreq[0] = DEFAULT_ESC_FREQUENCE; - data.ChannelUpdateFreq[1] = DEFAULT_ESC_FREQUENCE; - data.ChannelUpdateFreq[3] = DEFAULT_ESC_FREQUENCE; - data.ChannelUpdateFreq[4] = DEFAULT_ESC_FREQUENCE; - - qint16 updateFrequence = DEFAULT_ESC_FREQUENCE; - switch(getESCType()) - { - case ESC_DEFAULT: - updateFrequence = DEFAULT_ESC_FREQUENCE; - break; - case ESC_RAPID: - updateFrequence = RAPID_ESC_FREQUENCE; - break; - } - - switch(getVehicleSubType()) - { - case SetupWizard::MULTI_ROTOR_TRI_Y: - data.ChannelUpdateFreq[0] = updateFrequence; - break; - case SetupWizard::MULTI_ROTOR_QUAD_X: - case SetupWizard::MULTI_ROTOR_QUAD_PLUS: - data.ChannelUpdateFreq[0] = updateFrequence; - data.ChannelUpdateFreq[1] = updateFrequence; - break; - case SetupWizard::MULTI_ROTOR_HEXA: - case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y: - case SetupWizard::MULTI_ROTOR_HEXA_H: - case SetupWizard::MULTI_ROTOR_OCTO: - case SetupWizard::MULTI_ROTOR_OCTO_COAX_X: - case SetupWizard::MULTI_ROTOR_OCTO_COAX_PLUS: - case SetupWizard::MULTI_ROTOR_OCTO_V: - data.ChannelUpdateFreq[0] = updateFrequence; - data.ChannelUpdateFreq[1] = updateFrequence; - data.ChannelUpdateFreq[3] = updateFrequence; - data.ChannelUpdateFreq[4] = updateFrequence; - break; - } - actSettings->setData(data); - break; - } - case VEHICLE_FIXEDWING: - case VEHICLE_HELI: - case VEHICLE_SURFACE: - // TODO: Implement settings for other vehicle types? - break; - } -} - -void SetupWizard::applyLevellingConfiguration(UAVObjectManager *uavoMgr) -{ - if(isLevellingPerformed()) - { - accelGyroBias bias = getLevellingBias(); - AttitudeSettings::DataFields attitudeSettingsData = AttitudeSettings::GetInstance(uavoMgr)->getData(); - attitudeSettingsData.AccelBias[0] += bias.m_accelerometerXBias; - attitudeSettingsData.AccelBias[1] += bias.m_accelerometerYBias; - attitudeSettingsData.AccelBias[2] += bias.m_accelerometerZBias; - attitudeSettingsData.GyroBias[0] = -bias.m_gyroXBias; - attitudeSettingsData.GyroBias[1] = -bias.m_gyroYBias; - attitudeSettingsData.GyroBias[2] = -bias.m_gyroZBias; - AttitudeSettings::GetInstance(uavoMgr)->setData(attitudeSettingsData); - } -} - - -void SetupWizard::resetVehicleConfig(UAVObjectManager *uavoMgr) -{ - // Reset all mixers - MixerSettings* mSettings = MixerSettings::GetInstance(uavoMgr); - - QString mixerTypePattern = "Mixer%1Type"; - QString mixerVectorPattern = "Mixer%1Vector"; - for(int i = 1; i <= 10; i++) { - UAVObjectField *field = mSettings->getField(mixerTypePattern.arg(i)); - Q_ASSERT(field); - field->setValue(field->getOptions().at(0)); - - field = mSettings->getField(mixerVectorPattern.arg(i)); - Q_ASSERT(field); - for(int i = 0; i < field->getNumElements(); i++){ - field->setValue(0, i); - } - } - mSettings->setData(mSettings->getData()); - -} - - -void SetupWizard::setupTriCopter(UAVObjectManager *uavoMgr) -{ - // Typical vehicle setup - // 1. Setup and apply mixer - // 2. Setup GUI data - - double mixer [8][3] = { - { 0.5, 1, 0}, - { 0.5, -1, 0}, - { -1, 0, 0}, - { 0, 0, 0}, - { 0, 0, 0}, - { 0, 0, 0}, - { 0, 0, 0}, - { 0, 0, 0} - }; - -} - -void SetupWizard::setupQuadCopter(UAVObjectManager *uavoMgr) -{ -} - -void SetupWizard::setupHexaCopter(UAVObjectManager *uavoMgr) -{ -} - -void SetupWizard::setupOctoCopter(UAVObjectManager *uavoMgr) -{ -} - -void SetupWizard::exportConfiguration() -{ - applyConfiguration(); - // Call export configuration function... -} - void SetupWizard::writeConfiguration() { - applyConfiguration(); - // Call Save UAVOs to controller + VehicleConfigurationHelper *helper = new VehicleConfigurationHelper(this); + Q_ASSERT(helper); + helper->setupVehicle(); } void SetupWizard::createPages() diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h index 4fcd97422..566ec46ab 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h @@ -32,26 +32,16 @@ #include "levellingutil.h" #include #include -#include "uavobjectmanager.h" -#include "mixersettings.h" +#include "vehicleconfigurationsource.h" -class SetupWizard : public QWizard +class SetupWizard : public QWizard, public VehicleConfigurationSource { Q_OBJECT public: SetupWizard(QWidget *parent = 0); int nextId() const; - enum CONTROLLER_SELECTION_MODE {CONTROLLER_SELECTION_AUTOMATIC, CONTROLLER_SELECTION_MANUAL, CONTROLLER_SELECTION_UNKNOWN}; - enum CONTROLLER_TYPE {CONTROLLER_UNKNOWN, CONTROLLER_CC, CONTROLLER_CC3D, CONTROLLER_REVO, CONTROLLER_PIPX}; - enum VEHICLE_TYPE {VEHICLE_UNKNOWN, VEHICLE_MULTI, VEHICLE_FIXEDWING, VEHICLE_HELI, VEHICLE_SURFACE}; - enum VEHICLE_SUB_TYPE {MULTI_ROTOR_UNKNOWN, MULTI_ROTOR_TRI_Y, MULTI_ROTOR_QUAD_X, MULTI_ROTOR_QUAD_PLUS, - MULTI_ROTOR_HEXA, MULTI_ROTOR_HEXA_H, MULTI_ROTOR_HEXA_COAX_Y, MULTI_ROTOR_OCTO, - MULTI_ROTOR_OCTO_V, MULTI_ROTOR_OCTO_COAX_X, MULTI_ROTOR_OCTO_COAX_PLUS, FIXED_WING_AILERON, - FIXED_WING_VTAIL, HELI_CCPM}; - enum ESC_TYPE {ESC_DEFAULT, ESC_RAPID, ESC_UNKNOWN}; - enum INPUT_TYPE {INPUT_PWM, INPUT_PPM, INPUT_SBUS, INPUT_DSM, INPUT_UNKNOWN}; void setControllerSelectionMode(SetupWizard::CONTROLLER_SELECTION_MODE mode) { m_controllerSelectionMode = mode; } SetupWizard::CONTROLLER_SELECTION_MODE getControllerSelectionMode() const { return m_controllerSelectionMode; } @@ -86,13 +76,9 @@ public: return m_connectionManager; } public slots: - void exportConfiguration(); void writeConfiguration(); private: - static const qint16 DEFAULT_ESC_FREQUENCE = 50; - static const qint16 RAPID_ESC_FREQUENCE = 400; - enum {PAGE_START, PAGE_CONTROLLER, PAGE_VEHICLES, PAGE_MULTI, PAGE_FIXEDWING, PAGE_HELI, PAGE_SURFACE, PAGE_INPUT, PAGE_OUTPUT, PAGE_LEVELLING, PAGE_FLASH, PAGE_SUMMARY, PAGE_NOTYETIMPLEMENTED, PAGE_END}; @@ -108,22 +94,6 @@ private: accelGyroBias m_levellingBias; Core::ConnectionManager *m_connectionManager; - - UAVObjectManager *getUAVObjectManager(); - - void applyConfiguration(); - void applyHardwareConfiguration(UAVObjectManager *uavoMgr); - void applyVehicleConfiguration(UAVObjectManager *uavoMgr); - void applyOutputConfiguration(UAVObjectManager *uavoMgr); - void applyLevellingConfiguration(UAVObjectManager *uavoMgr); - - void resetVehicleConfig(UAVObjectManager *uavoMgr); - void resetMixerVectors(MixerSettings::DataFields data, qint8 channelIndex); - - void setupTriCopter(UAVObjectManager *uavoMgr); - void setupQuadCopter(UAVObjectManager *uavoMgr); - void setupHexaCopter(UAVObjectManager *uavoMgr); - void setupOctoCopter(UAVObjectManager *uavoMgr); }; #endif // SETUPWIZARD_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro index d3a6dc0da..3f1876bfa 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro @@ -25,7 +25,9 @@ HEADERS += setupwizardplugin.h \ pages/summarypage.h \ pages/flashpage.h \ pages/levellingpage.h \ - levellingutil.h + levellingutil.h \ + vehicleconfigurationsource.h \ + vehicleconfigurationhelper.h SOURCES += setupwizardplugin.cpp \ setupwizard.cpp \ @@ -44,7 +46,9 @@ SOURCES += setupwizardplugin.cpp \ pages/summarypage.cpp \ pages/flashpage.cpp \ pages/levellingpage.cpp \ - levellingutil.cpp + levellingutil.cpp \ + vehicleconfigurationsource.cpp \ + vehicleconfigurationhelper.cpp OTHER_FILES += SetupWizard.pluginspec diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp new file mode 100644 index 000000000..945d38b1e --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -0,0 +1,298 @@ +/** + ****************************************************************************** + * + * @file vehicleconfigurationhelper.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup VehicleConfigurationHelper + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "vehicleconfigurationhelper.h" +#include "extensionsystem/pluginmanager.h" +#include "hwsettings.h" +#include "actuatorsettings.h" +#include "attitudesettings.h" +#include "mixersettings.h" +#include "systemsettings.h" + +VehicleConfigurationHelper::VehicleConfigurationHelper(VehicleConfigurationSource *configSource) + : m_configSource(configSource), m_uavoManager(0) +{ + Q_ASSERT(m_configSource); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + m_uavoManager = pm->getObject(); + Q_ASSERT(m_uavoManager); +} + +void VehicleConfigurationHelper::setupVehicle() +{ + applyHardwareConfiguration(); + applyVehicleConfiguration(); + applyOutputConfiguration(); + applyFlighModeConfiguration(); + applyLevellingConfiguration(); +} + +void VehicleConfigurationHelper::applyHardwareConfiguration() +{ + HwSettings* hwSettings = HwSettings::GetInstance(m_uavoManager); + HwSettings::DataFields data = hwSettings->getData(); + switch(m_configSource->getControllerType()) + { + case VehicleConfigurationSource::CONTROLLER_CC: + case VehicleConfigurationSource::CONTROLLER_CC3D: + // Reset all ports + data.CC_RcvrPort = HwSettings::CC_RCVRPORT_DISABLED; + data.CC_FlexiPort = HwSettings::CC_FLEXIPORT_DISABLED; + data.CC_MainPort = HwSettings::CC_MAINPORT_DISABLED; + switch(m_configSource->getInputType()) + { + case VehicleConfigurationSource::INPUT_PWM: + data.CC_RcvrPort = HwSettings::CC_RCVRPORT_PWM; + break; + case VehicleConfigurationSource::INPUT_PPM: + data.CC_RcvrPort = HwSettings::CC_RCVRPORT_PPM; + break; + case VehicleConfigurationSource::INPUT_SBUS: + data.CC_MainPort = HwSettings::CC_MAINPORT_SBUS; + break; + case VehicleConfigurationSource::INPUT_DSM: + // TODO: Handle all of the DSM types ?? Which is most common? + data.CC_MainPort = HwSettings::CC_MAINPORT_DSM2; + break; + default: + break; + } + break; + case VehicleConfigurationSource::CONTROLLER_REVO: + // TODO: Implement Revo settings + break; + default: + break; + } + hwSettings->setData(data); +} + +void VehicleConfigurationHelper::applyVehicleConfiguration() +{ + + switch(m_configSource->getVehicleType()) + { + case VehicleConfigurationSource::VEHICLE_MULTI: + { + resetGUIData(); + resetVehicleConfig(); + + switch(m_configSource->getVehicleSubType()) + { + case VehicleConfigurationSource::MULTI_ROTOR_TRI_Y: + setupTriCopter(); + break; + case VehicleConfigurationSource::MULTI_ROTOR_QUAD_X: + case VehicleConfigurationSource::MULTI_ROTOR_QUAD_PLUS: + setupQuadCopter(); + break; + case VehicleConfigurationSource::MULTI_ROTOR_HEXA: + case VehicleConfigurationSource::MULTI_ROTOR_HEXA_COAX_Y: + case VehicleConfigurationSource::MULTI_ROTOR_HEXA_H: + setupHexaCopter(); + break; + case VehicleConfigurationSource::MULTI_ROTOR_OCTO: + case VehicleConfigurationSource::MULTI_ROTOR_OCTO_COAX_X: + case VehicleConfigurationSource::MULTI_ROTOR_OCTO_COAX_PLUS: + case VehicleConfigurationSource::MULTI_ROTOR_OCTO_V: + setupOctoCopter(); + break; + default: + break; + } + break; + } + case VehicleConfigurationSource::VEHICLE_FIXEDWING: + case VehicleConfigurationSource::VEHICLE_HELI: + case VehicleConfigurationSource::VEHICLE_SURFACE: + // TODO: Implement settings for other vehicle types? + break; + default: + break; + } +} + +void VehicleConfigurationHelper::applyOutputConfiguration() +{ + ActuatorSettings* actSettings = ActuatorSettings::GetInstance(m_uavoManager); + switch(m_configSource->getVehicleType()) + { + case VehicleConfigurationSource::VEHICLE_MULTI: + { + ActuatorSettings::DataFields data = actSettings->getData(); + + data.ChannelUpdateFreq[0] = LEGACY_ESC_FREQUENCE; + data.ChannelUpdateFreq[1] = LEGACY_ESC_FREQUENCE; + data.ChannelUpdateFreq[3] = LEGACY_ESC_FREQUENCE; + data.ChannelUpdateFreq[4] = LEGACY_ESC_FREQUENCE; + + qint16 updateFrequence = LEGACY_ESC_FREQUENCE; + switch(m_configSource->getESCType()) + { + case VehicleConfigurationSource::ESC_LEGACY: + updateFrequence = LEGACY_ESC_FREQUENCE; + break; + case VehicleConfigurationSource::ESC_RAPID: + updateFrequence = RAPID_ESC_FREQUENCE; + break; + default: + break; + } + + switch(m_configSource->getVehicleSubType()) + { + case VehicleConfigurationSource::MULTI_ROTOR_TRI_Y: + data.ChannelUpdateFreq[0] = updateFrequence; + break; + case VehicleConfigurationSource::MULTI_ROTOR_QUAD_X: + case VehicleConfigurationSource::MULTI_ROTOR_QUAD_PLUS: + data.ChannelUpdateFreq[0] = updateFrequence; + data.ChannelUpdateFreq[1] = updateFrequence; + break; + case VehicleConfigurationSource::MULTI_ROTOR_HEXA: + case VehicleConfigurationSource::MULTI_ROTOR_HEXA_COAX_Y: + case VehicleConfigurationSource::MULTI_ROTOR_HEXA_H: + case VehicleConfigurationSource::MULTI_ROTOR_OCTO: + case VehicleConfigurationSource::MULTI_ROTOR_OCTO_COAX_X: + case VehicleConfigurationSource::MULTI_ROTOR_OCTO_COAX_PLUS: + case VehicleConfigurationSource::MULTI_ROTOR_OCTO_V: + data.ChannelUpdateFreq[0] = updateFrequence; + data.ChannelUpdateFreq[1] = updateFrequence; + data.ChannelUpdateFreq[3] = updateFrequence; + data.ChannelUpdateFreq[4] = updateFrequence; + break; + default: + break; + } + actSettings->setData(data); + break; + } + case VehicleConfigurationSource::VEHICLE_FIXEDWING: + case VehicleConfigurationSource::VEHICLE_HELI: + case VehicleConfigurationSource::VEHICLE_SURFACE: + // TODO: Implement settings for other vehicle types? + break; + default: + break; + } +} + +void VehicleConfigurationHelper::applyFlighModeConfiguration() +{ +} + +void VehicleConfigurationHelper::applyLevellingConfiguration() +{ + if(m_configSource->isLevellingPerformed()) + { + accelGyroBias bias = m_configSource->getLevellingBias(); + AttitudeSettings::DataFields attitudeSettingsData = AttitudeSettings::GetInstance(m_uavoManager)->getData(); + attitudeSettingsData.AccelBias[0] += bias.m_accelerometerXBias; + attitudeSettingsData.AccelBias[1] += bias.m_accelerometerYBias; + attitudeSettingsData.AccelBias[2] += bias.m_accelerometerZBias; + attitudeSettingsData.GyroBias[0] = -bias.m_gyroXBias; + attitudeSettingsData.GyroBias[1] = -bias.m_gyroYBias; + attitudeSettingsData.GyroBias[2] = -bias.m_gyroZBias; + AttitudeSettings::GetInstance(m_uavoManager)->setData(attitudeSettingsData); + } +} + + +void VehicleConfigurationHelper::resetVehicleConfig() +{ + // Reset all vehicle data + MixerSettings* mSettings = MixerSettings::GetInstance(m_uavoManager); + + // Reset feed forward, accel times etc + mSettings->setFeedForward(0.0f); + mSettings->setMaxAccel(1000.0f); + mSettings->setAccelTime(0.0f); + mSettings->setDecelTime(0.0f); + + // Reset throttle curves + QString throttlePattern = "ThrottleCurve%1"; + for(int i = 1; i <= 2; i++) { + UAVObjectField *field = mSettings->getField(throttlePattern.arg(i)); + Q_ASSERT(field); + for(int i = 0; i < field->getNumElements(); i++){ + field->setValue(i * ( 1.0f / field->getNumElements()), i); + } + } + + // Reset Mixer types and values + QString mixerTypePattern = "Mixer%1Type"; + QString mixerVectorPattern = "Mixer%1Vector"; + for(int i = 1; i <= 10; i++) { + UAVObjectField *field = mSettings->getField(mixerTypePattern.arg(i)); + Q_ASSERT(field); + field->setValue(field->getOptions().at(0)); + + field = mSettings->getField(mixerVectorPattern.arg(i)); + Q_ASSERT(field); + for(int i = 0; i < field->getNumElements(); i++){ + field->setValue(0, i); + } + } + + // Apply updates + mSettings->setData(mSettings->getData()); +} + +void VehicleConfigurationHelper::resetGUIData() +{ + SystemSettings * sSettings = SystemSettings::GetInstance(m_uavoManager); + Q_ASSERT(sSettings); + SystemSettings::DataFields data = sSettings->getData(); + data.AirframeType = SystemSettings::AIRFRAMETYPE_CUSTOM; + for(int i = 0; i < SystemSettings::GUICONFIGDATA_NUMELEM; i++) + { + data.GUIConfigData[i] = 0; + } + sSettings->setData(data); +} + + +void VehicleConfigurationHelper::setupTriCopter() +{ + // Typical vehicle setup + // 1. Setup and apply mixer + // 2. Setup GUI data + mixerSettings mixer; + mixer.channels[0].type = 0; +} + +void VehicleConfigurationHelper::setupQuadCopter() +{ +} + +void VehicleConfigurationHelper::setupHexaCopter() +{ +} + +void VehicleConfigurationHelper::setupOctoCopter() +{ +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h new file mode 100644 index 000000000..4c795d8c1 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h @@ -0,0 +1,80 @@ +/** + ****************************************************************************** + * + * @file vehicleconfigurationhelper.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup VehicleConfigurationHelper + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef VEHICLECONFIGURATIONHELPER_H +#define VEHICLECONFIGURATIONHELPER_H + +#include "vehicleconfigurationsource.h" +#include "uavobjectmanager.h" + +struct channelSettings { + int type; + int throttle1; + int throttle2; + int roll; + int pitch; + int yaw; + + channelSettings() : type(), throttle1(), throttle2(), roll(), pitch(), yaw() {} + + channelSettings(int t, int th1, int th2, int r, int p, int y) + : type(t), throttle1(th1), throttle2(th2), roll(r), pitch(p), yaw(y) {} +}; + +struct mixerSettings { + channelSettings channels[10]; +}; + +class VehicleConfigurationHelper +{ +public: + VehicleConfigurationHelper(VehicleConfigurationSource* configSource); + void setupVehicle(); +private: + static const qint16 LEGACY_ESC_FREQUENCE = 50; + static const qint16 RAPID_ESC_FREQUENCE = 400; + + VehicleConfigurationSource *m_configSource; + UAVObjectManager *m_uavoManager; + + void applyHardwareConfiguration(); + void applyVehicleConfiguration(); + void applyOutputConfiguration(); + void applyFlighModeConfiguration(); + void applyLevellingConfiguration(); + + void resetVehicleConfig(); + void resetGUIData(); + + void setupTriCopter(); + void setupQuadCopter(); + void setupHexaCopter(); + void setupOctoCopter(); + +}; + +#endif // VEHICLECONFIGURATIONHELPER_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.cpp new file mode 100644 index 000000000..3acb2400d --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.cpp @@ -0,0 +1,32 @@ +/** + ****************************************************************************** + * + * @file vehicleconfigurationsource.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup VehicleConfigurationSource + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "vehicleconfigurationsource.h" + +VehicleConfigurationSource::VehicleConfigurationSource() +{ +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h new file mode 100644 index 000000000..fb4924fe7 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h @@ -0,0 +1,72 @@ +/** + ****************************************************************************** + * + * @file vehicleconfigurationsource.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup VehicleConfigurationSource + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef VEHICLECONFIGURATIONSOURCE_H +#define VEHICLECONFIGURATIONSOURCE_H + +#include + +struct accelGyroBias { + float m_accelerometerXBias; + float m_accelerometerYBias; + float m_accelerometerZBias; + + float m_gyroXBias; + float m_gyroYBias; + float m_gyroZBias; +}; + +class VehicleConfigurationSource +{ +public: + VehicleConfigurationSource(); + + enum CONTROLLER_SELECTION_MODE {CONTROLLER_SELECTION_AUTOMATIC, CONTROLLER_SELECTION_MANUAL, CONTROLLER_SELECTION_UNKNOWN}; + enum CONTROLLER_TYPE {CONTROLLER_UNKNOWN, CONTROLLER_CC, CONTROLLER_CC3D, CONTROLLER_REVO, CONTROLLER_PIPX}; + enum VEHICLE_TYPE {VEHICLE_UNKNOWN, VEHICLE_MULTI, VEHICLE_FIXEDWING, VEHICLE_HELI, VEHICLE_SURFACE}; + enum VEHICLE_SUB_TYPE {MULTI_ROTOR_UNKNOWN, MULTI_ROTOR_TRI_Y, MULTI_ROTOR_QUAD_X, MULTI_ROTOR_QUAD_PLUS, + MULTI_ROTOR_HEXA, MULTI_ROTOR_HEXA_H, MULTI_ROTOR_HEXA_COAX_Y, MULTI_ROTOR_OCTO, + MULTI_ROTOR_OCTO_V, MULTI_ROTOR_OCTO_COAX_X, MULTI_ROTOR_OCTO_COAX_PLUS, FIXED_WING_AILERON, + FIXED_WING_VTAIL, HELI_CCPM}; + enum ESC_TYPE {ESC_RAPID, ESC_LEGACY, ESC_UNKNOWN}; + enum INPUT_TYPE {INPUT_PWM, INPUT_PPM, INPUT_SBUS, INPUT_DSM, INPUT_UNKNOWN}; + + virtual VehicleConfigurationSource::CONTROLLER_SELECTION_MODE getControllerSelectionMode() const = 0; + virtual VehicleConfigurationSource::CONTROLLER_TYPE getControllerType() const = 0; + virtual VehicleConfigurationSource::VEHICLE_TYPE getVehicleType() const = 0; + virtual VehicleConfigurationSource::VEHICLE_SUB_TYPE getVehicleSubType() const = 0; + virtual VehicleConfigurationSource::INPUT_TYPE getInputType() const = 0; + virtual VehicleConfigurationSource::ESC_TYPE getESCType() const = 0; + + virtual bool isLevellingPerformed() = 0; + virtual accelGyroBias getLevellingBias() const = 0; + + virtual QString getSummaryText() = 0; + +}; + +#endif // VEHICLECONFIGURATIONSOURCE_H From 9205400cf01696a7259c9c84a1991ce3b4aff6d9 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sun, 19 Aug 2012 23:25:50 +0200 Subject: [PATCH 08/56] OP-39 Implemented functionality for reliable writing of UAVOs to controller board. Removed the option to configure the board without having it connected. Added Tri, QuadX and QuadP configuration code. Updated some of the texts. --- .../setupwizard/pages/controllerpage.cpp | 26 +- .../setupwizard/pages/controllerpage.h | 1 - .../setupwizard/pages/controllerpage.ui | 18 +- .../plugins/setupwizard/pages/flashpage.cpp | 36 +- .../src/plugins/setupwizard/pages/flashpage.h | 8 +- .../plugins/setupwizard/pages/flashpage.ui | 50 ++- .../setupwizard/pages/levellingpage.cpp | 2 +- .../setupwizard/pages/levellingpage.ui | 10 +- .../src/plugins/setupwizard/setupwizard.cpp | 57 ++- .../src/plugins/setupwizard/setupwizard.h | 6 - .../vehicleconfigurationhelper.cpp | 381 ++++++++++++++++-- .../setupwizard/vehicleconfigurationhelper.h | 42 +- .../setupwizard/vehicleconfigurationsource.h | 2 - 13 files changed, 527 insertions(+), 112 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp index 54e63ad5d..24d5a578e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp @@ -45,7 +45,6 @@ ControllerPage::ControllerPage(SetupWizard *wizard, QWidget *parent) : connect(m_connectionManager, SIGNAL(deviceConnected(QIODevice*)), this, SLOT(connectionStatusChanged())); connect(m_connectionManager, SIGNAL(deviceDisconnected()), this, SLOT(connectionStatusChanged())); - connect(ui->manualCB, SIGNAL(toggled(bool)), this, SLOT(identificationModeChanged())); connect(ui->connectButton, SIGNAL(clicked()), this, SLOT(connectDisconnect())); setupBoardTypes(); @@ -71,14 +70,12 @@ void ControllerPage::initializePage() bool ControllerPage::isComplete() const { - return (ui->manualCB->isChecked() && ui->boardTypeCombo->currentIndex() > 0) || - (!ui->manualCB->isChecked() && m_connectionManager->isConnected() && ui->boardTypeCombo->currentIndex() > 0); + return m_connectionManager->isConnected() && ui->boardTypeCombo->currentIndex() > 0; } bool ControllerPage::validatePage() { getWizard()->setControllerType((SetupWizard::CONTROLLER_TYPE)ui->boardTypeCombo->itemData(ui->boardTypeCombo->currentIndex()).toInt()); - getWizard()->setControllerSelectionMode(ui->manualCB->isChecked() ? SetupWizard::CONTROLLER_SELECTION_MANUAL : SetupWizard::CONTROLLER_SELECTION_AUTOMATIC); return true; } @@ -172,7 +169,6 @@ void ControllerPage::connectionStatusChanged() ui->deviceCombo->setEnabled(false); ui->connectButton->setText(tr("Disconnect")); ui->boardTypeCombo->setEnabled(false); - ui->manualCB->setEnabled(false); QString connectedDeviceName = m_connectionManager->getCurrentDevice().devName; for(int i = 0; i < ui->deviceCombo->count(); ++i) { if(connectedDeviceName == ui->deviceCombo->itemData(i, Qt::ToolTipRole).toString()) { @@ -188,32 +184,12 @@ void ControllerPage::connectionStatusChanged() ui->deviceCombo->setEnabled(true); ui->connectButton->setText(tr("Connect")); ui->boardTypeCombo->setEnabled(false); - ui->manualCB->setEnabled(true); ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(0, 0), QVariant(0), Qt::UserRole - 1); setControllerType(SetupWizard::CONTROLLER_UNKNOWN); } emit completeChanged(); } -void ControllerPage::identificationModeChanged() -{ - if(ui->manualCB->isChecked()) { - ui->deviceCombo->setEnabled(false); - ui->boardTypeCombo->setEnabled(true); - ui->connectButton->setEnabled(false); - ui->boardTypeCombo->setCurrentIndex(1); - //ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(0, 0), QVariant(0), Qt::UserRole - 1); - } - else { - ui->connectButton->setEnabled(ui->deviceCombo->count() > 0); - ui->deviceCombo->setEnabled(!m_connectionManager->isConnected()); - //ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(0, 0), QVariant(1), Qt::UserRole - 1); - ui->boardTypeCombo->setCurrentIndex(0); - ui->boardTypeCombo->setEnabled(false); - } - emit completeChanged(); -} - void ControllerPage::connectDisconnect() { if(m_connectionManager->isConnected()) { diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.h index b9b8ae111..177976731 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.h @@ -60,7 +60,6 @@ private: private slots: void devicesChanged(QLinkedList devices); void connectionStatusChanged(); - void identificationModeChanged(); void connectDisconnect(); }; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui index a949d6a1d..61a6d1ff7 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui @@ -32,9 +32,7 @@ p, li { white-space: pre-wrap; } <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;">To continue we need to know what kind of OpenPilot board you want the wizard to create a configuration for. The wizard will try to automatically detect what type of board you have connected.</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;"></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 connect the board to a free usb port on your computer, or if a serial modem like BlueTooth, PipX or other is used, then power up the board and select the device to connect with from the list below. Then press Connect.</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:10pt;">If the board already is connected and succesfully detected the board type will allready be displayed. You can disconnect and select another device if you need to detect another board.</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;"></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;">If your board isnt detected or if you want to create a configuration for a board that is not connected. Then select the Manual selection option below and select the board type from the drop down menu.</span></p></body></html> +<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;">If the board already is connected and succesfully detected the board type will allready be displayed. You can disconnect and select another device if you need to detect another board.</span></p></body></html> Qt::AutoText @@ -99,19 +97,6 @@ p, li { white-space: pre-wrap; } Connect - - - - 441 - 33 - 101 - 17 - - - - Manual selection - - @@ -153,7 +138,6 @@ p, li { white-space: pre-wrap; } deviceCombo connectButton boardTypeCombo - manualCB label_2 label_3 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp index 713270d83..f7438c8be 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp @@ -28,14 +28,14 @@ #include "flashpage.h" #include "ui_flashpage.h" #include "setupwizard.h" +#include "vehicleconfigurationhelper.h" FlashPage::FlashPage(SetupWizard *wizard, QWidget *parent) : AbstractWizardPage(wizard, parent), - - ui(new Ui::FlashPage) + ui(new Ui::FlashPage), m_successfulWrite(false) { ui->setupUi(this); - connect(ui->applyButton, SIGNAL(clicked()), wizard, SLOT(writeConfiguration())); + connect(ui->saveButton, SIGNAL(clicked()), this, SLOT(writeToController())); } FlashPage::~FlashPage() @@ -47,3 +47,33 @@ bool FlashPage::validatePage() { return true; } + +bool FlashPage::isComplete() const +{ + return m_successfulWrite; +} + +void FlashPage::writeToController() +{ + ui->saveButton->setEnabled(false); + VehicleConfigurationHelper helper(getWizard()); + connect(&helper, SIGNAL(saveProgress(int, int, QString)),this, SLOT(saveProgress(int, int, QString))); + m_successfulWrite = helper.setupVehicle(); + disconnect(&helper, SIGNAL(saveProgress(int, int, QString)),this, SLOT(saveProgress(int, int, QString))); + emit completeChanged(); + ui->saveProgressLabel->setText(QString("%2").arg(m_successfulWrite ? "green" : "red", ui->saveProgressLabel->text())); + ui->saveButton->setEnabled(true); +} + +void FlashPage::saveProgress(int total, int current, QString description) +{ + if(ui->saveProgressBar->maximum() != total) { + ui->saveProgressBar->setMaximum(total); + } + if(ui->saveProgressBar->value() != current) { + ui->saveProgressBar->setValue(current); + } + if(ui->saveProgressLabel->text() != description) { + ui->saveProgressLabel->setText(description); + } +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h index 7aeb7ffc4..45e83ed61 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h @@ -42,9 +42,15 @@ public: explicit FlashPage(SetupWizard *wizard, QWidget *parent = 0); ~FlashPage(); bool validatePage(); + bool isComplete() const; -private: +private: Ui::FlashPage *ui; + bool m_successfulWrite; + +private slots: + void writeToController(); + void saveProgress(int total, int current, QString description); }; #endif // FLASHPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui index 37929e802..f4ad3f7a5 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui @@ -29,9 +29,11 @@ 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;"> <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 configuration ready to save</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:12pt; font-weight:600;"></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;">The wizard is now ready to write the configuration directly to your OpenPilot controller. This is only possible if the controller is connected and identified in the first step of this wizard. If the controller is not connected, or if the controller type was selected manually you can instead of writing the configuration to the controller save it to disk for later use.</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:10pt;">The wizard is now ready to write the configuration directly to your OpenPilot controller. </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;"></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;">If any of the selections made in this wizard requires a reboot of the controller then that will have to be performed after this step by power cycling the OpenPilot controller board.</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;"></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;">Press next to write the 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:10pt;"></p></body></html> @@ -45,9 +47,9 @@ p, li { white-space: pre-wrap; } 20 - 230 - 561 - 151 + 250 + 560 + 130 @@ -57,22 +59,48 @@ p, li { white-space: pre-wrap; } - Write configuration to controller or save + Write configuration to controller Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - + - 440 - 30 - 100 - 100 + 20 + 90 + 530 + 23 + + + + 0 + + + + + + 22 + 65 + 491 + 16 - Apply + Ready... + + + + + + 415 + 40 + 100 + 23 + + + + Write... diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp index cabde07b7..5438f1a83 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -84,7 +84,7 @@ void LevellingPage::performLevelling() void LevellingPage::levellingProgress(long current, long total) { - if(!ui->levellinProgressBar->maximum() != (int)total) { + if(ui->levellinProgressBar->maximum() != (int)total) { ui->levellinProgressBar->setMaximum((int)total); } if(ui->levellinProgressBar->value() != (int)current) { diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui index 9cf9ee148..e86ae3eaf 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui @@ -47,8 +47,8 @@ p, li { white-space: pre-wrap; } 20 250 - 561 - 131 + 560 + 130 @@ -68,7 +68,7 @@ p, li { white-space: pre-wrap; } 20 90 - 531 + 530 23 @@ -79,9 +79,9 @@ p, li { white-space: pre-wrap; } - 414 + 415 40 - 101 + 100 23 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index 0dc44c62d..155accd14 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -44,7 +44,7 @@ #include "vehicleconfigurationhelper.h" SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), VehicleConfigurationSource(), - m_controllerSelectionMode(CONTROLLER_SELECTION_UNKNOWN), m_controllerType(CONTROLLER_UNKNOWN), + m_controllerType(CONTROLLER_UNKNOWN), m_vehicleType(VEHICLE_UNKNOWN), m_inputType(INPUT_UNKNOWN), m_escType(ESC_UNKNOWN), m_levellingPerformed(false), m_connectionManager(0) { @@ -90,13 +90,7 @@ int SetupWizard::nextId() const case PAGE_INPUT: return PAGE_VEHICLES; case PAGE_OUTPUT: - { - if(getControllerSelectionMode() == CONTROLLER_SELECTION_AUTOMATIC) { - return PAGE_LEVELLING; - } else { - return PAGE_SUMMARY; - } - } + return PAGE_LEVELLING; case PAGE_LEVELLING: return PAGE_SUMMARY; case PAGE_SUMMARY: @@ -139,6 +133,46 @@ QString SetupWizard::getSummaryText() { case VEHICLE_MULTI: summary.append(tr("Multirotor")); + + summary.append('\n'); + summary.append(tr("Vehicle sub type: ")); + switch (getVehicleSubType()) + { + case SetupWizard::MULTI_ROTOR_TRI_Y: + summary.append(tr("Tricopter")); + break; + case SetupWizard::MULTI_ROTOR_QUAD_X: + summary.append(tr("Quadcopter X")); + break; + case SetupWizard::MULTI_ROTOR_QUAD_PLUS: + summary.append(tr("Quadcopter +")); + break; + case SetupWizard::MULTI_ROTOR_HEXA: + summary.append(tr("Hexacopter")); + break; + case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y: + summary.append(tr("Hexacopter Coax (Y6)")); + break; + case SetupWizard::MULTI_ROTOR_HEXA_H: + summary.append(tr("Hexacopter H")); + break; + case SetupWizard::MULTI_ROTOR_OCTO: + summary.append(tr("Octocopter")); + break; + case SetupWizard::MULTI_ROTOR_OCTO_COAX_X: + summary.append(tr("Octocopter Coax X")); + break; + case SetupWizard::MULTI_ROTOR_OCTO_COAX_PLUS: + summary.append(tr("Octocopter Coax +")); + break; + case SetupWizard::MULTI_ROTOR_OCTO_V: + summary.append(tr("Octocopter V")); + break; + default: + summary.append(tr("Unknown")); + break; + } + break; case VEHICLE_FIXEDWING: summary.append(tr("Fixed wing")); @@ -199,13 +233,6 @@ QString SetupWizard::getSummaryText() return summary; } -void SetupWizard::writeConfiguration() -{ - VehicleConfigurationHelper *helper = new VehicleConfigurationHelper(this); - Q_ASSERT(helper); - helper->setupVehicle(); -} - void SetupWizard::createPages() { setPage(PAGE_START, new StartPage(this)); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h index 566ec46ab..e687108e4 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h @@ -43,9 +43,6 @@ public: SetupWizard(QWidget *parent = 0); int nextId() const; - void setControllerSelectionMode(SetupWizard::CONTROLLER_SELECTION_MODE mode) { m_controllerSelectionMode = mode; } - SetupWizard::CONTROLLER_SELECTION_MODE getControllerSelectionMode() const { return m_controllerSelectionMode; } - void setControllerType(SetupWizard::CONTROLLER_TYPE type) { m_controllerType = type; } SetupWizard::CONTROLLER_TYPE getControllerType() const { return m_controllerType; } @@ -75,8 +72,6 @@ public: } return m_connectionManager; } -public slots: - void writeConfiguration(); private: enum {PAGE_START, PAGE_CONTROLLER, PAGE_VEHICLES, PAGE_MULTI, PAGE_FIXEDWING, @@ -84,7 +79,6 @@ private: PAGE_FLASH, PAGE_SUMMARY, PAGE_NOTYETIMPLEMENTED, PAGE_END}; void createPages(); - CONTROLLER_SELECTION_MODE m_controllerSelectionMode; CONTROLLER_TYPE m_controllerType; VEHICLE_TYPE m_vehicleType; VEHICLE_SUB_TYPE m_vehicleSubType; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp index 945d38b1e..aab9de186 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -34,7 +34,9 @@ #include "systemsettings.h" VehicleConfigurationHelper::VehicleConfigurationHelper(VehicleConfigurationSource *configSource) - : m_configSource(configSource), m_uavoManager(0) + : m_configSource(configSource), m_uavoManager(0), + m_transactionOK(false), m_transactionTimeout(false), m_currentTransactionObjectID(-1), + m_progress(0) { Q_ASSERT(m_configSource); ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); @@ -42,13 +44,45 @@ VehicleConfigurationHelper::VehicleConfigurationHelper(VehicleConfigurationSourc Q_ASSERT(m_uavoManager); } -void VehicleConfigurationHelper::setupVehicle() +bool VehicleConfigurationHelper::setupVehicle() { + m_progress = 0; + clearModifiedObjects(); + resetVehicleConfig(); + resetGUIData(); + if(!saveChangesToController()) + { + return false; + } + applyHardwareConfiguration(); applyVehicleConfiguration(); applyOutputConfiguration(); applyFlighModeConfiguration(); applyLevellingConfiguration(); + + bool result = saveChangesToController(); + if(result) { + emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Done!")); + } + else { + emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Failed!")); + } + return result; +} + +void VehicleConfigurationHelper::addModifiedObject(UAVDataObject *object, QString description) +{ + m_modifiedObjects << new QPair(object, description); +} + +void VehicleConfigurationHelper::clearModifiedObjects() +{ + for(int i = 0; i < m_modifiedObjects.count(); i++) { + QPair *pair = m_modifiedObjects.at(i); + delete pair; + } + m_modifiedObjects.clear(); } void VehicleConfigurationHelper::applyHardwareConfiguration() @@ -88,7 +122,8 @@ void VehicleConfigurationHelper::applyHardwareConfiguration() default: break; } - hwSettings->setData(data); + //hwSettings->setData(data); + addModifiedObject(hwSettings, tr("Writing hardware settings")); } void VehicleConfigurationHelper::applyVehicleConfiguration() @@ -98,9 +133,6 @@ void VehicleConfigurationHelper::applyVehicleConfiguration() { case VehicleConfigurationSource::VEHICLE_MULTI: { - resetGUIData(); - resetVehicleConfig(); - switch(m_configSource->getVehicleSubType()) { case VehicleConfigurationSource::MULTI_ROTOR_TRI_Y: @@ -188,7 +220,8 @@ void VehicleConfigurationHelper::applyOutputConfiguration() default: break; } - actSettings->setData(data); + //actSettings->setData(data); + addModifiedObject(actSettings, tr("Writing output rate settings")); break; } case VehicleConfigurationSource::VEHICLE_FIXEDWING: @@ -210,17 +243,179 @@ void VehicleConfigurationHelper::applyLevellingConfiguration() if(m_configSource->isLevellingPerformed()) { accelGyroBias bias = m_configSource->getLevellingBias(); - AttitudeSettings::DataFields attitudeSettingsData = AttitudeSettings::GetInstance(m_uavoManager)->getData(); - attitudeSettingsData.AccelBias[0] += bias.m_accelerometerXBias; - attitudeSettingsData.AccelBias[1] += bias.m_accelerometerYBias; - attitudeSettingsData.AccelBias[2] += bias.m_accelerometerZBias; - attitudeSettingsData.GyroBias[0] = -bias.m_gyroXBias; - attitudeSettingsData.GyroBias[1] = -bias.m_gyroYBias; - attitudeSettingsData.GyroBias[2] = -bias.m_gyroZBias; - AttitudeSettings::GetInstance(m_uavoManager)->setData(attitudeSettingsData); + AttitudeSettings* attitudeSettings = AttitudeSettings::GetInstance(m_uavoManager); + Q_ASSERT(attitudeSettings); + AttitudeSettings::DataFields data = attitudeSettings->getData(); + + data.AccelBias[0] += bias.m_accelerometerXBias; + data.AccelBias[1] += bias.m_accelerometerYBias; + data.AccelBias[2] += bias.m_accelerometerZBias; + data.GyroBias[0] = -bias.m_gyroXBias; + data.GyroBias[1] = -bias.m_gyroYBias; + data.GyroBias[2] = -bias.m_gyroZBias; + + //AttitudeSettings::GetInstance(m_uavoManager)->setData(data); + addModifiedObject(attitudeSettings, tr("Writing levelling bias settings")); } } +void VehicleConfigurationHelper::applyMixerConfiguration(mixerSettings mixer) +{ + // Set all mixer data + MixerSettings* mSettings = MixerSettings::GetInstance(m_uavoManager); + + // Set Mixer types and values + QString mixerTypePattern = "Mixer%1Type"; + QString mixerVectorPattern = "Mixer%1Vector"; + for(int i = 0; i < 10; i++) { + UAVObjectField *field = mSettings->getField(mixerTypePattern.arg(i + 1)); + Q_ASSERT(field); + field->setValue(field->getOptions().at(mixer.channels[i].type)); + + field = mSettings->getField(mixerVectorPattern.arg(i + 1)); + Q_ASSERT(field); + field->setValue((mixer.channels[i].throttle1 * 127) / 100, 0); + field->setValue((mixer.channels[i].throttle2 * 127) / 100, 1); + field->setValue((mixer.channels[i].roll * 127) / 100, 2); + field->setValue((mixer.channels[i].pitch * 127) / 100, 3); + field->setValue((mixer.channels[i].yaw *127) / 100, 4); + } + + // Apply updates + //mSettings->setData(mSettings->getData()); + addModifiedObject(mSettings, tr("Writing mixer settings")); + +} + +void VehicleConfigurationHelper::applyMultiGUISettings(SystemSettings::AirframeTypeOptions airframe, GUIConfigDataUnion guiConfig) +{ + SystemSettings * sSettings = SystemSettings::GetInstance(m_uavoManager); + Q_ASSERT(sSettings); + SystemSettings::DataFields data = sSettings->getData(); + data.AirframeType = airframe; + + for (int i = 0; i < (int)(SystemSettings::GUICONFIGDATA_NUMELEM); i++) { + data.GUIConfigData[i] = guiConfig.UAVObject[i]; + } + + sSettings->setData(data); + addModifiedObject(sSettings, tr("Writing vehicle settings")); +} + +bool VehicleConfigurationHelper::saveChangesToController() +{ + qDebug() << "Saving modified objects to controller. " << m_modifiedObjects.count() << " objects in found."; + const int OUTER_TIMEOUT = 3000 * 20; // 10 seconds timeout for saving all objects + const int INNER_TIMEOUT = 2000; // 1 second timeout on every save attempt + + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + Q_ASSERT(pm); + UAVObjectUtilManager* utilMngr = pm->getObject(); + Q_ASSERT(utilMngr); + + QTimer outerTimeoutTimer; + outerTimeoutTimer.setSingleShot(true); + + QTimer innerTimeoutTimer; + innerTimeoutTimer.setSingleShot(true); + + connect(utilMngr, SIGNAL(saveCompleted(int ,bool)), this, SLOT(uAVOTransactionCompleted(int, bool))); + connect(&innerTimeoutTimer, SIGNAL(timeout()), &m_eventLoop, SLOT(quit())); + connect(&outerTimeoutTimer, SIGNAL(timeout()), this, SLOT(saveChangesTimeout())); + + outerTimeoutTimer.start(OUTER_TIMEOUT); + for(int i = 0; i < m_modifiedObjects.count(); i++) { + QPair *objPair = m_modifiedObjects.at(i); + m_transactionOK = false; + UAVDataObject* obj = objPair->first; + QString objDescription = objPair->second; + if(UAVObject::GetGcsAccess(obj->getMetadata()) != UAVObject::ACCESS_READONLY && obj->isSettings()) { + + emit saveProgress(PROGRESS_STEPS, ++m_progress, objDescription); + + m_currentTransactionObjectID = obj->getObjID(); + + connect(obj, SIGNAL(transactionCompleted(UAVObject* ,bool)), this, SLOT(uAVOTransactionCompleted(UAVObject*, bool))); + while(!m_transactionOK && !m_transactionTimeout) { + // Allow the transaction to take some time + innerTimeoutTimer.start(INNER_TIMEOUT); + + // Set object updated + obj->updated(); + if(!m_transactionOK) { + m_eventLoop.exec(); + } + innerTimeoutTimer.stop(); + } + disconnect(obj, SIGNAL(transactionCompleted(UAVObject* ,bool)), this, SLOT(uAVOTransactionCompleted(UAVObject*, bool))); + if(m_transactionOK) { + qDebug() << "Object " << obj->getName() << " was successfully updated."; + m_transactionOK = false; + m_currentTransactionObjectID = obj->getObjID(); + // Try to save until success or timeout + while(!m_transactionOK && !m_transactionTimeout) { + // Allow the transaction to take some time + innerTimeoutTimer.start(INNER_TIMEOUT); + + // Persist object in controller + utilMngr->saveObjectToSD(obj); + if(!m_transactionOK) { + m_eventLoop.exec(); + } + innerTimeoutTimer.stop(); + } + m_currentTransactionObjectID = -1; + } + + if(!m_transactionOK) { + qDebug() << "Transaction timed out when trying to save: " << obj->getName(); + } + else { + qDebug() << "Object " << obj->getName() << " was successfully saved."; + } + } + else { + qDebug() << "Trying to save a UAVDataObject that is read only or is not a settings object."; + } + if(m_transactionTimeout) { + qDebug() << "Transaction timed out when trying to save " << m_modifiedObjects.count() << " objects."; + break; + } + } + + outerTimeoutTimer.stop(); + disconnect(&outerTimeoutTimer, SIGNAL(timeout()), this, SLOT(saveChangesTimeout())); + disconnect(&innerTimeoutTimer, SIGNAL(timeout()), &m_eventLoop, SLOT(quit())); + disconnect(utilMngr, SIGNAL(saveCompleted(int, bool)), this, SLOT(uAVOTransactionCompleted(int, bool))); + + qDebug() << "Finished saving modified objects to controller. Success = " << m_transactionOK; + + clearModifiedObjects(); + return m_transactionOK; +} + +void VehicleConfigurationHelper::uAVOTransactionCompleted(int oid, bool success) +{ + if(oid == m_currentTransactionObjectID) + { + m_transactionOK = success; + m_eventLoop.quit(); + } +} + +void VehicleConfigurationHelper::uAVOTransactionCompleted(UAVObject *object, bool success) +{ + if(object) { + uAVOTransactionCompleted(object->getObjID(), success); + } +} + +void VehicleConfigurationHelper::saveChangesTimeout() +{ + m_transactionOK = false; + m_transactionTimeout = true; + m_eventLoop.quit(); +} void VehicleConfigurationHelper::resetVehicleConfig() { @@ -238,8 +433,8 @@ void VehicleConfigurationHelper::resetVehicleConfig() for(int i = 1; i <= 2; i++) { UAVObjectField *field = mSettings->getField(throttlePattern.arg(i)); Q_ASSERT(field); - for(int i = 0; i < field->getNumElements(); i++){ - field->setValue(i * ( 1.0f / field->getNumElements()), i); + for(quint32 i = 0; i < field->getNumElements(); i++){ + field->setValue(i * ( 1.0f / (field->getNumElements() - 1)), i); } } @@ -253,13 +448,14 @@ void VehicleConfigurationHelper::resetVehicleConfig() field = mSettings->getField(mixerVectorPattern.arg(i)); Q_ASSERT(field); - for(int i = 0; i < field->getNumElements(); i++){ + for(quint32 i = 0; i < field->getNumElements(); i++){ field->setValue(0, i); } } // Apply updates - mSettings->setData(mSettings->getData()); + //mSettings->setData(mSettings->getData()); + addModifiedObject(mSettings, tr("Preparing mixer settings")); } void VehicleConfigurationHelper::resetGUIData() @@ -268,11 +464,11 @@ void VehicleConfigurationHelper::resetGUIData() Q_ASSERT(sSettings); SystemSettings::DataFields data = sSettings->getData(); data.AirframeType = SystemSettings::AIRFRAMETYPE_CUSTOM; - for(int i = 0; i < SystemSettings::GUICONFIGDATA_NUMELEM; i++) - { + for(quint32 i = 0; i < SystemSettings::GUICONFIGDATA_NUMELEM; i++) { data.GUIConfigData[i] = 0; } - sSettings->setData(data); + //sSettings->setData(data); + addModifiedObject(sSettings, tr("Preparing vehicle settings")); } @@ -281,12 +477,151 @@ void VehicleConfigurationHelper::setupTriCopter() // Typical vehicle setup // 1. Setup and apply mixer // 2. Setup GUI data + mixerSettings mixer; - mixer.channels[0].type = 0; + mixer.channels[0].type = MIXER_TYPE_MOTOR; + mixer.channels[0].throttle1 = 100; + mixer.channels[0].throttle2 = 0; + mixer.channels[0].roll = 100; + mixer.channels[0].pitch = 50; + mixer.channels[0].yaw = 0; + + mixer.channels[1].type = MIXER_TYPE_MOTOR; + mixer.channels[1].throttle1 = 100; + mixer.channels[1].throttle2 = 0; + mixer.channels[1].roll = -100; + mixer.channels[1].pitch = 50; + mixer.channels[1].yaw = 0; + + mixer.channels[2].type = MIXER_TYPE_MOTOR; + mixer.channels[2].throttle1 = 100; + mixer.channels[2].throttle2 = 0; + mixer.channels[2].roll = 0; + mixer.channels[2].pitch = -100; + mixer.channels[2].yaw = 0; + + mixer.channels[3].type = MIXER_TYPE_SERVO; + mixer.channels[3].throttle1 = 0; + mixer.channels[3].throttle2 = 0; + mixer.channels[3].roll = 0; + mixer.channels[3].pitch = 0; + mixer.channels[3].yaw = 100; + + applyMixerConfiguration(mixer); + + GUIConfigDataUnion guiSettings = getGUIConfigData(); + + guiSettings.multi.VTOLMotorNW = 1; + guiSettings.multi.VTOLMotorNE = 2; + guiSettings.multi.VTOLMotorS = 3; + guiSettings.multi.TRIYaw = 4; + + applyMultiGUISettings(SystemSettings::AIRFRAMETYPE_TRI, guiSettings); +} + +GUIConfigDataUnion VehicleConfigurationHelper::getGUIConfigData() +{ + GUIConfigDataUnion configData; + + SystemSettings * systemSettings = SystemSettings::GetInstance(m_uavoManager); + Q_ASSERT(systemSettings); + SystemSettings::DataFields systemSettingsData = systemSettings->getData(); + + for(int i = 0; i < (int)(SystemSettings::GUICONFIGDATA_NUMELEM); i++) { + configData.UAVObject[i] = 0; //systemSettingsData.GUIConfigData[i]; + } + + return configData; } void VehicleConfigurationHelper::setupQuadCopter() { + mixerSettings mixer; + GUIConfigDataUnion guiSettings = getGUIConfigData(); + SystemSettings::AirframeTypeOptions frame; + + switch(m_configSource->getVehicleSubType()) + { + case VehicleConfigurationSource::MULTI_ROTOR_QUAD_PLUS: { + frame = SystemSettings::AIRFRAMETYPE_QUADP; + mixer.channels[0].type = MIXER_TYPE_MOTOR; + mixer.channels[0].throttle1 = 100; + mixer.channels[0].throttle2 = 0; + mixer.channels[0].roll = 0; + mixer.channels[0].pitch = 100; + mixer.channels[0].yaw = -50; + + mixer.channels[1].type = MIXER_TYPE_MOTOR; + mixer.channels[1].throttle1 = 100; + mixer.channels[1].throttle2 = 0; + mixer.channels[1].roll = -100; + mixer.channels[1].pitch = 0; + mixer.channels[1].yaw = 50; + + mixer.channels[2].type = MIXER_TYPE_MOTOR; + mixer.channels[2].throttle1 = 100; + mixer.channels[2].throttle2 = 0; + mixer.channels[2].roll = 0; + mixer.channels[2].pitch = -100; + mixer.channels[2].yaw = -50; + + mixer.channels[3].type = MIXER_TYPE_MOTOR; + mixer.channels[3].throttle1 = 100; + mixer.channels[3].throttle2 = 0; + mixer.channels[3].roll = 100; + mixer.channels[3].pitch = 0; + mixer.channels[3].yaw = 50; + + guiSettings.multi.VTOLMotorN = 1; + guiSettings.multi.VTOLMotorE = 2; + guiSettings.multi.VTOLMotorS = 3; + guiSettings.multi.VTOLMotorW = 4; + + break; + } + case VehicleConfigurationSource::MULTI_ROTOR_QUAD_X: { + frame = SystemSettings::AIRFRAMETYPE_QUADX; + mixer.channels[0].type = MIXER_TYPE_MOTOR; + mixer.channels[0].throttle1 = 100; + mixer.channels[0].throttle2 = 0; + mixer.channels[0].roll = 50; + mixer.channels[0].pitch = 50; + mixer.channels[0].yaw = -50; + + mixer.channels[1].type = MIXER_TYPE_MOTOR; + mixer.channels[1].throttle1 = 100; + mixer.channels[1].throttle2 = 0; + mixer.channels[1].roll = -50; + mixer.channels[1].pitch = 50; + mixer.channels[1].yaw = 50; + + mixer.channels[2].type = MIXER_TYPE_MOTOR; + mixer.channels[2].throttle1 = 100; + mixer.channels[2].throttle2 = 0; + mixer.channels[2].roll = -50; + mixer.channels[2].pitch = -50; + mixer.channels[2].yaw = -50; + + mixer.channels[3].type = MIXER_TYPE_MOTOR; + mixer.channels[3].throttle1 = 100; + mixer.channels[3].throttle2 = 0; + mixer.channels[3].roll = 50; + mixer.channels[3].pitch = -50; + mixer.channels[3].yaw = 50; + + guiSettings.multi.VTOLMotorNW = 1; + guiSettings.multi.VTOLMotorNE = 2; + guiSettings.multi.VTOLMotorSW = 3; + guiSettings.multi.VTOLMotorSE = 4; + + break; + } + default: + break; + } + applyMixerConfiguration(mixer); + applyMultiGUISettings(frame, guiSettings); + } void VehicleConfigurationHelper::setupHexaCopter() diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h index 4c795d8c1..9ee7c1beb 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h @@ -28,8 +28,12 @@ #ifndef VEHICLECONFIGURATIONHELPER_H #define VEHICLECONFIGURATIONHELPER_H +#include +#include #include "vehicleconfigurationsource.h" #include "uavobjectmanager.h" +#include "systemsettings.h" +#include "cfg_vehicletypes/vehicleconfig.h" struct channelSettings { int type; @@ -49,24 +53,52 @@ struct mixerSettings { channelSettings channels[10]; }; -class VehicleConfigurationHelper +class VehicleConfigurationHelper : public QObject { + Q_OBJECT + public: VehicleConfigurationHelper(VehicleConfigurationSource* configSource); - void setupVehicle(); + bool setupVehicle(); + +signals: + void saveProgress(int total, int current, QString description); + private: static const qint16 LEGACY_ESC_FREQUENCE = 50; static const qint16 RAPID_ESC_FREQUENCE = 400; + static const int MIXER_TYPE_DISABLED = 0; + static const int MIXER_TYPE_MOTOR = 1; + static const int MIXER_TYPE_SERVO = 2; + + static const int PROGRESS_STEPS = 8; + VehicleConfigurationSource *m_configSource; UAVObjectManager *m_uavoManager; + QList* > m_modifiedObjects; + void addModifiedObject(UAVDataObject* object, QString description); + void clearModifiedObjects(); + void applyHardwareConfiguration(); void applyVehicleConfiguration(); void applyOutputConfiguration(); void applyFlighModeConfiguration(); void applyLevellingConfiguration(); + void applyMixerConfiguration(mixerSettings mixer); + + GUIConfigDataUnion getGUIConfigData(); + void applyMultiGUISettings(SystemSettings::AirframeTypeOptions airframe, GUIConfigDataUnion guiConfig); + + bool saveChangesToController(); + QEventLoop m_eventLoop; + bool m_transactionOK; + bool m_transactionTimeout; + int m_currentTransactionObjectID; + int m_progress; + void resetVehicleConfig(); void resetGUIData(); @@ -75,6 +107,12 @@ private: void setupHexaCopter(); void setupOctoCopter(); +private slots: + void uAVOTransactionCompleted(UAVObject* object, bool success); + void uAVOTransactionCompleted(int oid, bool success); + void saveChangesTimeout(); + + }; #endif // VEHICLECONFIGURATIONHELPER_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h index fb4924fe7..b1109ce54 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h @@ -45,7 +45,6 @@ class VehicleConfigurationSource public: VehicleConfigurationSource(); - enum CONTROLLER_SELECTION_MODE {CONTROLLER_SELECTION_AUTOMATIC, CONTROLLER_SELECTION_MANUAL, CONTROLLER_SELECTION_UNKNOWN}; enum CONTROLLER_TYPE {CONTROLLER_UNKNOWN, CONTROLLER_CC, CONTROLLER_CC3D, CONTROLLER_REVO, CONTROLLER_PIPX}; enum VEHICLE_TYPE {VEHICLE_UNKNOWN, VEHICLE_MULTI, VEHICLE_FIXEDWING, VEHICLE_HELI, VEHICLE_SURFACE}; enum VEHICLE_SUB_TYPE {MULTI_ROTOR_UNKNOWN, MULTI_ROTOR_TRI_Y, MULTI_ROTOR_QUAD_X, MULTI_ROTOR_QUAD_PLUS, @@ -55,7 +54,6 @@ public: enum ESC_TYPE {ESC_RAPID, ESC_LEGACY, ESC_UNKNOWN}; enum INPUT_TYPE {INPUT_PWM, INPUT_PPM, INPUT_SBUS, INPUT_DSM, INPUT_UNKNOWN}; - virtual VehicleConfigurationSource::CONTROLLER_SELECTION_MODE getControllerSelectionMode() const = 0; virtual VehicleConfigurationSource::CONTROLLER_TYPE getControllerType() const = 0; virtual VehicleConfigurationSource::VEHICLE_TYPE getVehicleType() const = 0; virtual VehicleConfigurationSource::VEHICLE_SUB_TYPE getVehicleSubType() const = 0; From 10b9f00fac111e5f8d290c90497d6e40fa3b4980 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Mon, 20 Aug 2012 00:14:17 +0200 Subject: [PATCH 09/56] OP-39 Added setting of default flightmodes.. --- .../vehicleconfigurationhelper.cpp | 33 ++++++++++++++++--- .../setupwizard/vehicleconfigurationhelper.h | 2 +- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp index aab9de186..0de560ec4 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -32,6 +32,7 @@ #include "attitudesettings.h" #include "mixersettings.h" #include "systemsettings.h" +#import "manualcontrolsettings.h" VehicleConfigurationHelper::VehicleConfigurationHelper(VehicleConfigurationSource *configSource) : m_configSource(configSource), m_uavoManager(0), @@ -122,7 +123,7 @@ void VehicleConfigurationHelper::applyHardwareConfiguration() default: break; } - //hwSettings->setData(data); + hwSettings->setData(data); addModifiedObject(hwSettings, tr("Writing hardware settings")); } @@ -181,6 +182,7 @@ void VehicleConfigurationHelper::applyOutputConfiguration() data.ChannelUpdateFreq[1] = LEGACY_ESC_FREQUENCE; data.ChannelUpdateFreq[3] = LEGACY_ESC_FREQUENCE; data.ChannelUpdateFreq[4] = LEGACY_ESC_FREQUENCE; + data.MotorsSpinWhileArmed = ActuatorSettings::MOTORSSPINWHILEARMED_FALSE; qint16 updateFrequence = LEGACY_ESC_FREQUENCE; switch(m_configSource->getESCType()) @@ -220,7 +222,7 @@ void VehicleConfigurationHelper::applyOutputConfiguration() default: break; } - //actSettings->setData(data); + actSettings->setData(data); addModifiedObject(actSettings, tr("Writing output rate settings")); break; } @@ -236,6 +238,28 @@ void VehicleConfigurationHelper::applyOutputConfiguration() void VehicleConfigurationHelper::applyFlighModeConfiguration() { + ManualControlSettings* controlSettings = ManualControlSettings::GetInstance(m_uavoManager); + Q_ASSERT(controlSettings); + + ManualControlSettings::DataFields data = controlSettings->getData(); + data.Stabilization1Settings[0] = ManualControlSettings::STABILIZATION1SETTINGS_ATTITUDE; + data.Stabilization1Settings[1] = ManualControlSettings::STABILIZATION1SETTINGS_ATTITUDE; + data.Stabilization1Settings[2] = ManualControlSettings::STABILIZATION1SETTINGS_AXISLOCK; + data.Stabilization2Settings[0] = ManualControlSettings::STABILIZATION2SETTINGS_ATTITUDE; + data.Stabilization2Settings[1] = ManualControlSettings::STABILIZATION2SETTINGS_ATTITUDE; + data.Stabilization2Settings[2] = ManualControlSettings::STABILIZATION2SETTINGS_RATE; + data.Stabilization3Settings[0] = ManualControlSettings::STABILIZATION3SETTINGS_RATE; + data.Stabilization3Settings[1] = ManualControlSettings::STABILIZATION3SETTINGS_RATE; + data.Stabilization3Settings[2] = ManualControlSettings::STABILIZATION3SETTINGS_RATE; + data.FlightModeNumber = 3; + data.FlightModePosition[0] = ManualControlSettings::FLIGHTMODEPOSITION_STABILIZED1; + data.FlightModePosition[1] = ManualControlSettings::FLIGHTMODEPOSITION_STABILIZED1; + data.FlightModePosition[2] = ManualControlSettings::FLIGHTMODEPOSITION_STABILIZED1; + data.FlightModePosition[3] = ManualControlSettings::FLIGHTMODEPOSITION_STABILIZED1; + data.FlightModePosition[4] = ManualControlSettings::FLIGHTMODEPOSITION_STABILIZED1; + data.FlightModePosition[5] = ManualControlSettings::FLIGHTMODEPOSITION_STABILIZED1; + controlSettings->setData(data); + addModifiedObject(controlSettings, tr("Writing flight mode settings")); } void VehicleConfigurationHelper::applyLevellingConfiguration() @@ -254,7 +278,7 @@ void VehicleConfigurationHelper::applyLevellingConfiguration() data.GyroBias[1] = -bias.m_gyroYBias; data.GyroBias[2] = -bias.m_gyroZBias; - //AttitudeSettings::GetInstance(m_uavoManager)->setData(data); + attitudeSettings->setData(data); addModifiedObject(attitudeSettings, tr("Writing levelling bias settings")); } } @@ -263,6 +287,7 @@ void VehicleConfigurationHelper::applyMixerConfiguration(mixerSettings mixer) { // Set all mixer data MixerSettings* mSettings = MixerSettings::GetInstance(m_uavoManager); + Q_ASSERT(mSettings); // Set Mixer types and values QString mixerTypePattern = "Mixer%1Type"; @@ -467,7 +492,7 @@ void VehicleConfigurationHelper::resetGUIData() for(quint32 i = 0; i < SystemSettings::GUICONFIGDATA_NUMELEM; i++) { data.GUIConfigData[i] = 0; } - //sSettings->setData(data); + sSettings->setData(data); addModifiedObject(sSettings, tr("Preparing vehicle settings")); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h index 9ee7c1beb..d5efb543f 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h @@ -72,7 +72,7 @@ private: static const int MIXER_TYPE_MOTOR = 1; static const int MIXER_TYPE_SERVO = 2; - static const int PROGRESS_STEPS = 8; + static const int PROGRESS_STEPS = 9; VehicleConfigurationSource *m_configSource; UAVObjectManager *m_uavoManager; From c483d429375c28506c4b8fe441a2898cf6d46ee0 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Tue, 21 Aug 2012 01:07:38 +0200 Subject: [PATCH 10/56] OP-39 Added mixer and motor configuration for Hexa and Octocopters. Changed so that the Flex port is set to be serial telemetry port by default. Added some description texts for the different multirotor types. Fixed disabling/enabling of Cancel and Back buttons during processing like bias calculation and saving of configuration. Converted summary text to html and added some formatting of the text. Added message if no controller is connected on saving the configuration. --- .../setupwizard/pages/controllerpage.ui | 4 +- .../plugins/setupwizard/pages/flashpage.cpp | 17 +- .../plugins/setupwizard/pages/inputpage.ui | 6 +- .../setupwizard/pages/levellingpage.cpp | 10 +- .../setupwizard/pages/levellingpage.ui | 6 +- .../plugins/setupwizard/pages/multipage.cpp | 50 +- .../src/plugins/setupwizard/pages/multipage.h | 2 + .../plugins/setupwizard/pages/multipage.ui | 3 +- .../plugins/setupwizard/pages/outputpage.ui | 8 +- .../plugins/setupwizard/pages/startpage.ui | 4 +- .../plugins/setupwizard/pages/summarypage.ui | 15 +- .../src/plugins/setupwizard/setupwizard.cpp | 22 +- .../vehicleconfigurationhelper.cpp | 480 +++++++++++++++++- 13 files changed, 569 insertions(+), 58 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui index 61a6d1ff7..14d37b737 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui @@ -29,9 +29,9 @@ 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;"> <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 board identification</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> -<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;">To continue we need to know what kind of OpenPilot board you want the wizard to create a configuration for. The wizard will try to automatically detect what type of board you have connected.</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:10pt;">To continue the wizard needs to know what kind of OpenPilot controller you want to create a configuration for. The wizard will try to automatically detect what type of board you have when connected.</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;"></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 connect the board to a free usb port on your computer, or if a serial modem like BlueTooth, PipX or other is used, then power up the board and select the device to connect with from the list below. Then press Connect.</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:10pt;">Please connect the board to a free usb port on your computer, or if a serial modem like BlueTooth, PipX or other is used, power up the board and select the device to connect with from the list below. Then press 'Connect'.</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:10pt;">If the board already is connected and succesfully detected the board type will allready be displayed. You can disconnect and select another device if you need to detect another board.</span></p></body></html> diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp index f7438c8be..79014eaf5 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp @@ -25,6 +25,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include "flashpage.h" #include "ui_flashpage.h" #include "setupwizard.h" @@ -55,14 +56,28 @@ bool FlashPage::isComplete() const void FlashPage::writeToController() { + if(!getWizard()->getConnectionManager()->isConnected()) { + QMessageBox msgBox; + msgBox.setText(tr("An OpenPilot controller must be connected to your computer to save the " + "configuration.\nPlease connect your OpenPilot controller to your computer and try again.")); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.exec(); + return; + } + ui->saveButton->setEnabled(false); + getWizard()->button(QWizard::CancelButton)->setEnabled(false); + getWizard()->button(QWizard::BackButton)->setEnabled(false); VehicleConfigurationHelper helper(getWizard()); connect(&helper, SIGNAL(saveProgress(int, int, QString)),this, SLOT(saveProgress(int, int, QString))); m_successfulWrite = helper.setupVehicle(); disconnect(&helper, SIGNAL(saveProgress(int, int, QString)),this, SLOT(saveProgress(int, int, QString))); - emit completeChanged(); ui->saveProgressLabel->setText(QString("%2").arg(m_successfulWrite ? "green" : "red", ui->saveProgressLabel->text())); ui->saveButton->setEnabled(true); + getWizard()->button(QWizard::CancelButton)->setEnabled(true); + getWizard()->button(QWizard::BackButton)->setEnabled(true); + emit completeChanged(); } void FlashPage::saveProgress(int total, int current, QString description) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui index 0512ac8c3..75cd62c94 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui @@ -29,7 +29,7 @@ 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;"> <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 basic input signal 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:12pt; font-weight:600;"></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;">The OpenPilot controller supports many different types of input signals. Please select the type of input that matches your Receiver configuration. If you are unsure leave the default option selected and continue the wizard.</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:10pt;">The OpenPilot controller supports many different types of input signals. Please select the type of input that matches your receiver configuration. If you are unsure just leave the default option selected and continue the wizard.</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;"></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;">Some input options require the OpenPilot controller to be rebooted before the changes can take place. If an option that requires a reboot is selected the controller will need to be rebooted at the end of this wizard after the configuration is written to the controller.</span></p></body></html> @@ -44,9 +44,9 @@ p, li { white-space: pre-wrap; } 20 - 200 + 220 561 - 181 + 160 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp index 5438f1a83..10afada80 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -62,7 +62,7 @@ void LevellingPage::performLevelling() if(!getWizard()->getConnectionManager()->isConnected()) { QMessageBox msgBox; msgBox.setText(tr("An OpenPilot controller must be connected to your computer to perform bias " - "calculations.\nPlease connect your OpenPilot controller to continue.")); + "calculations.\nPlease connect your OpenPilot controller to your computer and try again.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); @@ -74,11 +74,15 @@ void LevellingPage::performLevelling() // Measure every 100ms * 100times = 10s m_levellingUtil = new LevellingUtil(BIAS_CYCLES, BIAS_PERIOD); } + emit completeChanged(); + connect(m_levellingUtil, SIGNAL(progress(long,long)), this, SLOT(levellingProgress(long,long))); connect(m_levellingUtil, SIGNAL(done(accelGyroBias)), this, SLOT(levellingDone(accelGyroBias))); connect(m_levellingUtil, SIGNAL(timeout(QString)), this, SLOT(levellingTimeout(QString))); + getWizard()->button(QWizard::CancelButton)->setEnabled(false); + getWizard()->button(QWizard::BackButton)->setEnabled(false); ui->levelButton->setEnabled(false); - emit completeChanged(); + m_levellingUtil->start(); } @@ -118,5 +122,7 @@ void LevellingPage::stopLevelling() disconnect(m_levellingUtil, SIGNAL(done(accelGyroBias)), this, SLOT(levellingDone(accelGyroBias))); disconnect(m_levellingUtil, SIGNAL(timeout(QString)), this, SLOT(levellingTimeout(QString))); ui->levelButton->setEnabled(true); + getWizard()->button(QWizard::CancelButton)->setEnabled(true); + getWizard()->button(QWizard::BackButton)->setEnabled(true); } } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui index e86ae3eaf..da1f582e7 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui @@ -27,13 +27,11 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> 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;"> -<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 controller levelling procedure</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 controller levelling calibration procedure</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:12pt; font-weight:600;"></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 step can only be performed if you have the OpenPilot controller connected and identified by the first step in this wizard.</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;"></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;">The wizard needs to get information from the controller about in which position the vehicle normally is considered to be level. To be able to successfully perform these measurements you need to place the vehicle on a flat and as level as possible surface. Example of such surfaces could be a table top or the floor. Be careful to assure that the vehicle really is level since this step will affect the accelerometer and gyro bias in the controller software.</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;"></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;">To perform the levelling, please push the Calculate button and wait for the process to finish.</span></p></body></html> +<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;">To perform the levelling, please push the 'Calculate' button and wait for the process to finish.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp index 9963422ea..37419eabb 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp @@ -69,16 +69,42 @@ bool MultiPage::validatePage() void MultiPage::setupMultiTypesCombo() { - ui->typeCombo->addItem("Tricopter", SetupWizard::MULTI_ROTOR_TRI_Y); - ui->typeCombo->addItem("Quadcopter X", SetupWizard::MULTI_ROTOR_QUAD_X); - ui->typeCombo->addItem("Quadcopter +", SetupWizard::MULTI_ROTOR_QUAD_PLUS); - ui->typeCombo->addItem("Hexacopter", SetupWizard::MULTI_ROTOR_HEXA); - ui->typeCombo->addItem("Hexacopter Coax (Y6)", SetupWizard::MULTI_ROTOR_HEXA_COAX_Y); - ui->typeCombo->addItem("Hexacopter H", SetupWizard::MULTI_ROTOR_HEXA_H); - ui->typeCombo->addItem("Octocopter", SetupWizard::MULTI_ROTOR_OCTO); - ui->typeCombo->addItem("Octocopter Coax X", SetupWizard::MULTI_ROTOR_OCTO_COAX_X); - ui->typeCombo->addItem("Octocopter Coax +", SetupWizard::MULTI_ROTOR_OCTO_COAX_PLUS); - ui->typeCombo->addItem("Octocopter V", SetupWizard::MULTI_ROTOR_OCTO_V); + ui->typeCombo->addItem(tr("Tricopter"), SetupWizard::MULTI_ROTOR_TRI_Y); + m_descriptions << tr("The Tricopter uses three motors and one servo. The servo is used to give yaw authority to the aft motor. " + "The fore motors are rotating in opposite directions. The Tricopter is known for its sweeping yaw movement and " + "it is very well suited for FPV since the front rotors are spread wide apart."); + + ui->typeCombo->addItem(tr("Quadcopter X"), SetupWizard::MULTI_ROTOR_QUAD_X); + m_descriptions << tr("The X Quadcopter uses four motors and is the most common multi rotor configuration. Two of the motors rotates clockwise " + "and two counter clockwise. The motors positioned diagonal of each other rotates in the same direction. " + "This setup is perfect for sport flying and is also commonly used for FPV platforms."); + + ui->typeCombo->addItem(tr("Quadcopter +"), SetupWizard::MULTI_ROTOR_QUAD_PLUS); + m_descriptions << tr("The Plus(+) Quadcopter uses four motors and is similar to the X Quadcopter but the forward direction is offset by 45 degrees. " + "The motors fore and aft rotates in one direction and the motors steerboard and port rotates in the other. " + "This setup was one of the first to be used and is still used for sport flying. This configuration is not that well suited " + "for FPV since the fore rotor tend to be in the way of the camera."); + + ui->typeCombo->addItem(tr("Hexacopter"), SetupWizard::MULTI_ROTOR_HEXA); + m_descriptions << tr("Hexacopter"); + + ui->typeCombo->addItem(tr("Hexacopter Coax (Y6)"), SetupWizard::MULTI_ROTOR_HEXA_COAX_Y); + m_descriptions << tr("Hexacopter Coax (Y6)"); + + ui->typeCombo->addItem(tr("Hexacopter H"), SetupWizard::MULTI_ROTOR_HEXA_H); + m_descriptions << tr("Hexacopter H"); + + ui->typeCombo->addItem(tr("Octocopter"), SetupWizard::MULTI_ROTOR_OCTO); + m_descriptions << tr("Octocopter"); + + ui->typeCombo->addItem(tr("Octocopter Coax X"), SetupWizard::MULTI_ROTOR_OCTO_COAX_X); + m_descriptions << tr("Octocopter Coax X"); + + ui->typeCombo->addItem(tr("Octocopter Coax +"), SetupWizard::MULTI_ROTOR_OCTO_COAX_PLUS); + m_descriptions << tr("Octocopter Coax +"); + + ui->typeCombo->addItem(tr("Octocopter V"), SetupWizard::MULTI_ROTOR_OCTO_V); + m_descriptions << tr("Octocopter V"); } void MultiPage::updateAvailableTypes() @@ -94,9 +120,7 @@ void MultiPage::updateImageAndDescription() { SetupWizard::VEHICLE_SUB_TYPE type = (SetupWizard::VEHICLE_SUB_TYPE) ui->typeCombo->itemData(ui->typeCombo->currentIndex()).toInt(); QString elementId = ""; - QString description = "Descriptive text with information about "; - description.append(ui->typeCombo->currentText()); - description.append(" multirotors."); + QString description = m_descriptions.at(ui->typeCombo->currentIndex()); switch(type) { case SetupWizard::MULTI_ROTOR_TRI_Y: diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.h index 0ffa84a36..a4d8ebf42 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.h @@ -30,6 +30,7 @@ #include #include +#include #include "abstractwizardpage.h" @@ -54,6 +55,7 @@ private: void setupMultiTypesCombo(); QGraphicsSvgItem *multiPic; void updateAvailableTypes(); + QList m_descriptions; private slots: void updateImageAndDescription(); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui index 2c33fb4d5..d6d62f704 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui @@ -31,7 +31,8 @@ p, li { white-space: pre-wrap; } <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;"></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 with multiple rotors. The wizard supports the most common types of multirotors. Other variants of multirotors can be configured by using custom configuration options in the configuration plugin in 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;"></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 multirotor you want to create a configuration for below:</span></p></body></html> +<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 multirotor you want to create a configuration for below:</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:10pt;">(Depending on input configuration all types may not be available to select from the list.)</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui index 7b290cece..37cd5c209 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui @@ -44,9 +44,9 @@ p, li { white-space: pre-wrap; } 20 - 200 + 220 561 - 181 + 161 @@ -64,7 +64,7 @@ p, li { white-space: pre-wrap; } - 160 + 290 40 100 100 @@ -93,7 +93,7 @@ p, li { white-space: pre-wrap; } - 30 + 160 40 100 100 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui index 0f656f35c..e6a293d90 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui @@ -36,12 +36,12 @@ p, li { white-space: pre-wrap; } <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;">Welcome to the OpenPilot Setup Wizard</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> <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 wizard will guide you through the basic steps of setting up your OpenPilot controller board. The following pages contains simple questions about your vehicle and its characteristics. </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:10pt;">From the information </span><span style=" font-size:10pt;">gathered</span><span style=" font-size:10pt;"> the wizard will create a baseline configuration that should be good enough for you to get a quick start using your OpenPilot product.</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:10pt;">From the information gathered the wizard will create a baseline configuration that should be good enough for you to get a quick start using your OpenPilot product.</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:10pt;">The baseline configuration can, if desired, be uploaded to the OpenPilot Controller board at the end of this wizard.</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;"></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 wizard does not contain the full range of settings available in the GCS Config plugin. All configuration parameters can be changed at later by using the GCS Config plugin.</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;"></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;">Ok, lets start the configuration by clicking on the 'Next' button below.</span></p></body></html> +<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;">Ok, lets start the configuration by clicking on the 'Next'/'Continue' button below.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui index 4c91ec369..68f0ea8fa 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui @@ -30,10 +30,9 @@ p, li { white-space: pre-wrap; } <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 configuration summary</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:12pt; font-weight:600;"></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;">The first part of this wizard is now complete. The information required to create a basic OpenPilot controller configuration has been collected and a configuration can be created and saved.</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:10pt;">Below is a summary of the configuration and a button that links to a diagram illustrating how to connect required hardware and the OpenPilotController with the current 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:10pt;"></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;">Below is a summary of the configuration and a button that links to a schematic picture illustrating how to connect selected hardware and the OpenPilotController with the current 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:10pt;"></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;">To complete the wizard and write the confguration directly to the OpenPilot controller, or if no OpenPilotController is connected save the configuration to disk for later usage, please continue to the next and last step of this wizard.</span></p></body></html> +<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;">To complete the wizard and write the configuration directly to the OpenPilot controller please continue to the next and last step of this wizard.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -46,9 +45,9 @@ p, li { white-space: pre-wrap; } 20 - 240 + 220 561 - 140 + 160 @@ -67,7 +66,7 @@ p, li { white-space: pre-wrap; } 440 - 20 + 34 100 100 @@ -97,9 +96,9 @@ Illustration 20 - 20 + 30 400 - 100 + 110 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index 155accd14..942eb5d93 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -107,7 +107,7 @@ int SetupWizard::nextId() const QString SetupWizard::getSummaryText() { QString summary = ""; - summary.append(tr("Controller type: ")); + summary.append("").append(tr("Controller type: ")).append(""); switch(getControllerType()) { case CONTROLLER_CC: @@ -127,15 +127,15 @@ QString SetupWizard::getSummaryText() break; } - summary.append('\n'); - summary.append(tr("Vehicle type: ")); + summary.append("
"); + summary.append("").append(tr("Vehicle type: ")).append(""); switch (getVehicleType()) { case VEHICLE_MULTI: summary.append(tr("Multirotor")); - summary.append('\n'); - summary.append(tr("Vehicle sub type: ")); + summary.append("
"); + summary.append("").append(tr("Vehicle sub type: ")).append(""); switch (getVehicleSubType()) { case SetupWizard::MULTI_ROTOR_TRI_Y: @@ -187,8 +187,8 @@ QString SetupWizard::getSummaryText() summary.append(tr("Unknown")); } - summary.append('\n'); - summary.append(tr("Input type: ")); + summary.append("
"); + summary.append("").append(tr("Input type: ")).append(""); switch (getInputType()) { case INPUT_PWM: @@ -207,8 +207,8 @@ QString SetupWizard::getSummaryText() summary.append(tr("Unknown")); } - summary.append('\n'); - summary.append(tr("ESC type: ")); + summary.append("
"); + summary.append("").append(tr("ESC type: ")).append(""); switch (getESCType()) { case ESC_LEGACY: @@ -221,8 +221,8 @@ QString SetupWizard::getSummaryText() summary.append(tr("Unknown")); } - summary.append('\n'); - summary.append(tr("Accel & Gyro bias calibrated: ")); + summary.append("
"); + summary.append("").append(tr("Accel & Gyro bias calibrated: ")).append(""); if (isLevellingPerformed()) { summary.append(tr("Yes")); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp index 0de560ec4..125f5d938 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -96,7 +96,10 @@ void VehicleConfigurationHelper::applyHardwareConfiguration() case VehicleConfigurationSource::CONTROLLER_CC3D: // Reset all ports data.CC_RcvrPort = HwSettings::CC_RCVRPORT_DISABLED; - data.CC_FlexiPort = HwSettings::CC_FLEXIPORT_DISABLED; + + //Default flexiport to be active telemetry link + data.CC_FlexiPort = HwSettings::CC_FLEXIPORT_TELEMETRY; + data.CC_MainPort = HwSettings::CC_MAINPORT_DISABLED; switch(m_configSource->getInputType()) { @@ -500,10 +503,13 @@ void VehicleConfigurationHelper::resetGUIData() void VehicleConfigurationHelper::setupTriCopter() { // Typical vehicle setup - // 1. Setup and apply mixer + // 1. Setup mixer data // 2. Setup GUI data + // 3. Apply changes mixerSettings mixer; + GUIConfigDataUnion guiSettings = getGUIConfigData(); + mixer.channels[0].type = MIXER_TYPE_MOTOR; mixer.channels[0].throttle1 = 100; mixer.channels[0].throttle2 = 0; @@ -532,15 +538,12 @@ void VehicleConfigurationHelper::setupTriCopter() mixer.channels[3].pitch = 0; mixer.channels[3].yaw = 100; - applyMixerConfiguration(mixer); - - GUIConfigDataUnion guiSettings = getGUIConfigData(); - guiSettings.multi.VTOLMotorNW = 1; guiSettings.multi.VTOLMotorNE = 2; guiSettings.multi.VTOLMotorS = 3; guiSettings.multi.TRIYaw = 4; + applyMixerConfiguration(mixer); applyMultiGUISettings(SystemSettings::AIRFRAMETYPE_TRI, guiSettings); } @@ -646,13 +649,476 @@ void VehicleConfigurationHelper::setupQuadCopter() } applyMixerConfiguration(mixer); applyMultiGUISettings(frame, guiSettings); - } void VehicleConfigurationHelper::setupHexaCopter() { + mixerSettings mixer; + GUIConfigDataUnion guiSettings = getGUIConfigData(); + SystemSettings::AirframeTypeOptions frame; + + switch(m_configSource->getVehicleSubType()) + { + case VehicleConfigurationSource::MULTI_ROTOR_HEXA: { + frame = SystemSettings::AIRFRAMETYPE_HEXA; + + mixer.channels[0].type = MIXER_TYPE_MOTOR; + mixer.channels[0].throttle1 = 100; + mixer.channels[0].throttle2 = 0; + mixer.channels[0].roll = 0; + mixer.channels[0].pitch = 33; + mixer.channels[0].yaw = -33; + + mixer.channels[1].type = MIXER_TYPE_MOTOR; + mixer.channels[1].throttle1 = 100; + mixer.channels[1].throttle2 = 0; + mixer.channels[1].roll = -50; + mixer.channels[1].pitch = 33; + mixer.channels[1].yaw = 33; + + mixer.channels[2].type = MIXER_TYPE_MOTOR; + mixer.channels[2].throttle1 = 100; + mixer.channels[2].throttle2 = 0; + mixer.channels[2].roll = -50; + mixer.channels[2].pitch = -33; + mixer.channels[2].yaw = -33; + + mixer.channels[3].type = MIXER_TYPE_MOTOR; + mixer.channels[3].throttle1 = 100; + mixer.channels[3].throttle2 = 0; + mixer.channels[3].roll = 0; + mixer.channels[3].pitch = -33; + mixer.channels[3].yaw = 33; + + mixer.channels[4].type = MIXER_TYPE_MOTOR; + mixer.channels[4].throttle1 = 100; + mixer.channels[4].throttle2 = 0; + mixer.channels[4].roll = 50; + mixer.channels[4].pitch = -33; + mixer.channels[4].yaw = -33; + + mixer.channels[5].type = MIXER_TYPE_MOTOR; + mixer.channels[5].throttle1 = 100; + mixer.channels[5].throttle2 = 0; + mixer.channels[5].roll = 50; + mixer.channels[5].pitch = 33; + mixer.channels[5].yaw = 33; + + guiSettings.multi.VTOLMotorN = 1; + guiSettings.multi.VTOLMotorNE = 2; + guiSettings.multi.VTOLMotorSE = 3; + guiSettings.multi.VTOLMotorS = 4; + guiSettings.multi.VTOLMotorSW = 5; + guiSettings.multi.VTOLMotorNW = 6; + + break; + } + case VehicleConfigurationSource::MULTI_ROTOR_HEXA_COAX_Y: { + frame = SystemSettings::AIRFRAMETYPE_HEXACOAX; + + mixer.channels[0].type = MIXER_TYPE_MOTOR; + mixer.channels[0].throttle1 = 100; + mixer.channels[0].throttle2 = 0; + mixer.channels[0].roll = 100; + mixer.channels[0].pitch = 25; + mixer.channels[0].yaw = -66; + + mixer.channels[1].type = MIXER_TYPE_MOTOR; + mixer.channels[1].throttle1 = 100; + mixer.channels[1].throttle2 = 0; + mixer.channels[1].roll = 100; + mixer.channels[1].pitch = 25; + mixer.channels[1].yaw = 66; + + mixer.channels[2].type = MIXER_TYPE_MOTOR; + mixer.channels[2].throttle1 = 100; + mixer.channels[2].throttle2 = 0; + mixer.channels[2].roll = -100; + mixer.channels[2].pitch = 25; + mixer.channels[2].yaw = -66; + + mixer.channels[3].type = MIXER_TYPE_MOTOR; + mixer.channels[3].throttle1 = 100; + mixer.channels[3].throttle2 = 0; + mixer.channels[3].roll = -100; + mixer.channels[3].pitch = 25; + mixer.channels[3].yaw = 66; + + mixer.channels[4].type = MIXER_TYPE_MOTOR; + mixer.channels[4].throttle1 = 100; + mixer.channels[4].throttle2 = 0; + mixer.channels[4].roll = 0; + mixer.channels[4].pitch = -50; + mixer.channels[4].yaw = -66; + + mixer.channels[5].type = MIXER_TYPE_MOTOR; + mixer.channels[5].throttle1 = 100; + mixer.channels[5].throttle2 = 0; + mixer.channels[5].roll = 0; + mixer.channels[5].pitch = -50; + mixer.channels[5].yaw = 66; + + guiSettings.multi.VTOLMotorNW = 1; + guiSettings.multi.VTOLMotorW = 2; + guiSettings.multi.VTOLMotorNE = 3; + guiSettings.multi.VTOLMotorE = 4; + guiSettings.multi.VTOLMotorS = 5; + guiSettings.multi.VTOLMotorSE = 6; + + break; + } + case VehicleConfigurationSource::MULTI_ROTOR_HEXA_H: { + frame = SystemSettings::AIRFRAMETYPE_HEXAX; + + mixer.channels[0].type = MIXER_TYPE_MOTOR; + mixer.channels[0].throttle1 = 100; + mixer.channels[0].throttle2 = 0; + mixer.channels[0].roll = -33; + mixer.channels[0].pitch = 50; + mixer.channels[0].yaw = -33; + + mixer.channels[1].type = MIXER_TYPE_MOTOR; + mixer.channels[1].throttle1 = 100; + mixer.channels[1].throttle2 = 0; + mixer.channels[1].roll = -33; + mixer.channels[1].pitch = 0; + mixer.channels[1].yaw = 33; + + mixer.channels[2].type = MIXER_TYPE_MOTOR; + mixer.channels[2].throttle1 = 100; + mixer.channels[2].throttle2 = 0; + mixer.channels[2].roll = -33; + mixer.channels[2].pitch = -50; + mixer.channels[2].yaw = -33; + + mixer.channels[3].type = MIXER_TYPE_MOTOR; + mixer.channels[3].throttle1 = 100; + mixer.channels[3].throttle2 = 0; + mixer.channels[3].roll = -33; + mixer.channels[3].pitch = -50; + mixer.channels[3].yaw = 33; + + mixer.channels[4].type = MIXER_TYPE_MOTOR; + mixer.channels[4].throttle1 = 100; + mixer.channels[4].throttle2 = 0; + mixer.channels[4].roll = 33; + mixer.channels[4].pitch = 0; + mixer.channels[4].yaw = -33; + + mixer.channels[5].type = MIXER_TYPE_MOTOR; + mixer.channels[5].throttle1 = 100; + mixer.channels[5].throttle2 = 0; + mixer.channels[5].roll = 33; + mixer.channels[5].pitch = 50; + mixer.channels[5].yaw = -33; + + guiSettings.multi.VTOLMotorNE = 1; + guiSettings.multi.VTOLMotorE = 2; + guiSettings.multi.VTOLMotorSE = 3; + guiSettings.multi.VTOLMotorSW = 4; + guiSettings.multi.VTOLMotorW = 5; + guiSettings.multi.VTOLMotorNW = 6; + + break; + } + default: + break; + } + applyMixerConfiguration(mixer); + applyMultiGUISettings(frame, guiSettings); } void VehicleConfigurationHelper::setupOctoCopter() { + mixerSettings mixer; + GUIConfigDataUnion guiSettings = getGUIConfigData(); + SystemSettings::AirframeTypeOptions frame; + + switch(m_configSource->getVehicleSubType()) + { + case VehicleConfigurationSource::MULTI_ROTOR_OCTO: { + frame = SystemSettings::AIRFRAMETYPE_OCTO; + + mixer.channels[0].type = MIXER_TYPE_MOTOR; + mixer.channels[0].throttle1 = 100; + mixer.channels[0].throttle2 = 0; + mixer.channels[0].roll = 0; + mixer.channels[0].pitch = 33; + mixer.channels[0].yaw = -25; + + mixer.channels[1].type = MIXER_TYPE_MOTOR; + mixer.channels[1].throttle1 = 100; + mixer.channels[1].throttle2 = 0; + mixer.channels[1].roll = -33; + mixer.channels[1].pitch = 33; + mixer.channels[1].yaw = 25; + + mixer.channels[2].type = MIXER_TYPE_MOTOR; + mixer.channels[2].throttle1 = 100; + mixer.channels[2].throttle2 = 0; + mixer.channels[2].roll = -33; + mixer.channels[2].pitch = 0; + mixer.channels[2].yaw = -25; + + mixer.channels[3].type = MIXER_TYPE_MOTOR; + mixer.channels[3].throttle1 = 100; + mixer.channels[3].throttle2 = 0; + mixer.channels[3].roll = -33; + mixer.channels[3].pitch = -33; + mixer.channels[3].yaw = 25; + + mixer.channels[4].type = MIXER_TYPE_MOTOR; + mixer.channels[4].throttle1 = 100; + mixer.channels[4].throttle2 = 0; + mixer.channels[4].roll = 0; + mixer.channels[4].pitch = -33; + mixer.channels[4].yaw = -25; + + mixer.channels[5].type = MIXER_TYPE_MOTOR; + mixer.channels[5].throttle1 = 100; + mixer.channels[5].throttle2 = 0; + mixer.channels[5].roll = 33; + mixer.channels[5].pitch = -33; + mixer.channels[5].yaw = 25; + + mixer.channels[6].type = MIXER_TYPE_MOTOR; + mixer.channels[6].throttle1 = 100; + mixer.channels[6].throttle2 = 0; + mixer.channels[6].roll = 33; + mixer.channels[6].pitch = 0; + mixer.channels[6].yaw = -25; + + mixer.channels[7].type = MIXER_TYPE_MOTOR; + mixer.channels[7].throttle1 = 100; + mixer.channels[7].throttle2 = 0; + mixer.channels[7].roll = 33; + mixer.channels[7].pitch = 33; + mixer.channels[7].yaw = 25; + + guiSettings.multi.VTOLMotorN = 1; + guiSettings.multi.VTOLMotorNE = 2; + guiSettings.multi.VTOLMotorE = 3; + guiSettings.multi.VTOLMotorSE = 4; + guiSettings.multi.VTOLMotorS = 5; + guiSettings.multi.VTOLMotorSW = 6; + guiSettings.multi.VTOLMotorW = 7; + guiSettings.multi.VTOLMotorNW = 8; + + break; + } + case VehicleConfigurationSource::MULTI_ROTOR_OCTO_COAX_X: { + frame = SystemSettings::AIRFRAMETYPE_OCTOCOAXX; + + mixer.channels[0].type = MIXER_TYPE_MOTOR; + mixer.channels[0].throttle1 = 100; + mixer.channels[0].throttle2 = 0; + mixer.channels[0].roll = 50; + mixer.channels[0].pitch = 50; + mixer.channels[0].yaw = -50; + + mixer.channels[1].type = MIXER_TYPE_MOTOR; + mixer.channels[1].throttle1 = 100; + mixer.channels[1].throttle2 = 0; + mixer.channels[1].roll = 50; + mixer.channels[1].pitch = 50; + mixer.channels[1].yaw = 50; + + mixer.channels[2].type = MIXER_TYPE_MOTOR; + mixer.channels[2].throttle1 = 100; + mixer.channels[2].throttle2 = 0; + mixer.channels[2].roll = -50; + mixer.channels[2].pitch = 50; + mixer.channels[2].yaw = -50; + + mixer.channels[3].type = MIXER_TYPE_MOTOR; + mixer.channels[3].throttle1 = 100; + mixer.channels[3].throttle2 = 0; + mixer.channels[3].roll = -50; + mixer.channels[3].pitch = 50; + mixer.channels[3].yaw = 50; + + mixer.channels[4].type = MIXER_TYPE_MOTOR; + mixer.channels[4].throttle1 = 100; + mixer.channels[4].throttle2 = 0; + mixer.channels[4].roll = -50; + mixer.channels[4].pitch = -50; + mixer.channels[4].yaw = -50; + + mixer.channels[5].type = MIXER_TYPE_MOTOR; + mixer.channels[5].throttle1 = 100; + mixer.channels[5].throttle2 = 0; + mixer.channels[5].roll = -50; + mixer.channels[5].pitch = -50; + mixer.channels[5].yaw = 50; + + mixer.channels[6].type = MIXER_TYPE_MOTOR; + mixer.channels[6].throttle1 = 100; + mixer.channels[6].throttle2 = 0; + mixer.channels[6].roll = 50; + mixer.channels[6].pitch = -50; + mixer.channels[6].yaw = -50; + + mixer.channels[7].type = MIXER_TYPE_MOTOR; + mixer.channels[7].throttle1 = 100; + mixer.channels[7].throttle2 = 0; + mixer.channels[7].roll = 50; + mixer.channels[7].pitch = -50; + mixer.channels[7].yaw = 50; + + guiSettings.multi.VTOLMotorNW = 1; + guiSettings.multi.VTOLMotorN = 2; + guiSettings.multi.VTOLMotorNE = 3; + guiSettings.multi.VTOLMotorE = 4; + guiSettings.multi.VTOLMotorSE = 5; + guiSettings.multi.VTOLMotorS = 6; + guiSettings.multi.VTOLMotorSW = 7; + guiSettings.multi.VTOLMotorW = 8; + + break; + } + case VehicleConfigurationSource::MULTI_ROTOR_OCTO_COAX_PLUS: { + frame = SystemSettings::AIRFRAMETYPE_OCTOCOAXP; + + mixer.channels[0].type = MIXER_TYPE_MOTOR; + mixer.channels[0].throttle1 = 100; + mixer.channels[0].throttle2 = 0; + mixer.channels[0].roll = 0; + mixer.channels[0].pitch = 100; + mixer.channels[0].yaw = -50; + + mixer.channels[1].type = MIXER_TYPE_MOTOR; + mixer.channels[1].throttle1 = 100; + mixer.channels[1].throttle2 = 0; + mixer.channels[1].roll = 0; + mixer.channels[1].pitch = 100; + mixer.channels[1].yaw = 50; + + mixer.channels[2].type = MIXER_TYPE_MOTOR; + mixer.channels[2].throttle1 = 100; + mixer.channels[2].throttle2 = 0; + mixer.channels[2].roll = -100; + mixer.channels[2].pitch = 0; + mixer.channels[2].yaw = -50; + + mixer.channels[3].type = MIXER_TYPE_MOTOR; + mixer.channels[3].throttle1 = 100; + mixer.channels[3].throttle2 = 0; + mixer.channels[3].roll = -100; + mixer.channels[3].pitch = 0; + mixer.channels[3].yaw = 50; + + mixer.channels[4].type = MIXER_TYPE_MOTOR; + mixer.channels[4].throttle1 = 100; + mixer.channels[4].throttle2 = 0; + mixer.channels[4].roll = 0; + mixer.channels[4].pitch = -100; + mixer.channels[4].yaw = -50; + + mixer.channels[5].type = MIXER_TYPE_MOTOR; + mixer.channels[5].throttle1 = 100; + mixer.channels[5].throttle2 = 0; + mixer.channels[5].roll = 0; + mixer.channels[5].pitch = -100; + mixer.channels[5].yaw = 50; + + mixer.channels[6].type = MIXER_TYPE_MOTOR; + mixer.channels[6].throttle1 = 100; + mixer.channels[6].throttle2 = 0; + mixer.channels[6].roll = 100; + mixer.channels[6].pitch = 0; + mixer.channels[6].yaw = -50; + + mixer.channels[7].type = MIXER_TYPE_MOTOR; + mixer.channels[7].throttle1 = 100; + mixer.channels[7].throttle2 = 0; + mixer.channels[7].roll = 100; + mixer.channels[7].pitch = 0; + mixer.channels[7].yaw = 50; + + guiSettings.multi.VTOLMotorN = 1; + guiSettings.multi.VTOLMotorNE = 2; + guiSettings.multi.VTOLMotorE = 3; + guiSettings.multi.VTOLMotorSE = 4; + guiSettings.multi.VTOLMotorS = 5; + guiSettings.multi.VTOLMotorSW = 6; + guiSettings.multi.VTOLMotorW = 7; + guiSettings.multi.VTOLMotorNW = 8; + + break; + } + case VehicleConfigurationSource::MULTI_ROTOR_OCTO_V: { + frame = SystemSettings::AIRFRAMETYPE_OCTOV; + mixer.channels[0].type = MIXER_TYPE_MOTOR; + mixer.channels[0].throttle1 = 100; + mixer.channels[0].throttle2 = 0; + mixer.channels[0].roll = -25; + mixer.channels[0].pitch = 8; + mixer.channels[0].yaw = -25; + + mixer.channels[1].type = MIXER_TYPE_MOTOR; + mixer.channels[1].throttle1 = 100; + mixer.channels[1].throttle2 = 0; + mixer.channels[1].roll = -25; + mixer.channels[1].pitch = 25; + mixer.channels[1].yaw = 25; + + mixer.channels[2].type = MIXER_TYPE_MOTOR; + mixer.channels[2].throttle1 = 100; + mixer.channels[2].throttle2 = 0; + mixer.channels[2].roll = -25; + mixer.channels[2].pitch = -25; + mixer.channels[2].yaw = -25; + + mixer.channels[3].type = MIXER_TYPE_MOTOR; + mixer.channels[3].throttle1 = 100; + mixer.channels[3].throttle2 = 0; + mixer.channels[3].roll = -25; + mixer.channels[3].pitch = -8; + mixer.channels[3].yaw = 25; + + mixer.channels[4].type = MIXER_TYPE_MOTOR; + mixer.channels[4].throttle1 = 100; + mixer.channels[4].throttle2 = 0; + mixer.channels[4].roll = 25; + mixer.channels[4].pitch = -8; + mixer.channels[4].yaw = -25; + + mixer.channels[5].type = MIXER_TYPE_MOTOR; + mixer.channels[5].throttle1 = 100; + mixer.channels[5].throttle2 = 0; + mixer.channels[5].roll = 25; + mixer.channels[5].pitch = -25; + mixer.channels[5].yaw = 25; + + mixer.channels[6].type = MIXER_TYPE_MOTOR; + mixer.channels[6].throttle1 = 100; + mixer.channels[6].throttle2 = 0; + mixer.channels[6].roll = 25; + mixer.channels[6].pitch = 25; + mixer.channels[6].yaw = -25; + + mixer.channels[7].type = MIXER_TYPE_MOTOR; + mixer.channels[7].throttle1 = 100; + mixer.channels[7].throttle2 = 0; + mixer.channels[7].roll = 25; + mixer.channels[7].pitch = 8; + mixer.channels[7].yaw = 25; + + guiSettings.multi.VTOLMotorN = 1; + guiSettings.multi.VTOLMotorNE = 2; + guiSettings.multi.VTOLMotorE = 3; + guiSettings.multi.VTOLMotorSE = 4; + guiSettings.multi.VTOLMotorS = 5; + guiSettings.multi.VTOLMotorSW = 6; + guiSettings.multi.VTOLMotorW = 7; + guiSettings.multi.VTOLMotorNW = 8; + + break; + } + default: + break; + } + + applyMixerConfiguration(mixer); + applyMultiGUISettings(frame, guiSettings); } From 8e66133b2d9f3f55981fe5fcdc6064fbc8da5af3 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Tue, 21 Aug 2012 23:10:38 +0200 Subject: [PATCH 11/56] OP-39 Added reset of stabilization data to default values when wizard writes its configuration. --- .../setupwizard/vehicleconfigurationhelper.cpp | 15 ++++++++++++++- .../setupwizard/vehicleconfigurationhelper.h | 3 ++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp index 125f5d938..1bac27ec5 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -33,6 +33,7 @@ #include "mixersettings.h" #include "systemsettings.h" #import "manualcontrolsettings.h" +#import "stabilizationsettings.h" VehicleConfigurationHelper::VehicleConfigurationHelper(VehicleConfigurationSource *configSource) : m_configSource(configSource), m_uavoManager(0), @@ -61,6 +62,7 @@ bool VehicleConfigurationHelper::setupVehicle() applyOutputConfiguration(); applyFlighModeConfiguration(); applyLevellingConfiguration(); + applyStabilizationConfiguration(); bool result = saveChangesToController(); if(result) { @@ -282,10 +284,21 @@ void VehicleConfigurationHelper::applyLevellingConfiguration() data.GyroBias[2] = -bias.m_gyroZBias; attitudeSettings->setData(data); - addModifiedObject(attitudeSettings, tr("Writing levelling bias settings")); + addModifiedObject(attitudeSettings, tr("Writing gyro and accelerometer bias settings")); } } +void VehicleConfigurationHelper::applyStabilizationConfiguration() +{ + StabilizationSettings *stabSettings = StabilizationSettings::GetInstance(m_uavoManager); + Q_ASSERT(stabSettings); + StabilizationSettings::DataFields data = stabSettings->getData(); + + StabilizationSettings defaultSettings; + stabSettings->setData(defaultSettings.getData()); + addModifiedObject(stabSettings, tr("Writing stabilization settings")); +} + void VehicleConfigurationHelper::applyMixerConfiguration(mixerSettings mixer) { // Set all mixer data diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h index d5efb543f..d24fa973c 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h @@ -72,7 +72,7 @@ private: static const int MIXER_TYPE_MOTOR = 1; static const int MIXER_TYPE_SERVO = 2; - static const int PROGRESS_STEPS = 9; + static const int PROGRESS_STEPS = 10; VehicleConfigurationSource *m_configSource; UAVObjectManager *m_uavoManager; @@ -86,6 +86,7 @@ private: void applyOutputConfiguration(); void applyFlighModeConfiguration(); void applyLevellingConfiguration(); + void applyStabilizationConfiguration(); void applyMixerConfiguration(mixerSettings mixer); From cd0ff804ebb3da9d2dc02b32b6bfa973c7a4e101 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Thu, 23 Aug 2012 16:28:57 +0200 Subject: [PATCH 12/56] OP-39 Added new graphics for buttons. Added fix trying to handle when config plugin is not loaded in workspace and we are trying to jump to Input Wizard on the end page of the wizard. --- .../plugins/config/configgadgetfactory.cpp | 5 +- .../src/plugins/setupwizard/pages/endpage.cpp | 20 ++- .../plugins/setupwizard/pages/inputpage.ui | 130 ++++++++++++++---- .../plugins/setupwizard/pages/outputpage.ui | 76 +++++++--- .../setupwizard/resources/bttn-ESC-down.png | Bin 0 -> 5210 bytes .../setupwizard/resources/bttn-ESC-up.png | Bin 0 -> 6017 bytes .../setupwizard/resources/bttn-ppm-down.png | Bin 0 -> 4522 bytes .../setupwizard/resources/bttn-ppm-up.png | Bin 0 -> 5202 bytes .../setupwizard/resources/bttn-pwm-down.png | Bin 0 -> 4679 bytes .../setupwizard/resources/bttn-pwm-up.png | Bin 0 -> 5357 bytes .../setupwizard/resources/bttn-rapid-down.png | Bin 0 -> 8691 bytes .../setupwizard/resources/bttn-rapid-up.png | Bin 0 -> 9396 bytes .../setupwizard/resources/bttn-sat-down.png | Bin 0 -> 3793 bytes .../setupwizard/resources/bttn-sat-up.png | Bin 0 -> 4467 bytes .../setupwizard/resources/bttn-sbus-down.png | Bin 0 -> 4166 bytes .../setupwizard/resources/bttn-sbus-up.png | Bin 0 -> 4755 bytes .../vehicleconfigurationhelper.cpp | 4 +- .../plugins/setupwizard/wizardResources.qrc | 12 ++ 18 files changed, 190 insertions(+), 57 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-ESC-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-ESC-up.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-ppm-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-ppm-up.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-pwm-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-pwm-up.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-rapid-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-rapid-up.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-sat-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-sat-up.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-sbus-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-sbus-up.png diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp b/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp index b468adf02..2a1996729 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp +++ b/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp @@ -58,5 +58,8 @@ IOptionsPage *ConfigGadgetFactory::createOptionsPage(IUAVGadgetConfiguration *co void ConfigGadgetFactory::startInputWizard() { - gadgetWidget->startInputWizard(); + if(gadgetWidget) + { + gadgetWidget->startInputWizard(); + } } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp index 2df3f9e79..5c445d5ba 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp @@ -29,6 +29,7 @@ #include #include #include +#include EndPage::EndPage(SetupWizard *wizard, QWidget *parent) : AbstractWizardPage(wizard, parent), @@ -46,12 +47,19 @@ EndPage::~EndPage() void EndPage::openInputWizard() { - Core::ModeManager::instance()->activateModeByWorkspaceName("Configuration"); - - getWizard()->close(); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); ConfigGadgetFactory* configGadgetFactory = pm->getObject(); - Q_ASSERT(configGadgetFactory); - configGadgetFactory->startInputWizard(); + + if(configGadgetFactory) { + Core::ModeManager::instance()->activateModeByWorkspaceName("Configuration"); + getWizard()->close(); + configGadgetFactory->startInputWizard(); + } + else { + QMessageBox msgBox; + msgBox.setText(tr("Unable to open Input Wizard since the Config Plugin is not\nloaded in the current workspace.")); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.exec(); + } } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui index 75cd62c94..d69b5dd3f 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui @@ -44,9 +44,9 @@ p, li { white-space: pre-wrap; } 20 - 220 + 200 561 - 160 + 181 @@ -61,22 +61,36 @@ p, li { white-space: pre-wrap; } Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - + 50 40 100 - 100 + 120 Tricopter, Quadcopter, Hexacopter, Octocopter + + QToolButton { border: none } + - PWM -One cable -per channel + PWM + + + + :/setupwizard/resources/bttn-pwm-up.png + :/setupwizard/resources/bttn-pwm-down.png + :/setupwizard/resources/bttn-pwm-down.png + :/setupwizard/resources/bttn-pwm-down.png:/setupwizard/resources/bttn-pwm-up.png + + + + 100 + 100 + true @@ -87,26 +101,43 @@ per channel true - - false + + Qt::ToolButtonTextUnderIcon + + + true - + 170 40 100 - 100 + 120 Airplane, Sloper, Jet + + QToolButton { border: none } + - PPM -One cable -for all channels + PPM + + + + :/setupwizard/resources/bttn-ppm-up.png + :/setupwizard/resources/bttn-ppm-down.png + :/setupwizard/resources/bttn-ppm-down.png + :/setupwizard/resources/bttn-ppm-down.png:/setupwizard/resources/bttn-ppm-up.png + + + + 100 + 100 + true @@ -114,25 +145,43 @@ for all channels true - - false + + Qt::ToolButtonTextUnderIcon + + + true - + 290 40 100 - 100 + 120 Airplane, Sloper, Jet + + QToolButton { border: none } + - Futaba -S.Bus + Futaba + + + + :/setupwizard/resources/bttn-sbus-up.png + :/setupwizard/resources/bttn-sbus-down.png + :/setupwizard/resources/bttn-sbus-down.png + :/setupwizard/resources/bttn-sbus-down.png:/setupwizard/resources/bttn-sbus-up.png + + + + 100 + 100 + true @@ -140,25 +189,43 @@ S.Bus true - - false + + Qt::ToolButtonTextUnderIcon + + + true - + 410 40 100 - 100 + 120 Airplane, Sloper, Jet + + QToolButton { border: none } + - Spectrum -Satellite + Spectrum + + + + :/setupwizard/resources/bttn-sat-up.png + :/setupwizard/resources/bttn-sat-down.png + :/setupwizard/resources/bttn-sat-down.png + :/setupwizard/resources/bttn-sat-down.png:/setupwizard/resources/bttn-sat-up.png + + + + 100 + 100 + true @@ -166,12 +233,17 @@ Satellite true - - false + + Qt::ToolButtonTextUnderIcon + + + true - + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui index 37cd5c209..13b95bd6b 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui @@ -44,9 +44,9 @@ p, li { white-space: pre-wrap; } 20 - 220 + 200 561 - 161 + 181 @@ -61,21 +61,36 @@ p, li { white-space: pre-wrap; } Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - + - 290 + 300 40 - 100 - 100 + 200 + 120 Tricopter, Quadcopter, Hexacopter, Octocopter + + QToolButton { border: none } + - Legacy ESC -50 Hz + Standard ESC + + + + :/setupwizard/resources/bttn-ESC-up.png + :/setupwizard/resources/bttn-ESC-down.png + :/setupwizard/resources/bttn-ESC-down.png + :/setupwizard/resources/bttn-ESC-down.png:/setupwizard/resources/bttn-ESC-up.png + + + + 200 + 100 + true @@ -86,25 +101,43 @@ p, li { white-space: pre-wrap; } true - - false + + Qt::ToolButtonTextUnderIcon + + + true - + - 160 + 60 40 - 100 - 100 + 200 + 120 Airplane, Sloper, Jet + + QToolButton { border: none } + - Rapid ESC -400 Hz + Rapid ESC + + + + :/setupwizard/resources/bttn-rapid-up.png + :/setupwizard/resources/bttn-rapid-down.png + :/setupwizard/resources/bttn-rapid-down.png + :/setupwizard/resources/bttn-rapid-down.png:/setupwizard/resources/bttn-rapid-up.png + + + + 200 + 100 + true @@ -115,12 +148,17 @@ p, li { white-space: pre-wrap; } true - - false + + Qt::ToolButtonTextUnderIcon + + + true - + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-ESC-down.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-ESC-down.png new file mode 100644 index 0000000000000000000000000000000000000000..26899fb5af90dc4827b5446cdd7b76aadb6a6bc8 GIT binary patch literal 5210 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-ppm-down.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-ppm-down.png new file mode 100644 index 0000000000000000000000000000000000000000..03706d360cce6cef09bea664ac7819175a0bc47b GIT binary patch literal 4522 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-pwm-up.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-pwm-up.png new file mode 100644 index 0000000000000000000000000000000000000000..25d3624dd5c3825d748953535b794dc9ffb90dbd GIT binary patch literal 5357 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-rapid-up.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-rapid-up.png new file mode 100644 index 0000000000000000000000000000000000000000..66808dca8f2507c59e97822c616c343a06aa6f10 GIT binary patch literal 9396 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-sat-up.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-sat-up.png new file mode 100644 index 0000000000000000000000000000000000000000..37e16c2cbc768dae24e9892c7500d2bcc19af945 GIT binary patch literal 4467 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 JPvDoX{}0C53ON7( literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-sbus-down.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-sbus-down.png new file mode 100644 index 0000000000000000000000000000000000000000..ffea88361550b67712d65db5453cd1d0b45abf4e GIT binary patch literal 4166 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-sbus-up.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-sbus-up.png new file mode 100644 index 0000000000000000000000000000000000000000..9937ac0b4b733c88f3f06e7a91393b7a2887184e GIT binary patch literal 4755 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/bttn-plane-down.png resources/bttn-plane-over.png resources/bttn-plane-up.png + resources/bttn-ESC-down.png + resources/bttn-ESC-up.png + resources/bttn-ppm-down.png + resources/bttn-ppm-up.png + resources/bttn-pwm-down.png + resources/bttn-pwm-up.png + resources/bttn-rapid-down.png + resources/bttn-rapid-up.png + resources/bttn-sat-down.png + resources/bttn-sat-up.png + resources/bttn-sbus-down.png + resources/bttn-sbus-up.png From bc9181ba04e39d455353ee19b3c591c82e55937e Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Thu, 23 Aug 2012 18:37:55 +0200 Subject: [PATCH 13/56] OP-39 Added dialog for the connection diagram. --- .../plugins/setupwizard/connectiondiagram.cpp | 41 +++++++++ .../plugins/setupwizard/connectiondiagram.h | 49 +++++++++++ .../plugins/setupwizard/connectiondiagram.ui | 83 +++++++++++++++++++ .../src/plugins/setupwizard/setupwizard.pro | 9 +- 4 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp new file mode 100644 index 000000000..38b52a021 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp @@ -0,0 +1,41 @@ +/** + ****************************************************************************** + * + * @file connectiondiagram.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup ConnectionDiagram + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "connectiondiagram.h" +#include "ui_connectiondiagram.h" + +ConnectionDiagram::ConnectionDiagram(QWidget *parent) : + QDialog(parent), + ui(new Ui::ConnectionDiagram) +{ + ui->setupUi(this); +} + +ConnectionDiagram::~ConnectionDiagram() +{ + delete ui; +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h new file mode 100644 index 000000000..7718c1e0e --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h @@ -0,0 +1,49 @@ +/** + ****************************************************************************** + * + * @file connectiondiagram.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup ConnectionDiagram + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef CONNECTIONDIAGRAM_H +#define CONNECTIONDIAGRAM_H + +#include + +namespace Ui { +class ConnectionDiagram; +} + +class ConnectionDiagram : public QDialog +{ + Q_OBJECT + +public: + explicit ConnectionDiagram(QWidget *parent = 0); + ~ConnectionDiagram(); + +private: + Ui::ConnectionDiagram *ui; +}; + +#endif // CONNECTIONDIAGRAM_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui new file mode 100644 index 000000000..8c4e74b45 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui @@ -0,0 +1,83 @@ + + + ConnectionDiagram + + + + 0 + 0 + 600 + 400 + + + + Dialog + + + true + + + true + + + + + + QFrame::WinPanel + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close|QDialogButtonBox::Save + + + + + + + + + buttonBox + accepted() + ConnectionDiagram + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ConnectionDiagram + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro index 3f1876bfa..3301cf077 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro @@ -27,7 +27,8 @@ HEADERS += setupwizardplugin.h \ pages/levellingpage.h \ levellingutil.h \ vehicleconfigurationsource.h \ - vehicleconfigurationhelper.h + vehicleconfigurationhelper.h \ + connectiondiagram.h SOURCES += setupwizardplugin.cpp \ setupwizard.cpp \ @@ -48,7 +49,8 @@ SOURCES += setupwizardplugin.cpp \ pages/levellingpage.cpp \ levellingutil.cpp \ vehicleconfigurationsource.cpp \ - vehicleconfigurationhelper.cpp + vehicleconfigurationhelper.cpp \ + connectiondiagram.cpp OTHER_FILES += SetupWizard.pluginspec @@ -66,7 +68,8 @@ FORMS += \ pages/inputpage.ui \ pages/summarypage.ui \ pages/flashpage.ui \ - pages/levellingpage.ui + pages/levellingpage.ui \ + connectiondiagram.ui RESOURCES += \ wizardResources.qrc From 49bdb731f5db9a5e15af43d188c09e455cc459e2 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Fri, 24 Aug 2012 00:48:09 +0200 Subject: [PATCH 14/56] OP-39 Added button for Radio Config Wizard. Cleaned up the GUI, removed all group boxes and aligned components on pages. Changed place of rapid and default esc buttons. Set the size of the wizard to a fix size. Updated some of the texts. Changed font sizes. Added resources. Started the connection diagram implementation. --- .../plugins/setupwizard/connectiondiagram.cpp | 24 +- .../plugins/setupwizard/connectiondiagram.h | 13 +- .../setupwizard/pages/controllerpage.ui | 164 +- .../src/plugins/setupwizard/pages/endpage.ui | 49 +- .../plugins/setupwizard/pages/flashpage.ui | 103 +- .../plugins/setupwizard/pages/inputpage.ui | 384 +- .../setupwizard/pages/levellingpage.ui | 58 +- .../plugins/setupwizard/pages/multipage.ui | 161 +- .../plugins/setupwizard/pages/outputpage.ui | 204 +- .../plugins/setupwizard/pages/summarypage.cpp | 8 + .../plugins/setupwizard/pages/summarypage.h | 3 + .../plugins/setupwizard/pages/summarypage.ui | 114 +- .../plugins/setupwizard/pages/vehiclepage.ui | 390 +- .../resources/bttn-txwizard-off.png | Bin 0 -> 13667 bytes .../resources/bttn-txwizard-on.png | Bin 0 -> 13809 bytes .../resources/connection-diagrams.svg | 9951 +++++++++++++++++ .../src/plugins/setupwizard/setupwizard.cpp | 3 +- .../plugins/setupwizard/wizardResources.qrc | 3 + 18 files changed, 10767 insertions(+), 865 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-txwizard-off.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-txwizard-on.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp index 38b52a021..91faef46d 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp @@ -25,14 +25,34 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include +#include #include "connectiondiagram.h" #include "ui_connectiondiagram.h" -ConnectionDiagram::ConnectionDiagram(QWidget *parent) : - QDialog(parent), +ConnectionDiagram::ConnectionDiagram(QWidget *parent, VehicleConfigurationSource* configSource) : + QDialog(parent), m_configSource(configSource), ui(new Ui::ConnectionDiagram) { + setWindowTitle(tr("Connection Diagram")); ui->setupUi(this); + + QGraphicsScene *scene = new QGraphicsScene(this); + ui->connectionDiagram->setScene(scene); + ui->connectionDiagram->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + m_renderer = new QSvgRenderer(); + if (m_renderer->load(QString(":/setupwizard/resources/connection-diagrams.svg")) && m_renderer->isValid()) + { + scene->clear(); + QGraphicsSvgItem* ccPic = new QGraphicsSvgItem(); + ccPic->setSharedRenderer(m_renderer); + ccPic->setElementId("cc"); + scene->addItem(ccPic); + qDebug() << "Scene complete"; + + //ui->connectionDiagram->setSceneRect(ccPic->boundingRect()); + //ui->connectionDiagram->fitInView(ccPic, Qt::KeepAspectRatio); + } } ConnectionDiagram::~ConnectionDiagram() diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h index 7718c1e0e..546bd4f39 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h @@ -29,6 +29,12 @@ #define CONNECTIONDIAGRAM_H #include +#include +#include + +#include +#include "vehicleconfigurationsource.h" + namespace Ui { class ConnectionDiagram; @@ -39,11 +45,16 @@ class ConnectionDiagram : public QDialog Q_OBJECT public: - explicit ConnectionDiagram(QWidget *parent = 0); + explicit ConnectionDiagram(QWidget *parent, VehicleConfigurationSource *configSource); ~ConnectionDiagram(); private: Ui::ConnectionDiagram *ui; + VehicleConfigurationSource *m_configSource; + + QSvgRenderer *m_renderer; + QHash m_vehicleImageMap; + QHash m_receiverImageMap; }; #endif // CONNECTIONDIAGRAM_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui index 14d37b737..1bb92aabe 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui @@ -19,20 +19,19 @@ 20 20 550 - 241 + 201
<!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"> 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;">OpenPilot board identification</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> +<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;"><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;">To continue the wizard needs to know what kind of OpenPilot controller you want to create a configuration for. The wizard will try to automatically detect what type of board you have when connected.</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;"></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 connect the board to a free usb port on your computer, or if a serial modem like BlueTooth, PipX or other is used, power up the board and select the device to connect with from the list below. Then press 'Connect'.</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:10pt;">If the board already is connected and succesfully detected the board type will allready be displayed. You can disconnect and select another device if you need to detect another board.</span></p></body></html> +<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 connect the board to a free usb port on your computer, or if a serial modem like BlueTooth, PipX or other is used, power up the board and select the device to connect with from the list below. Then press 'Connect'. If the board already is connected and succesfully detected the board type will already be displayed. You can disconnect and select another device if you need to detect another board.</span></p></body></html> Qt::AutoText @@ -44,102 +43,81 @@ p, li { white-space: pre-wrap; } true
- + - 20 - 270 - 560 - 110 + 490 + 350 + 70 + 23 + + + + Connect + + + + + + 40 + 350 + 125 + 16 - 8 + 10 + 50 + false - - OpenPilot board type + + Detected board type: + + + + + false + + + + 170 + 350 + 300 + 22 + + + + + + + 170 + 310 + 300 + 22 + + + + + + + 40 + 310 + 121 + 16 + + + + + 10 + 50 + false + + + + Connection device: - - - false - - - - 150 - 70 - 260 - 22 - - - - - - - 150 - 30 - 260 - 22 - - - - - - - 434 - 70 - 111 - 23 - - - - Connect - - - - - - 20 - 32 - 121 - 16 - - - - - 75 - true - - - - Connection device: - - - - - - 20 - 72 - 131 - 16 - - - - - 75 - true - - - - Detected board type: - - - deviceCombo - connectButton - boardTypeCombo - label_2 - label_3 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui index 4c52939d1..adeb1b87d 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui @@ -25,23 +25,23 @@ 20 20 550 - 281 + 211
<!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"> 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;">Congratulations!</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;">Setup wizard is completed.</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:12pt; font-weight:600;"></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: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 setup procedure is now complete and you are one step away from having a complete setup of your OpenPilot controller.</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;"></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;">To complete the setup please push the Input Wizard button below to close this wizard and go directly to the Input Wizard.</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;"></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;">Or close this wizard and go to the Input tab in the Configuration Plugin and run the wizard to configure the input signals to be used before trying to operate your vehicle. If you already have performed the Input configuration you can skip this step. </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;"></p></body></html> +<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;">To complete the setup please push the Radio Setup Wizard button below to close this wizard and go directly to the Radio Setup Wizard.</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;">Or close this wizard and go to the Input tab in the Configuration Plugin and run the </span><span style=" font-size:10pt;">Radio Setup Wizard</span><span style=" font-size:10pt;"> to configure the input signals to be used before trying to operate your vehicle. If you already have performed the Radio configuration you can skip this step. </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></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -50,20 +50,41 @@ p, li { white-space: pre-wrap; } true - + - 430 - 340 - 131 - 23 + 200 + 270 + 200 + 100 + + QToolButton { border: none } + Go to Input Wizard... + + + :/setupwizard/resources/bttn-txwizard-off.png + :/setupwizard/resources/bttn-txwizard-on.png + :/setupwizard/resources/bttn-txwizard-off.png + :/setupwizard/resources/bttn-txwizard-off.png:/setupwizard/resources/bttn-txwizard-off.png + + + + 200 + 100 + + + + true + - + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui index f4ad3f7a5..5e8d5c9a1 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui @@ -26,15 +26,15 @@ <!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"> 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;">OpenPilot configuration ready to save</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:12pt; font-weight:600;"></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;">The wizard is now ready to write the configuration directly to your OpenPilot controller. </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;"></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: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;">The wizard is now ready to save the configuration directly to your OpenPilot controller. </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;">If any of the selections made in this wizard requires a reboot of the controller then that will have to be performed after this step by power cycling the OpenPilot controller board.</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;"></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;">Press next to write the 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:10pt;"></p></body></html> +<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;">Press the Save button to save the 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:10pt;"><br /></p></body></html>
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -43,66 +43,49 @@ p, li { white-space: pre-wrap; } true - + - 20 - 250 - 560 - 130 + 490 + 350 + 70 + 23 - - - 0 - 0 - + + Save - - Write configuration to controller + + + + + 42 + 325 + 491 + 16 + - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + 10 + + + + Ready... + + + + + + 40 + 350 + 450 + 23 + + + + 0 - - - - 20 - 90 - 530 - 23 - - - - 0 - - - - - - 22 - 65 - 491 - 16 - - - - Ready... - - - - - - 415 - 40 - 100 - 23 - - - - Write... - - diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui index d69b5dd3f..768282200 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui @@ -40,206 +40,204 @@ p, li { white-space: pre-wrap; } true - + - 20 - 200 - 561 - 181 + 430 + 250 + 100 + 120 - - - 0 - 0 - + + + 10 + - - Supported input signal types + + Airplane, Sloper, Jet - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + QToolButton { border: none } + + + Spectrum + + + + :/setupwizard/resources/bttn-sat-up.png + :/setupwizard/resources/bttn-sat-down.png + :/setupwizard/resources/bttn-sat-down.png + :/setupwizard/resources/bttn-sat-down.png:/setupwizard/resources/bttn-sat-up.png + + + + 100 + 100 + + + + true + + + true + + + Qt::ToolButtonTextUnderIcon + + + true + + + + + + 70 + 250 + 100 + 120 + + + + + 10 + + + + Tricopter, Quadcopter, Hexacopter, Octocopter + + + QToolButton { border: none } + + + PWM + + + + :/setupwizard/resources/bttn-pwm-up.png + :/setupwizard/resources/bttn-pwm-down.png + :/setupwizard/resources/bttn-pwm-down.png + :/setupwizard/resources/bttn-pwm-down.png:/setupwizard/resources/bttn-pwm-up.png + + + + 100 + 100 + + + + true + + + true + + + true + + + Qt::ToolButtonTextUnderIcon + + + true + + + + + + 190 + 250 + 100 + 120 + + + + + 10 + + + + Airplane, Sloper, Jet + + + QToolButton { border: none } + + + PPM + + + + :/setupwizard/resources/bttn-ppm-up.png + :/setupwizard/resources/bttn-ppm-down.png + :/setupwizard/resources/bttn-ppm-down.png + :/setupwizard/resources/bttn-ppm-down.png:/setupwizard/resources/bttn-ppm-up.png + + + + 100 + 100 + + + + true + + + true + + + Qt::ToolButtonTextUnderIcon + + + true + + + + + + 310 + 250 + 100 + 120 + + + + + 10 + + + + Airplane, Sloper, Jet + + + QToolButton { border: none } + + + Futaba + + + + :/setupwizard/resources/bttn-sbus-up.png + :/setupwizard/resources/bttn-sbus-down.png + :/setupwizard/resources/bttn-sbus-down.png + :/setupwizard/resources/bttn-sbus-down.png:/setupwizard/resources/bttn-sbus-up.png + + + + 100 + 100 + + + + true + + + true + + + Qt::ToolButtonTextUnderIcon + + + true - - - - 50 - 40 - 100 - 120 - - - - Tricopter, Quadcopter, Hexacopter, Octocopter - - - QToolButton { border: none } - - - PWM - - - - :/setupwizard/resources/bttn-pwm-up.png - :/setupwizard/resources/bttn-pwm-down.png - :/setupwizard/resources/bttn-pwm-down.png - :/setupwizard/resources/bttn-pwm-down.png:/setupwizard/resources/bttn-pwm-up.png - - - - 100 - 100 - - - - true - - - true - - - true - - - Qt::ToolButtonTextUnderIcon - - - true - - - - - - 170 - 40 - 100 - 120 - - - - Airplane, Sloper, Jet - - - QToolButton { border: none } - - - PPM - - - - :/setupwizard/resources/bttn-ppm-up.png - :/setupwizard/resources/bttn-ppm-down.png - :/setupwizard/resources/bttn-ppm-down.png - :/setupwizard/resources/bttn-ppm-down.png:/setupwizard/resources/bttn-ppm-up.png - - - - 100 - 100 - - - - true - - - true - - - Qt::ToolButtonTextUnderIcon - - - true - - - - - - 290 - 40 - 100 - 120 - - - - Airplane, Sloper, Jet - - - QToolButton { border: none } - - - Futaba - - - - :/setupwizard/resources/bttn-sbus-up.png - :/setupwizard/resources/bttn-sbus-down.png - :/setupwizard/resources/bttn-sbus-down.png - :/setupwizard/resources/bttn-sbus-down.png:/setupwizard/resources/bttn-sbus-up.png - - - - 100 - 100 - - - - true - - - true - - - Qt::ToolButtonTextUnderIcon - - - true - - - - - - 410 - 40 - 100 - 120 - - - - Airplane, Sloper, Jet - - - QToolButton { border: none } - - - Spectrum - - - - :/setupwizard/resources/bttn-sat-up.png - :/setupwizard/resources/bttn-sat-down.png - :/setupwizard/resources/bttn-sat-down.png - :/setupwizard/resources/bttn-sat-down.png:/setupwizard/resources/bttn-sat-up.png - - - - 100 - 100 - - - - true - - - true - - - Qt::ToolButtonTextUnderIcon - - - true - - diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui index da1f582e7..34ba4204d 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui @@ -40,53 +40,31 @@ p, li { white-space: pre-wrap; } true - + - 20 - 250 - 560 - 130 + 490 + 350 + 70 + 23 - - - 0 - 0 - + + Calculate - - Accelerometer and gyro bias measurement + + + + + 40 + 350 + 450 + 23 + - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + 0 - - - - 20 - 90 - 530 - 23 - - - - 0 - - - - - - 415 - 40 - 100 - 23 - - - - Calculate... - - diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui index d6d62f704..8f15a2973 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui @@ -41,105 +41,88 @@ p, li { white-space: pre-wrap; } true - + - 20 - 180 - 561 - 200 + 390 + 200 + 170 + 170 + + + + + 0 + 0 + + + + QFrame::NoFrame + + + 0 + + + 0 + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + false + + + + + + 40 + 200 + 90 + 16 10 + 50 + false - - Multirotor type selection + + Multirotor type: + + + + + + 140 + 198 + 230 + 22 + + + + + + + 40 + 240 + 330 + 130 + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAlwaysOff + + + Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - - - 20 - 32 - 121 - 16 - - - - - 75 - true - - - - Multirotor type: - - - - - - 150 - 30 - 220 - 22 - - - - - - - 390 - 30 - 150 - 150 - - - - - 0 - 0 - - - - QFrame::NoFrame - - - 0 - - - 0 - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - false - - - - - - 20 - 69 - 351 - 111 - - - - Qt::ScrollBarAlwaysOn - - - Qt::ScrollBarAlwaysOff - - - Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui index 13b95bd6b..4a366b60e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui @@ -40,121 +40,109 @@ p, li { white-space: pre-wrap; } true - + - 20 - 200 - 561 - 181 + 320 + 250 + 200 + 120 - - - 0 - 0 - + + + 10 + - - Supported speed controller types + + Airplane, Sloper, Jet - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + QToolButton { border: none } + + + Rapid ESC + + + + :/setupwizard/resources/bttn-rapid-up.png + :/setupwizard/resources/bttn-rapid-down.png + :/setupwizard/resources/bttn-rapid-down.png + :/setupwizard/resources/bttn-rapid-down.png:/setupwizard/resources/bttn-rapid-up.png + + + + 200 + 100 + + + + true + + + true + + + true + + + Qt::ToolButtonTextUnderIcon + + + true + + + + + + 80 + 250 + 200 + 120 + + + + + 10 + + + + Tricopter, Quadcopter, Hexacopter, Octocopter + + + QToolButton { border: none } + + + Standard ESC + + + + :/setupwizard/resources/bttn-ESC-up.png + :/setupwizard/resources/bttn-ESC-down.png + :/setupwizard/resources/bttn-ESC-down.png + :/setupwizard/resources/bttn-ESC-down.png:/setupwizard/resources/bttn-ESC-up.png + + + + 200 + 100 + + + + true + + + false + + + true + + + Qt::ToolButtonTextUnderIcon + + + true - - - - 300 - 40 - 200 - 120 - - - - Tricopter, Quadcopter, Hexacopter, Octocopter - - - QToolButton { border: none } - - - Standard ESC - - - - :/setupwizard/resources/bttn-ESC-up.png - :/setupwizard/resources/bttn-ESC-down.png - :/setupwizard/resources/bttn-ESC-down.png - :/setupwizard/resources/bttn-ESC-down.png:/setupwizard/resources/bttn-ESC-up.png - - - - 200 - 100 - - - - true - - - false - - - true - - - Qt::ToolButtonTextUnderIcon - - - true - - - - - - 60 - 40 - 200 - 120 - - - - Airplane, Sloper, Jet - - - QToolButton { border: none } - - - Rapid ESC - - - - :/setupwizard/resources/bttn-rapid-up.png - :/setupwizard/resources/bttn-rapid-down.png - :/setupwizard/resources/bttn-rapid-down.png - :/setupwizard/resources/bttn-rapid-down.png:/setupwizard/resources/bttn-rapid-up.png - - - - 200 - 100 - - - - true - - - true - - - true - - - Qt::ToolButtonTextUnderIcon - - - true - - diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.cpp index 046fd6ae2..c4846e782 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.cpp @@ -28,12 +28,14 @@ #include "summarypage.h" #include "ui_summarypage.h" #include "setupwizard.h" +#include "connectiondiagram.h" SummaryPage::SummaryPage(SetupWizard *wizard, QWidget *parent) : AbstractWizardPage(wizard, parent), ui(new Ui::SummaryPage) { ui->setupUi(this); + connect(ui->illustrationButton, SIGNAL(clicked()), this, SLOT(showDiagram())); } SummaryPage::~SummaryPage() @@ -50,3 +52,9 @@ void SummaryPage::initializePage() { ui->configurationSummary->setText(getWizard()->getSummaryText()); } + +void SummaryPage::showDiagram() +{ + ConnectionDiagram diagram(this, getWizard()); + diagram.exec(); +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.h index 3f21a39e8..616f82392 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.h @@ -46,6 +46,9 @@ public: private: Ui::SummaryPage *ui; + +private slots: + void showDiagram(); }; #endif // SUMMARYPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui index 68f0ea8fa..11f646232 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui @@ -41,81 +41,59 @@ p, li { white-space: pre-wrap; } true - + - 20 - 220 - 561 - 160 + 460 + 250 + 100 + 100 - - - 0 - 0 - + + Tricopter, Quadcopter, Hexacopter, Octocopter - - Summary of configuration - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - 440 - 34 - 100 - 100 - - - - Tricopter, Quadcopter, Hexacopter, Octocopter - - - Hardware + + Hardware Configuration Illustration - - - false - - - false - - - true - - - false - - - - - - 20 - 30 - 400 - 110 - - - - - 10 - - - - Qt::ScrollBarAlwaysOn - - - Qt::ScrollBarAlwaysOff - - - Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse - - + + + false + + + false + + + true + + + false + + + + + + 40 + 230 + 400 + 140 + + + + + 10 + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAlwaysOff + + + Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui index ef49dbd5f..c9811b049 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui @@ -40,209 +40,207 @@ p, li { white-space: pre-wrap; } true - + - 20 - 200 - 561 - 181 + 430 + 250 + 100 + 120 - - - 0 - 0 - + + + 10 + - - Supported vehicle types + + Car, Boat, U-Boat - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + QToolButton { border: none } + + + Surface + + + + :/setupwizard/resources/bttn-land-up.png + :/setupwizard/resources/bttn-land-down.png + :/setupwizard/resources/bttn-land-down.png + :/setupwizard/resources/bttn-land-down.png:/setupwizard/resources/bttn-land-up.png + + + + 100 + 100 + + + + true + + + true + + + Qt::ToolButtonTextUnderIcon + + + true + + + + + + 70 + 250 + 100 + 120 + + + + + 10 + + + + Tricopter, Quadcopter, Hexacopter, Octocopter + + + false + + + QToolButton { border: none } + + + Multirotor + + + + :/setupwizard/resources/bttn-multi-up.png + :/setupwizard/resources/bttn-multi-down.png + :/setupwizard/resources/bttn-multi-down.png + :/setupwizard/resources/bttn-multi-down.png:/setupwizard/resources/bttn-multi-up.png + + + + 100 + 100 + + + + true + + + true + + + true + + + Qt::ToolButtonTextUnderIcon + + + true + + + + + + 190 + 250 + 100 + 120 + + + + + 10 + + + + Airplane, Sloper, Jet + + + QToolButton { border: none } + + + Fixed wing + + + + :/setupwizard/resources/bttn-plane-up.png + :/setupwizard/resources/bttn-plane-down.png + :/setupwizard/resources/bttn-plane-down.png + :/setupwizard/resources/bttn-plane-down.png:/setupwizard/resources/bttn-plane-up.png + + + + 100 + 100 + + + + true + + + false + + + true + + + Qt::ToolButtonTextUnderIcon + + + true + + + + + + 310 + 250 + 100 + 120 + + + + + 10 + + + + QToolButton { border: none } + + + Helicopter + + + + :/setupwizard/resources/bttn-heli-up.png + :/setupwizard/resources/bttn-heli-down.png + :/setupwizard/resources/bttn-heli-down.png + :/setupwizard/resources/bttn-heli-down.png:/setupwizard/resources/bttn-heli-up.png + + + + 100 + 100 + + + + true + + + true + + + Qt::ToolButtonTextUnderIcon + + + true - - - - 50 - 40 - 100 - 120 - - - - Tricopter, Quadcopter, Hexacopter, Octocopter - - - false - - - QToolButton { border: none } - - - Multirotor - - - - :/setupwizard/resources/bttn-multi-up.png - :/setupwizard/resources/bttn-multi-down.png - :/setupwizard/resources/bttn-multi-down.png - :/setupwizard/resources/bttn-multi-down.png:/setupwizard/resources/bttn-multi-up.png - - - - 100 - 100 - - - - true - - - true - - - true - - - Qt::ToolButtonTextUnderIcon - - - true - - - - - - 170 - 40 - 100 - 120 - - - - Airplane, Sloper, Jet - - - QToolButton { border: none } - - - Fixed wing - - - - :/setupwizard/resources/bttn-plane-up.png - :/setupwizard/resources/bttn-plane-down.png - :/setupwizard/resources/bttn-plane-down.png - :/setupwizard/resources/bttn-plane-down.png:/setupwizard/resources/bttn-plane-up.png - - - - 100 - 100 - - - - true - - - false - - - true - - - Qt::ToolButtonTextUnderIcon - - - true - - - - - - 290 - 40 - 100 - 120 - - - - QToolButton { border: none } - - - Helicopter - - - - :/setupwizard/resources/bttn-heli-up.png - :/setupwizard/resources/bttn-heli-down.png - :/setupwizard/resources/bttn-heli-down.png - :/setupwizard/resources/bttn-heli-down.png:/setupwizard/resources/bttn-heli-up.png - - - - 100 - 100 - - - - true - - - true - - - Qt::ToolButtonTextUnderIcon - - - true - - - - - - 410 - 40 - 100 - 120 - - - - Car, Boat, U-Boat - - - QToolButton { border: none } - - - Surface - - - - :/setupwizard/resources/bttn-land-up.png - :/setupwizard/resources/bttn-land-down.png - :/setupwizard/resources/bttn-land-down.png - :/setupwizard/resources/bttn-land-down.png:/setupwizard/resources/bttn-land-up.png - - - - 100 - 100 - - - - true - - - true - - - Qt::ToolButtonTextUnderIcon - - - true - - diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-txwizard-off.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-txwizard-off.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0aab3048678d86f7093cec3424aa0e5abdaaed GIT binary patch literal 13667 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-txwizard-on.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-txwizard-on.png new file mode 100644 index 0000000000000000000000000000000000000000..98eecd4effa645a91a50f73de0d5c108bffc039e GIT binary patch literal 13809 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg b/ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg new file mode 100644 index 000000000..5639b4c41 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg @@ -0,0 +1,9951 @@ + + + +image/svg+xml1234 + + +Satellite + + +Throttle + + +Roll + + +Pitch + + +Yaw + + +Flight Mode + + + \ No newline at end of file diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index 942eb5d93..5f2ba88f6 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -48,8 +48,9 @@ SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), VehicleConfiguratio m_vehicleType(VEHICLE_UNKNOWN), m_inputType(INPUT_UNKNOWN), m_escType(ESC_UNKNOWN), m_levellingPerformed(false), m_connectionManager(0) { - setWindowTitle("OpenPilot Setup Wizard"); + setWindowTitle(tr("OpenPilot Setup Wizard")); setOption(QWizard::IndependentPages, false); + setFixedSize(640, 530); createPages(); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc b/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc index 913782e7d..8f7563d25 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc +++ b/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc @@ -24,5 +24,8 @@ resources/bttn-sat-up.png resources/bttn-sbus-down.png resources/bttn-sbus-up.png + resources/bttn-txwizard-off.png + resources/bttn-txwizard-on.png + resources/connection-diagrams.svg From 4d701a2f7a7939bef2c18a36aece2c9af4685fd9 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Fri, 24 Aug 2012 16:22:21 +0200 Subject: [PATCH 15/56] OP-39 Updated some GUI. Changed stylesheet on some elements. Switched button graphix and added new graphix. --- .../plugins/setupwizard/pages/flashpage.ui | 43 +++++++++++++---- .../plugins/setupwizard/pages/inputpage.ui | 16 ++----- .../setupwizard/pages/levellingpage.ui | 45 +++++++++++++++--- .../plugins/setupwizard/pages/outputpage.ui | 12 ++--- .../plugins/setupwizard/pages/vehiclepage.ui | 16 ++----- .../resources/bttn-calculate-down.png | Bin 0 -> 5752 bytes .../resources/bttn-calculate-up.png | Bin 0 -> 8234 bytes .../setupwizard/resources/bttn-rapid-down.png | Bin 8691 -> 0 bytes .../setupwizard/resources/bttn-rapid-up.png | Bin 9396 -> 0 bytes .../setupwizard/resources/bttn-turbo-down.png | Bin 0 -> 5780 bytes .../setupwizard/resources/bttn-turbo-up.png | Bin 0 -> 6598 bytes .../plugins/setupwizard/wizardResources.qrc | 6 ++- 12 files changed, 89 insertions(+), 49 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-calculate-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-calculate-up.png delete mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-rapid-down.png delete mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-rapid-up.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-turbo-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-turbo-up.png diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui index 5e8d5c9a1..89f3d5e40 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui @@ -43,25 +43,37 @@ p, li { white-space: pre-wrap; } true - + - 490 - 350 - 70 - 23 + 200 + 250 + 200 + 70 + + QToolButton { border: none } + Save + + + 200 + 70 + + + + Qt::ToolButtonIconOnly + 42 - 325 - 491 + 330 + 441 16 @@ -79,13 +91,28 @@ p, li { white-space: pre-wrap; } 40 350 - 450 + 520 23 + + QProgressBar { + border: 2px solid grey; + border-radius: 5px; + text-align: center; + } +QProgressBar::chunk { + background-color: #3D6699; + width: 10px; + margin: 0.5px; + } + 0 + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui index 768282200..8681fd49a 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui @@ -66,9 +66,7 @@ p, li { white-space: pre-wrap; } :/setupwizard/resources/bttn-sat-up.png - :/setupwizard/resources/bttn-sat-down.png - :/setupwizard/resources/bttn-sat-down.png - :/setupwizard/resources/bttn-sat-down.png:/setupwizard/resources/bttn-sat-up.png + :/setupwizard/resources/bttn-sat-down.png:/setupwizard/resources/bttn-sat-up.png @@ -115,9 +113,7 @@ p, li { white-space: pre-wrap; } :/setupwizard/resources/bttn-pwm-up.png - :/setupwizard/resources/bttn-pwm-down.png - :/setupwizard/resources/bttn-pwm-down.png - :/setupwizard/resources/bttn-pwm-down.png:/setupwizard/resources/bttn-pwm-up.png + :/setupwizard/resources/bttn-pwm-down.png:/setupwizard/resources/bttn-pwm-up.png @@ -167,9 +163,7 @@ p, li { white-space: pre-wrap; } :/setupwizard/resources/bttn-ppm-up.png - :/setupwizard/resources/bttn-ppm-down.png - :/setupwizard/resources/bttn-ppm-down.png - :/setupwizard/resources/bttn-ppm-down.png:/setupwizard/resources/bttn-ppm-up.png + :/setupwizard/resources/bttn-ppm-down.png:/setupwizard/resources/bttn-ppm-up.png @@ -216,9 +210,7 @@ p, li { white-space: pre-wrap; } :/setupwizard/resources/bttn-sbus-up.png - :/setupwizard/resources/bttn-sbus-down.png - :/setupwizard/resources/bttn-sbus-down.png - :/setupwizard/resources/bttn-sbus-down.png:/setupwizard/resources/bttn-sbus-up.png + :/setupwizard/resources/bttn-sbus-down.png:/setupwizard/resources/bttn-sbus-up.png diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui index 34ba4204d..17687d2c1 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui @@ -40,33 +40,64 @@ p, li { white-space: pre-wrap; } true - + - 490 - 350 - 70 - 23 + 200 + 250 + 200 + 70 + + QToolButton { border: none } + Calculate + + + :/setupwizard/resources/bttn-calculate-up.png + :/setupwizard/resources/bttn-calculate-down.png:/setupwizard/resources/bttn-calculate-up.png + + + + 200 + 70 + + 40 350 - 450 + 520 23 + + QProgressBar { + border: 2px solid grey; + border-radius: 5px; + text-align: center; + } +QProgressBar::chunk { + background-color: #3D6699; + width: 10px; + margin: 0.5px; + } + 0 + + + - + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui index 4a366b60e..2773cbca9 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui @@ -61,14 +61,12 @@ p, li { white-space: pre-wrap; } QToolButton { border: none } - Rapid ESC + Turbo PWM - :/setupwizard/resources/bttn-rapid-up.png - :/setupwizard/resources/bttn-rapid-down.png - :/setupwizard/resources/bttn-rapid-down.png - :/setupwizard/resources/bttn-rapid-down.png:/setupwizard/resources/bttn-rapid-up.png + :/setupwizard/resources/bttn-turbo-down.png + :/setupwizard/resources/bttn-turbo-up.png:/setupwizard/resources/bttn-turbo-down.png @@ -118,9 +116,7 @@ p, li { white-space: pre-wrap; } :/setupwizard/resources/bttn-ESC-up.png - :/setupwizard/resources/bttn-ESC-down.png - :/setupwizard/resources/bttn-ESC-down.png - :/setupwizard/resources/bttn-ESC-down.png:/setupwizard/resources/bttn-ESC-up.png + :/setupwizard/resources/bttn-ESC-down.png:/setupwizard/resources/bttn-ESC-up.png diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui index c9811b049..864e62194 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui @@ -66,9 +66,7 @@ p, li { white-space: pre-wrap; } :/setupwizard/resources/bttn-land-up.png - :/setupwizard/resources/bttn-land-down.png - :/setupwizard/resources/bttn-land-down.png - :/setupwizard/resources/bttn-land-down.png:/setupwizard/resources/bttn-land-up.png + :/setupwizard/resources/bttn-land-down.png:/setupwizard/resources/bttn-land-up.png @@ -118,9 +116,7 @@ p, li { white-space: pre-wrap; } :/setupwizard/resources/bttn-multi-up.png - :/setupwizard/resources/bttn-multi-down.png - :/setupwizard/resources/bttn-multi-down.png - :/setupwizard/resources/bttn-multi-down.png:/setupwizard/resources/bttn-multi-up.png + :/setupwizard/resources/bttn-multi-down.png:/setupwizard/resources/bttn-multi-up.png @@ -170,9 +166,7 @@ p, li { white-space: pre-wrap; } :/setupwizard/resources/bttn-plane-up.png - :/setupwizard/resources/bttn-plane-down.png - :/setupwizard/resources/bttn-plane-down.png - :/setupwizard/resources/bttn-plane-down.png:/setupwizard/resources/bttn-plane-up.png + :/setupwizard/resources/bttn-plane-down.png:/setupwizard/resources/bttn-plane-up.png @@ -219,9 +213,7 @@ p, li { white-space: pre-wrap; } :/setupwizard/resources/bttn-heli-up.png - :/setupwizard/resources/bttn-heli-down.png - :/setupwizard/resources/bttn-heli-down.png - :/setupwizard/resources/bttn-heli-down.png:/setupwizard/resources/bttn-heli-up.png + :/setupwizard/resources/bttn-heli-down.png:/setupwizard/resources/bttn-heli-up.png diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-calculate-down.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-calculate-down.png new file mode 100644 index 0000000000000000000000000000000000000000..5681d474eeab587c918e4042e3f0b34dac832e4b GIT binary patch literal 5752 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-calculate-up.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-calculate-up.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e2add72ec8fda25ac1a5a5f468a539033db170 GIT binary patch literal 8234 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 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-rapid-down.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-rapid-down.png deleted file mode 100644 index 276c26c6b680b6cebcbf323e447ee71431c1ed9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8691 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 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-rapid-up.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-rapid-up.png deleted file mode 100644 index 66808dca8f2507c59e97822c616c343a06aa6f10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9396 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 NZ4G_IbGU8z{{w>C{5=2w literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc b/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc index 8f7563d25..9a24b6780 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc +++ b/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc @@ -18,8 +18,6 @@ resources/bttn-ppm-up.png resources/bttn-pwm-down.png resources/bttn-pwm-up.png - resources/bttn-rapid-down.png - resources/bttn-rapid-up.png resources/bttn-sat-down.png resources/bttn-sat-up.png resources/bttn-sbus-down.png @@ -27,5 +25,9 @@ resources/bttn-txwizard-off.png resources/bttn-txwizard-on.png resources/connection-diagrams.svg + resources/bttn-calculate-down.png + resources/bttn-calculate-up.png + resources/bttn-turbo-down.png + resources/bttn-turbo-up.png From 66534ae91cb3f7c5997eb7358cf071689fe2d200 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Mon, 27 Aug 2012 07:19:46 +0200 Subject: [PATCH 16/56] OP-39 Fiddling around with connection diagram. Updated some GUI. Started on motor calibration function. --- .../plugins/setupwizard/connectiondiagram.cpp | 151 +- .../plugins/setupwizard/connectiondiagram.h | 10 +- .../plugins/setupwizard/connectiondiagram.ui | 9 + .../plugins/setupwizard/pages/flashpage.ui | 3 + .../plugins/setupwizard/pages/inputpage.ui | 8 +- .../setupwizard/pages/levellingpage.cpp | 7 +- .../setupwizard/pages/levellingpage.ui | 3 + .../plugins/setupwizard/pages/multipage.cpp | 6 + .../plugins/setupwizard/pages/multipage.ui | 9 +- .../plugins/setupwizard/pages/outputpage.ui | 8 +- .../plugins/setupwizard/pages/startpage.ui | 16 +- .../plugins/setupwizard/pages/summarypage.ui | 2 +- .../resources/connection-diagrams.svg | 11526 ++++++++-------- .../src/plugins/setupwizard/setupwizard.h | 8 +- .../vehicleconfigurationhelper.cpp | 21 +- .../setupwizard/vehicleconfigurationhelper.h | 5 +- .../setupwizard/vehicleconfigurationsource.h | 6 +- 17 files changed, 6240 insertions(+), 5558 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp index 91faef46d..9ca7f5db4 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp @@ -31,31 +31,142 @@ #include "ui_connectiondiagram.h" ConnectionDiagram::ConnectionDiagram(QWidget *parent, VehicleConfigurationSource* configSource) : - QDialog(parent), m_configSource(configSource), - ui(new Ui::ConnectionDiagram) + QDialog(parent), ui(new Ui::ConnectionDiagram), m_configSource(configSource), m_background(0) { - setWindowTitle(tr("Connection Diagram")); ui->setupUi(this); - - QGraphicsScene *scene = new QGraphicsScene(this); - ui->connectionDiagram->setScene(scene); - ui->connectionDiagram->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); - m_renderer = new QSvgRenderer(); - if (m_renderer->load(QString(":/setupwizard/resources/connection-diagrams.svg")) && m_renderer->isValid()) - { - scene->clear(); - QGraphicsSvgItem* ccPic = new QGraphicsSvgItem(); - ccPic->setSharedRenderer(m_renderer); - ccPic->setElementId("cc"); - scene->addItem(ccPic); - qDebug() << "Scene complete"; - - //ui->connectionDiagram->setSceneRect(ccPic->boundingRect()); - //ui->connectionDiagram->fitInView(ccPic, Qt::KeepAspectRatio); - } + setWindowTitle(tr("Connection Diagram")); + setupGraphicsScene(); } ConnectionDiagram::~ConnectionDiagram() { delete ui; } + +void ConnectionDiagram::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + ui->connectionDiagram->fitInView(m_background, Qt::KeepAspectRatio); +} + +void ConnectionDiagram::showEvent(QShowEvent * event) +{ + QWidget::showEvent(event); + ui->connectionDiagram->fitInView(m_background, Qt::KeepAspectRatio); +} + +void ConnectionDiagram::setupGraphicsScene() +{ + QGraphicsScene *scene = new QGraphicsScene(this); + ui->connectionDiagram->setScene(scene); + ui->connectionDiagram->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + m_renderer = new QSvgRenderer(); + if (QFile::exists(QString(":/setupwizard/resources/connection-diagrams.svg")) && + m_renderer->load(QString(":/setupwizard/resources/connection-diagrams.svg")) && + m_renderer->isValid()) + { + scene->clear(); + m_background = new QGraphicsSvgItem(); + m_background->setSharedRenderer(m_renderer); + m_background->setElementId("background"); + m_background->setVisible(true); + m_background->setFlags(QGraphicsItem::ItemClipsChildrenToShape | QGraphicsItem::ItemClipsToShape); + scene->addItem(m_background); + + QList elementsToShow; + + switch(m_configSource->getControllerType()) + { + case VehicleConfigurationSource::CONTROLLER_CC: + case VehicleConfigurationSource::CONTROLLER_CC3D: + case VehicleConfigurationSource::CONTROLLER_REVO: + case VehicleConfigurationSource::CONTROLLER_PIPX: + default: + elementsToShow << "controller"; + break; + } + + switch (m_configSource->getVehicleType()) + { + case VehicleConfigurationSource::VEHICLE_MULTI: + switch (m_configSource->getVehicleSubType()) + { + case VehicleConfigurationSource::MULTI_ROTOR_TRI_Y: + elementsToShow << "tri"; + break; + case VehicleConfigurationSource::MULTI_ROTOR_QUAD_X: + elementsToShow << "quad-x"; + break; + case VehicleConfigurationSource::MULTI_ROTOR_QUAD_PLUS: + elementsToShow << "quad-p"; + break; + case VehicleConfigurationSource::MULTI_ROTOR_HEXA: + elementsToShow << "hexa"; + break; + case VehicleConfigurationSource::MULTI_ROTOR_HEXA_COAX_Y: + elementsToShow << "hexa-y"; + break; + case VehicleConfigurationSource::MULTI_ROTOR_HEXA_H: + elementsToShow << "hexa-h"; + break; + default: + break; + } + break; + case VehicleConfigurationSource::VEHICLE_FIXEDWING: + case VehicleConfigurationSource::VEHICLE_HELI: + case VehicleConfigurationSource::VEHICLE_SURFACE: + default: + break; + } + + switch (m_configSource->getInputType()) + { + case VehicleConfigurationSource::INPUT_PWM: + elementsToShow << "pwm" << "receiver" ; + break; + case VehicleConfigurationSource::INPUT_PPM: + elementsToShow << "receiver" << "ppm"; + break; + case VehicleConfigurationSource::INPUT_SBUS: + elementsToShow << "sbus"; + break; + case VehicleConfigurationSource::INPUT_DSM: + elementsToShow << "satellite"; + break; + default: + break; + } + + setupGraphicsSceneItems(scene, elementsToShow); + + ui->connectionDiagram->setSceneRect(m_background->boundingRect()); + ui->connectionDiagram->fitInView(m_background, Qt::KeepAspectRatio); + + qDebug() << "Scene complete"; + } +} + +void ConnectionDiagram::setupGraphicsSceneItems(QGraphicsScene *scene, QList elementsToShow) +{ + foreach(QString elementId, elementsToShow) { + if(m_renderer->elementExists(elementId)) { + QGraphicsSvgItem* element = new QGraphicsSvgItem(); + element->setSharedRenderer(m_renderer); + element->setElementId(elementId); + element->setVisible(true); + scene->addItem(element); + + QMatrix matrix = m_renderer->matrixForElement(elementId); + QRectF orig = matrix.mapRect(m_renderer->boundsOnElement(elementId)); + element->setPos(orig.x(),orig.y()); + qDebug() << "Adding " << elementId << " to scene at " << element->pos(); + } + else + { + qDebug() << "Element " << elementId << " not found in renderer!"; + } + } +} + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h index 546bd4f39..2063403a5 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h @@ -53,8 +53,14 @@ private: VehicleConfigurationSource *m_configSource; QSvgRenderer *m_renderer; - QHash m_vehicleImageMap; - QHash m_receiverImageMap; + QGraphicsSvgItem* m_background; + + void setupGraphicsScene(); + void setupGraphicsSceneItems(QGraphicsScene *scene, QList elementsToShow); +protected: + void resizeEvent(QResizeEvent *event); + void showEvent(QShowEvent *event); + }; #endif // CONNECTIONDIAGRAM_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui index 8c4e74b45..27221c4c7 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui @@ -31,6 +31,15 @@ Qt::ScrollBarAlwaysOff + + + + 255 + 255 + 255 + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui index 89f3d5e40..131d02540 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui @@ -52,6 +52,9 @@ p, li { white-space: pre-wrap; } 70 + + Write configuration to controller + QToolButton { border: none } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui index 8681fd49a..7446dbbc3 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui @@ -55,7 +55,7 @@ p, li { white-space: pre-wrap; } - Airplane, Sloper, Jet + Spectrum Satellite QToolButton { border: none } @@ -102,7 +102,7 @@ p, li { white-space: pre-wrap; } - Tricopter, Quadcopter, Hexacopter, Octocopter + PWM - One cable per channel QToolButton { border: none } @@ -152,7 +152,7 @@ p, li { white-space: pre-wrap; } - Airplane, Sloper, Jet + PPM - One cable for all channels QToolButton { border: none } @@ -199,7 +199,7 @@ p, li { white-space: pre-wrap; } - Airplane, Sloper, Jet + Futaba S-BUS QToolButton { border: none } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp index 10afada80..34ef253f5 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -69,6 +69,10 @@ void LevellingPage::performLevelling() return; } + getWizard()->button(QWizard::CancelButton)->setEnabled(false); + getWizard()->button(QWizard::BackButton)->setEnabled(false); + ui->levelButton->setEnabled(false); + if(!m_levellingUtil) { // Measure every 100ms * 100times = 10s @@ -79,9 +83,6 @@ void LevellingPage::performLevelling() connect(m_levellingUtil, SIGNAL(progress(long,long)), this, SLOT(levellingProgress(long,long))); connect(m_levellingUtil, SIGNAL(done(accelGyroBias)), this, SLOT(levellingDone(accelGyroBias))); connect(m_levellingUtil, SIGNAL(timeout(QString)), this, SLOT(levellingTimeout(QString))); - getWizard()->button(QWizard::CancelButton)->setEnabled(false); - getWizard()->button(QWizard::BackButton)->setEnabled(false); - ui->levelButton->setEnabled(false); m_levellingUtil->start(); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui index 17687d2c1..493dbea91 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui @@ -49,6 +49,9 @@ p, li { white-space: pre-wrap; } 70 + + Calculate gyro and accelerometer bias + QToolButton { border: none } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp index 37419eabb..6d10509b7 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp @@ -65,6 +65,7 @@ bool MultiPage::validatePage() { SetupWizard::VEHICLE_SUB_TYPE type = (SetupWizard::VEHICLE_SUB_TYPE) ui->typeCombo->itemData(ui->typeCombo->currentIndex()).toInt(); getWizard()->setVehicleSubType(type); + return true; } void MultiPage::setupMultiTypesCombo() @@ -94,6 +95,8 @@ void MultiPage::setupMultiTypesCombo() ui->typeCombo->addItem(tr("Hexacopter H"), SetupWizard::MULTI_ROTOR_HEXA_H); m_descriptions << tr("Hexacopter H"); + // Fredrik Arvidsson(m_thread) 2012-08-26 Disable Octos until further notice + /* ui->typeCombo->addItem(tr("Octocopter"), SetupWizard::MULTI_ROTOR_OCTO); m_descriptions << tr("Octocopter"); @@ -105,15 +108,18 @@ void MultiPage::setupMultiTypesCombo() ui->typeCombo->addItem(tr("Octocopter V"), SetupWizard::MULTI_ROTOR_OCTO_V); m_descriptions << tr("Octocopter V"); + */ } void MultiPage::updateAvailableTypes() { + /* QVariant enable = (getWizard()->getInputType() == SetupWizard::INPUT_PWM) ? QVariant(0) : QVariant(1 | 32); ui->typeCombo->model()->setData(ui->typeCombo->model()->index(6, 0), enable, Qt::UserRole - 1); ui->typeCombo->model()->setData(ui->typeCombo->model()->index(7, 0), enable, Qt::UserRole - 1); ui->typeCombo->model()->setData(ui->typeCombo->model()->index(8, 0), enable, Qt::UserRole - 1); ui->typeCombo->model()->setData(ui->typeCombo->model()->index(9, 0), enable, Qt::UserRole - 1); + */ } void MultiPage::updateImageAndDescription() diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui index 8f15a2973..a369f1019 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui @@ -26,13 +26,12 @@ <!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"> 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;">OpenPilot multirotor 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:12pt; font-weight:600;"></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: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 with multiple rotors. The wizard supports the most common types of multirotors. Other variants of multirotors can be configured by using custom configuration options in the configuration plugin in 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;"></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 multirotor you want to create a configuration for below:</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:10pt;">(Depending on input configuration all types may not be available to select from the list.)</span></p></body></html> +<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 multirotor you want to create a configuration for below:</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui index 2773cbca9..45090f1e6 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui @@ -55,7 +55,7 @@ p, li { white-space: pre-wrap; } - Airplane, Sloper, Jet + Turbo PWM ESC 400Hz QToolButton { border: none } @@ -65,8 +65,8 @@ p, li { white-space: pre-wrap; } - :/setupwizard/resources/bttn-turbo-down.png - :/setupwizard/resources/bttn-turbo-up.png:/setupwizard/resources/bttn-turbo-down.png + :/setupwizard/resources/bttn-turbo-up.png + :/setupwizard/resources/bttn-turbo-down.png:/setupwizard/resources/bttn-turbo-up.png @@ -105,7 +105,7 @@ p, li { white-space: pre-wrap; } - Tricopter, Quadcopter, Hexacopter, Octocopter + Standard ESC 50Hz QToolButton { border: none } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui index e6a293d90..75ab147d7 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui @@ -24,7 +24,7 @@ 20 20 - 550 + 581 350 @@ -32,15 +32,21 @@ <!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"> 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;">Welcome to the OpenPilot Setup Wizard</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> +<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;"><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 wizard will guide you through the basic steps of setting up your OpenPilot controller board. The following pages contains simple questions about your vehicle and its characteristics. </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:10pt;">From the information gathered the wizard will create a baseline configuration that should be good enough for you to get a quick start using your OpenPilot product.</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:10pt;">The baseline configuration can, if desired, be uploaded to the OpenPilot Controller board at the end of this wizard.</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;"></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;">This wizard does not contain the full range of settings available in the GCS Config plugin. All configuration parameters can be changed at later by using the GCS Config plugin.</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;"></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="-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 align="center" 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; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICHLE </span></p> +<p align="center" 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; color:#ff0000;">BEFORE PROCEEDING!</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;">Ignoring the above request will put you in a</span><span style=" font-size:10pt; font-weight:600; color:#ff0000;"> risk of serious injury</span><span style=" font-size:10pt;">!</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;">Ok, lets start the configuration by clicking on the 'Next'/'Continue' button below.</span></p></body></html> diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui index 11f646232..85b332d21 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui @@ -51,7 +51,7 @@ p, li { white-space: pre-wrap; } - Tricopter, Quadcopter, Hexacopter, Octocopter + Show connection diagram for configuration Hardware diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg b/ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg index 5639b4c41..853902d13 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg +++ b/ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg @@ -13,8 +13,8 @@ id="svg4183" version="1.1" inkscape:version="0.48.2 r9819" - width="4065.2493" - height="1760.019" + width="1100" + height="550" xml:space="preserve" sodipodi:docname="connection-diagrams.svg">1234 - - - diff --git a/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.cpp b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.cpp new file mode 100644 index 000000000..0c2e10746 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.cpp @@ -0,0 +1,92 @@ +/** + ****************************************************************************** + * + * @file outputcalibrationutil.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup OutputCalibrationUtil + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "outputcalibrationutil.h" +#include "actuatorcommand.h" +#include "extensionsystem/pluginmanager.h" + +OutputCalibrationUtil::OutputCalibrationUtil(QObject *parent) : + QObject(parent), m_outputChannel(0) +{ + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + m_uavObjectManager = pm->getObject(); + Q_ASSERT(m_uavObjectManager); +} + +void OutputCalibrationUtil::startChannelOutput(quint16 channel) +{ + if(m_outputChannel == 0 && channel > 0 && channel <= ActuatorCommand::CHANNEL_NUMELEM) + { + ActuatorCommand *actuatorCommand = ActuatorCommand::GetInstance(m_uavObjectManager); + Q_ASSERT(actuatorCommand); + UAVObject::Metadata metaData = actuatorCommand->getMetadata(); + + m_savedActuatorMetadata = metaData; + UAVObject::SetFlightAccess(metaData, UAVObject::ACCESS_READONLY); + UAVObject::SetFlightTelemetryUpdateMode(metaData, UAVObject::UPDATEMODE_ONCHANGE); + UAVObject::SetGcsTelemetryAcked(metaData, false); + UAVObject::SetGcsTelemetryUpdateMode(metaData, UAVObject::UPDATEMODE_ONCHANGE); + metaData.gcsTelemetryUpdatePeriod = 100; + + actuatorCommand->setMetadata(metaData); + actuatorCommand->updated(); + + //Start output... + m_outputChannel = channel; + } +} + +void OutputCalibrationUtil::stopChannelOutput() +{ + if(m_outputChannel > 0) + { + //Stop output... + ActuatorCommand *actuatorCommand = ActuatorCommand::GetInstance(m_uavObjectManager); + Q_ASSERT(actuatorCommand); + UAVObject::Metadata metaData = actuatorCommand->getMetadata(); + + // Restore metadata to what it was before + metaData = m_savedActuatorMetadata; + actuatorCommand->setMetadata(metaData); + actuatorCommand->updated(); + + m_outputChannel = 0; + } +} + +void OutputCalibrationUtil::setChannelOutputValue(quint16 value) +{ + if(m_outputChannel > 0) + { + //Set output value + ActuatorCommand *actuatorCommand = ActuatorCommand::GetInstance(m_uavObjectManager); + Q_ASSERT(actuatorCommand); + ActuatorCommand::DataFields data = actuatorCommand->getData(); + data.Channel[m_outputChannel - 1] = value; + actuatorCommand->setData(data); + } +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.h b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.h new file mode 100644 index 000000000..82149a22d --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.h @@ -0,0 +1,57 @@ +/** + ****************************************************************************** + * + * @file outputcalibrationutil.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup OutputCalibrationUtil + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef OUTPUTCALIBRATIONUTIL_H +#define OUTPUTCALIBRATIONUTIL_H + +#include +#include "uavobject.h" +#include "uavobjectmanager.h" + + +class OutputCalibrationUtil : public QObject +{ + Q_OBJECT +public: + explicit OutputCalibrationUtil(QObject *parent = 0); + +signals: + +public slots: + void startChannelOutput(quint16 channel); + void stopChannelOutput(); + + void setChannelOutputValue(quint16 value); + +private: + quint16 m_outputChannel; + UAVObject::Metadata m_savedActuatorMetadata; + UAVObjectManager *m_uavObjectManager; + +}; + +#endif // OUTPUTCALIBRATIONUTIL_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp index 79014eaf5..988312bef 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp @@ -68,7 +68,7 @@ void FlashPage::writeToController() ui->saveButton->setEnabled(false); getWizard()->button(QWizard::CancelButton)->setEnabled(false); - getWizard()->button(QWizard::BackButton)->setEnabled(false); + setCommitPage(true); VehicleConfigurationHelper helper(getWizard()); connect(&helper, SIGNAL(saveProgress(int, int, QString)),this, SLOT(saveProgress(int, int, QString))); m_successfulWrite = helper.setupVehicle(); @@ -76,7 +76,7 @@ void FlashPage::writeToController() ui->saveProgressLabel->setText(QString("%2").arg(m_successfulWrite ? "green" : "red", ui->saveProgressLabel->text())); ui->saveButton->setEnabled(true); getWizard()->button(QWizard::CancelButton)->setEnabled(true); - getWizard()->button(QWizard::BackButton)->setEnabled(true); + setCommitPage(false); emit completeChanged(); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp index 992e7dd50..d806a3ffd 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -71,7 +71,6 @@ void LevellingPage::performLevelling() } getWizard()->button(QWizard::CancelButton)->setEnabled(false); - getWizard()->button(QWizard::BackButton)->setEnabled(false); ui->levelButton->setEnabled(false); if(!m_levellingUtil) @@ -122,8 +121,7 @@ void LevellingPage::stopLevelling() disconnect(m_levellingUtil, SIGNAL(progress(long,long)), this, SLOT(levellingProgress(long,long))); disconnect(m_levellingUtil, SIGNAL(done(accelGyroBias)), this, SLOT(levellingDone(accelGyroBias))); disconnect(m_levellingUtil, SIGNAL(timeout(QString)), this, SLOT(levellingTimeout(QString))); - ui->levelButton->setEnabled(true); getWizard()->button(QWizard::CancelButton)->setEnabled(true); - getWizard()->button(QWizard::BackButton)->setEnabled(true); + ui->levelButton->setEnabled(true); } } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp index 80c119116..b4aaed7cb 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp @@ -29,12 +29,213 @@ #include "ui_outputcalibrationpage.h" OutputCalibrationPage::OutputCalibrationPage(SetupWizard *wizard, QWidget *parent) : - AbstractWizardPage(wizard, parent), ui(new Ui::OutputCalibrationPage) + AbstractWizardPage(wizard, parent), ui(new Ui::OutputCalibrationPage), m_vehicleBoundsItem(0), + m_currentWizardIndex(0), m_calibrationUtil(0) { ui->setupUi(this); + + m_calibrationUtil = new OutputCalibrationUtil(); + + m_vehicleRenderer = new QSvgRenderer(); + if (QFile::exists(QString(":/setupwizard/resources/multirotor-shapes.svg")) && + m_vehicleRenderer->load(QString(":/setupwizard/resources/multirotor-shapes.svg")) && + m_vehicleRenderer->isValid()) + { + m_vehicleScene = new QGraphicsScene(this); + ui->vehicleView->setScene(m_vehicleScene); + } } OutputCalibrationPage::~OutputCalibrationPage() { + if(m_calibrationUtil) { + delete m_calibrationUtil; + } delete ui; } + +void OutputCalibrationPage::setupVehicle() +{ + m_wizardIndexes.clear(); + m_vehicleElementIds.clear(); + m_vehicleHighlightElementIndexes.clear(); + m_currentWizardIndex = 0; + m_vehicleScene->clear(); + switch(getWizard()->getVehicleSubType()) + { + case SetupWizard::MULTI_ROTOR_TRI_Y: + m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 3 << 4; + m_vehicleElementIds << "tri" << "tri-frame" << "tri-m1" << "tri-m2" << "tri-m3" << "tri-s1"; + m_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4; + break; + case SetupWizard::MULTI_ROTOR_QUAD_X: + m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; + m_vehicleElementIds << "quad-x" << "quad-x-frame" << "quad-x-m1" << "quad-x-m2" << "quad-x-m3" << "quad-x-m4"; + m_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4; + break; + case SetupWizard::MULTI_ROTOR_QUAD_PLUS: + m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; + m_vehicleElementIds << "quad-p" << "quad-p-frame" << "quad-p-m1" << "quad-p-m2" << "quad-p-m3" << "quad-p-m4"; + m_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4; + break; + case SetupWizard::MULTI_ROTOR_HEXA: + m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; + m_vehicleElementIds << "hexa" << "hexa-frame" << "hexa-m1" << "hexa-m2" << "hexa-m3" << "hexa-m4" << "hexa-m5" << "hexa-m6"; + m_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5 << 6 << 6; + break; + case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y: + m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; + m_vehicleElementIds << "hexa-y6" << "hexa-y6-frame" << "hexa-y6-m1" << "hexa-y6-m2" << "hexa-y6-m3" << "hexa-y6-m4" << "hexa-y6-m5" << "hexa-y6-m6"; + m_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5 << 6 << 6; + break; + case SetupWizard::MULTI_ROTOR_HEXA_H: + m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; + 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 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5 << 6 << 6; + break; + default: + break; + } + setupVehicleItems(); +} + +void OutputCalibrationPage::setupVehicleItems() +{ + m_vehicleItems.clear(); + m_vehicleBoundsItem = new QGraphicsSvgItem(); + m_vehicleBoundsItem->setSharedRenderer(m_vehicleRenderer); + m_vehicleBoundsItem->setElementId(m_vehicleElementIds[0]); + m_vehicleBoundsItem->setZValue(-1); + m_vehicleBoundsItem->setOpacity(0); + m_vehicleScene->addItem(m_vehicleBoundsItem); + + QRectF parentBounds = m_vehicleRenderer->boundsOnElement(m_vehicleElementIds[0]); + + for(int i = 1; i < m_vehicleElementIds.size(); i++) + { + QGraphicsSvgItem *item = new QGraphicsSvgItem(); + item->setSharedRenderer(m_vehicleRenderer); + item->setElementId(m_vehicleElementIds[i]); + item->setZValue(i); + item->setOpacity(1.0); + QRectF itemBounds = m_vehicleRenderer->boundsOnElement(m_vehicleElementIds[i]); + item->setPos(itemBounds.x() - parentBounds.x(), itemBounds.y() - parentBounds.y()); + + m_vehicleScene->addItem(item); + m_vehicleItems << item; + } +} + +void OutputCalibrationPage::startWizard() +{ + ui->calibrationStack->setCurrentIndex(m_wizardIndexes[0]); + setupVehicleHighlightedPart(); +} + +void OutputCalibrationPage::setupVehicleHighlightedPart() +{ + qreal dimOpaque = m_currentWizardIndex == 0 ? 1.0 : 0.3; + qreal highlightOpaque = 1.0; + int highlightedIndex = m_vehicleHighlightElementIndexes[m_currentWizardIndex]; + for(int i = 0; i < m_vehicleItems.size(); i++) { + QGraphicsSvgItem* item = m_vehicleItems[i]; + item->setOpacity((highlightedIndex == i) ? highlightOpaque : dimOpaque); + } +} + +void OutputCalibrationPage::setWizardPage() +{ + m_calibrationUtil->stopChannelOutput(); + ui->backPageButton->setEnabled(m_currentWizardIndex > 0); + ui->nextPageButton->setEnabled(m_currentWizardIndex < (m_wizardIndexes.size() - 1)); + ui->calibrationStack->setCurrentIndex(m_wizardIndexes.at(m_currentWizardIndex)); + setupVehicleHighlightedPart(); +} + +void OutputCalibrationPage::initializePage() +{ + if(m_vehicleScene) { + setupVehicle(); + startWizard(); + } +} + +void OutputCalibrationPage::showEvent(QShowEvent *event) +{ + Q_UNUSED(event); + if(m_vehicleBoundsItem) { + ui->vehicleView->setSceneRect(m_vehicleBoundsItem->boundingRect()); + ui->vehicleView->fitInView(m_vehicleBoundsItem, Qt::KeepAspectRatio); + } +} + +void OutputCalibrationPage::on_nextPageButton_clicked() +{ + if(m_currentWizardIndex < m_wizardIndexes.size()) { + m_currentWizardIndex++; + setWizardPage(); + } +} + +void OutputCalibrationPage::on_backPageButton_clicked() +{ + if(m_currentWizardIndex > 0) { + m_currentWizardIndex--; + setWizardPage(); + } +} + +void OutputCalibrationPage::on_motorNeutralButton_toggled(bool checked) +{ + if(checked) { + m_calibrationUtil->startChannelOutput(m_vehicleHighlightElementIndexes[m_currentWizardIndex]); + m_calibrationUtil->setChannelOutputValue(ui->motorNeutralSlider->value()); + } + else { + m_calibrationUtil->setChannelOutputValue(ui->motorNeutralSlider->minimum()); + m_calibrationUtil->stopChannelOutput(); + } +} + +void OutputCalibrationPage::on_motorNeutralSlider_valueChanged(int value) +{ + if(ui->motorNeutralButton->isChecked()) + { + m_calibrationUtil->setChannelOutputValue(ui->motorNeutralSlider->value()); + } +} + +void OutputCalibrationPage::on_motorMaxButton_toggled(bool checked) +{ + +} + +void OutputCalibrationPage::on_motorMaxSlider_valueChanged(int position) +{ + +} + +void OutputCalibrationPage::on_servoCenterButton_toggled(bool checked) +{ + +} + +void OutputCalibrationPage::on_servoAngleButton_toggled(bool checked) +{ + +} + +void OutputCalibrationPage::on_servoMaxAngleSlider_valueChanged(int position) +{ + +} + +void OutputCalibrationPage::on_servoMinAngleSlider_valueChanged(int position) +{ + +} + +void OutputCalibrationPage::on_servoCenterSlider_valueChanged(int position) +{ + +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h index 681c5f652..ecbdcca15 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h @@ -28,7 +28,10 @@ #ifndef OUTPUTCALIBRATIONPAGE_H #define OUTPUTCALIBRATIONPAGE_H +#include #include "abstractwizardpage.h" +#include "setupwizard.h" +#include "outputcalibrationutil.h" namespace Ui { class OutputCalibrationPage; @@ -41,9 +44,49 @@ class OutputCalibrationPage : public AbstractWizardPage public: explicit OutputCalibrationPage(SetupWizard *wizard, QWidget *parent = 0); ~OutputCalibrationPage(); + void initializePage(); + +protected: + void showEvent(QShowEvent *event); +private slots: + void on_nextPageButton_clicked(); + void on_backPageButton_clicked(); + + void on_motorNeutralButton_toggled(bool checked); + void on_motorNeutralSlider_valueChanged(int value); + + void on_motorMaxButton_toggled(bool checked); + void on_motorMaxSlider_valueChanged(int position); + + void on_servoCenterButton_toggled(bool checked); + void on_servoCenterSlider_valueChanged(int position); + + void on_servoAngleButton_toggled(bool checked); + void on_servoMaxAngleSlider_valueChanged(int position); + void on_servoMinAngleSlider_valueChanged(int position); + private: + void setupVehicle(); + void startWizard(); + void setupVehicleItems(); + void setupVehicleHighlightedPart(); + void setWizardPage(); + Ui::OutputCalibrationPage *ui; + QSvgRenderer *m_vehicleRenderer; + QGraphicsScene *m_vehicleScene; + QGraphicsSvgItem *m_vehicleBoundsItem; + + quint16 m_currentWizardIndex; + + QList m_vehicleElementIds; + QList m_vehicleItems; + QList m_vehicleHighlightElementIndexes; + QList m_wizardIndexes; + + OutputCalibrationUtil *m_calibrationUtil; + }; #endif // OUTPUTCALIBRATIONPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui index a36237de2..401c80269 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui @@ -13,104 +13,617 @@ WizardPage - + - 310 + 300 40 - 250 - 250 + 270 + 270 QFrame::NoFrame - + - 110 - 341 - 380 - 20 + 20 + 40 + 270 + 291 - - Qt::Horizontal - - - QSlider::TicksBelow - - - 10 + + 1 + + + + + 0 + 10 + 261 + 281 + + + + <html><head/><body><p><span style=" font-size:10pt;">It is now time to calibrate the output levels for the signal controlling your vehichle. </span></p><p><span style=" font-size:10pt;">Depending on what vehichle you have selected, both motors controlled by ESC and servos controlled directly by the OpenPilot controller may have to be calibrated. <br/>The following steps will guide you safely through this process.<br/></span></p><p align="center"><span style=" font-size:14pt; font-weight:600; color:#ff0000;">VERY IMPORTANT!</span></p><p align="center"><br/><span style=" font-size:12pt; font-weight:600; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICHLE BEFORE PROCEEDING!</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + + + 0 + 10 + 261 + 141 + + + + <html><head/><body><p>In this step we will set the neutral rate for the motor highlighted in the illustration to the right. <br/>Plase pay attention to the details and in particular the motors position and its rotation direction.</p><p>To find the neutral rate for this engine, press the Start button below and slide the slider to the right until the engine just starts to spin stably. <br/><br/>When done press button again to stop.</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + false + + + + 10 + 200 + 241 + 19 + + + + 1000 + + + 1400 + + + 10 + + + 20 + + + Qt::Horizontal + + + false + + + QSlider::TicksBelow + + + 20 + + + + + + 90 + 240 + 75 + 23 + + + + Start + + + true + + + false + + + + + + + + 90 + 240 + 75 + 23 + + + + Start + + + true + + + false + + + + + + 0 + 10 + 261 + 171 + + + + <html><head/><body><p>Now it is time to find out the maximum rate for the motor highlighted in the illustration to the right. </p><p>To find the maximum rate for this engine, press the Start button below and slide the slider to the left until the engine just starts to slow down.</p><p>Running a brushless motor for a long time without proper cooling can in theory damage it. Therefore do not leave the motor running at full rate longer than neccesary.<br/><br/>When done press button again to stop.</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + false + + + + 10 + 200 + 241 + 19 + + + + 1600 + + + 2000 + + + 10 + + + 20 + + + 2000 + + + Qt::Horizontal + + + false + + + false + + + QSlider::TicksBelow + + + 20 + + + + + + + + 0 + 10 + 261 + 141 + + + + <html><head/><body><p>This step calibrates the center position of the servo. To set the center position for this servo, press the Start button below and slide the slider to center the servo. </p><p>When done press button again to stop.</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + false + + + + 10 + 200 + 241 + 19 + + + + 1000 + + + 2000 + + + 10 + + + 20 + + + 1500 + + + false + + + Qt::Horizontal + + + false + + + false + + + QSlider::TicksBelow + + + 40 + + + + + + 90 + 240 + 75 + 23 + + + + Start + + + true + + + false + + + + + + + + 90 + 240 + 75 + 23 + + + + Start + + + true + + + false + + + + + + 0 + 10 + 261 + 151 + + + + <html><head/><body><p>To save the servo and other hardware from damage we have to set the max and min angles for the servo. </p><p>To set the extreme angles for the servo, press the Start button below and select the top slider and slide it to the right until max angle is reached. Then select the lower slider and slide it left until the minimum angle is set.</p><p>When done press button again to stop.</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + 0 + 160 + 261 + 80 + + + + + + 10 + 40 + 16 + 17 + + + + + + + + + + 10 + 0 + 16 + 17 + + + + + + + true + + + + + + 39 + 0 + 211 + 20 + + + + 1500 + + + 2000 + + + 10 + + + 20 + + + 1500 + + + false + + + Qt::Horizontal + + + false + + + false + + + QSlider::TicksBelow + + + 40 + + + + + false + + + + 39 + 40 + 211 + 20 + + + + 1000 + + + 1500 + + + 10 + + + 20 + + + 1500 + + + false + + + Qt::Horizontal + + + false + + + false + + + QSlider::TicksBelow + + + 40 + + + + - + - 40 - 340 - 50 - 22 + 20 + 20 + 531 + 16 - - Qt::LeftToRight + + + 12 + 75 + true + + + + Output calibration - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - + + + + + 148 + 340 + 75 + 23 + + + + > + + + + false - - QAbstractSpinBox::UpDownArrows - - - - - - - - - 2500 - - - 1000 - - - - 510 + 68 340 - 50 - 22 + 75 + 23 - - Qt::LeftToRight - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - QAbstractSpinBox::UpDownArrows - - - - - - - - - 2500 - - - 2000 + + < - + + + servoMaxAngleSliderRB + toggled(bool) + servoMaxAngleSlider + setEnabled(bool) + + + 37 + 208 + + + 164 + 209 + + + + + servoMinAngleSliderRB + toggled(bool) + servoMinAngleSlider + setEnabled(bool) + + + 37 + 248 + + + 164 + 249 + + + + + motorNeutralButton + toggled(bool) + motorNeutralSlider + setEnabled(bool) + + + 147 + 291 + + + 150 + 249 + + + + + motorMaxButton + toggled(bool) + motorMaxSlider + setEnabled(bool) + + + 147 + 291 + + + 150 + 249 + + + + + servoCenterButton + toggled(bool) + servoCenterSlider + setEnabled(bool) + + + 147 + 291 + + + 150 + 249 + + + + + servoAngleButton + toggled(bool) + sliderWidget + setEnabled(bool) + + + 147 + 291 + + + 150 + 239 + + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui index 75ab147d7..f6b649191 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui @@ -45,7 +45,7 @@ p, li { white-space: pre-wrap; } <p align="center" 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; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICHLE </span></p> <p align="center" 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; color:#ff0000;">BEFORE PROCEEDING!</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;">Ignoring the above request will put you in a</span><span style=" font-size:10pt; font-weight:600; color:#ff0000;"> risk of serious injury</span><span style=" font-size:10pt;">!</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:10pt;">Ignoring the above request will put you in a</span><span style=" font-size:10pt; font-weight:600; color:#000000;"> risk of serious injury</span><span style=" font-size:10pt;">!</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;">Ok, lets start the configuration by clicking on the 'Next'/'Continue' button below.</span></p></body></html> diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui index 85b332d21..47cc2dbeb 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui @@ -26,13 +26,15 @@ <!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"> 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;">OpenPilot configuration summary</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:12pt; font-weight:600;"></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;">The first part of this wizard is now complete. The information required to create a basic OpenPilot controller configuration has been collected and a configuration can be created and saved.</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: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;">The first part of this wizard is now complete. All information required to create a basic OpenPilot controller configuration for a specific vehichle has been collected.</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:10pt;">Below is a summary of the configuration and a button that links to a diagram illustrating how to connect required hardware and the OpenPilotController with the current 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:10pt;"></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;">To complete the wizard and write the configuration directly to the OpenPilot controller please continue to the next and last step of this wizard.</span></p></body></html> +<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;">To continue the wizard and go through some basic configuration steps please continue to the next step of this wizard.</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;"><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;">The following steps requires that your OpenPilot controller is set up according to the diagram and that the vehicle is </span><span style=" font-size:10pt; font-weight:600;">powered by a battery</span><span style=" font-size:10pt;"> as well as </span><span style=" font-size:10pt; font-weight:600;">connected to the computer</span><span style=" font-size:10pt;">.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -45,7 +47,7 @@ p, li { white-space: pre-wrap; } 460 - 250 + 260 100 100 @@ -75,9 +77,9 @@ Illustration 40 - 230 + 249 400 - 140 + 121 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg b/ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg index 4e0fe2994..1f2219f3f 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg +++ b/ground/openpilotgcs/src/plugins/setupwizard/resources/connection-diagrams.svg @@ -10,3735 +10,13 @@ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - id="svg4183" + id="svg12651" + height="519.51434" + width="1078.6002" version="1.1" inkscape:version="0.48.2 r9819" - width="1100" - height="550" - xml:space="preserve" - sodipodi:docname="connection-diagrams.svg">image/svg+xml + - 1 + 0 @@ -95,7 +95,7 @@ 1000 - 1400 + 1300 10 @@ -188,7 +188,7 @@ - 1600 + 1400 2000 @@ -267,7 +267,7 @@ 1500 - false + true Qt::Horizontal @@ -407,7 +407,7 @@ 1500 - false + true Qt::Horizontal @@ -453,7 +453,7 @@ 1500 - false + true Qt::Horizontal diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h index 3f7cc9ed4..a80340726 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h @@ -42,9 +42,12 @@ struct accelGyroBias { }; struct actuatorChannelSettings { - qint16 channelMax; - qint16 channelNeutral; - qint16 channelMin; + quint16 channelMin; + quint16 channelNeutral; + quint16 channelMax; + + //Default values + actuatorChannelSettings(): channelMin(1000), channelNeutral(1080), channelMax(1800) {} }; struct actuatorSettings { From 3a38cb2cc1262658b7bb1f8d1978773c13c44d61 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Fri, 7 Sep 2012 07:35:43 +0200 Subject: [PATCH 23/56] OP-39 Added new button graphix. Implemented servo min/max/neutral calibration. Added check for Actuator module alarm before running calibrarion. --- .../setupwizard/outputcalibrationutil.cpp | 35 +- .../setupwizard/outputcalibrationutil.h | 1 - .../setupwizard/pages/controllerpage.ui | 7 +- .../plugins/setupwizard/pages/flashpage.ui | 13 +- .../setupwizard/pages/levellingpage.cpp | 19 +- .../plugins/setupwizard/pages/levellingpage.h | 1 + .../pages/outputcalibrationpage.cpp | 108 +- .../setupwizard/pages/outputcalibrationpage.h | 7 +- .../pages/outputcalibrationpage.ui | 4 +- .../plugins/setupwizard/pages/summarypage.ui | 28 +- .../plugins/setupwizard/pages/vehiclepage.ui | 9 + .../resources/bttn-illustration-down.png | Bin 0 -> 6683 bytes .../resources/bttn-illustration-up.png | Bin 0 -> 8406 bytes .../setupwizard/resources/bttn-save-down.png | Bin 0 -> 4401 bytes .../setupwizard/resources/bttn-save-up.png | Bin 0 -> 6521 bytes .../resources/multirotor-shapes.svg | 2967 ++++++++++------- .../vehicleconfigurationhelper.cpp | 33 +- .../setupwizard/vehicleconfigurationhelper.h | 2 +- .../plugins/setupwizard/wizardResources.qrc | 4 + 19 files changed, 1903 insertions(+), 1335 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-illustration-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-illustration-up.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-save-down.png create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-save-up.png diff --git a/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.cpp b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.cpp index 83c752d87..ad7e68184 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.cpp @@ -29,6 +29,7 @@ #include "actuatorcommand.h" #include "extensionsystem/pluginmanager.h" #include "vehicleconfigurationhelper.h" +#include "manualcontrolsettings.h" const quint16 OutputCalibrationUtil::UPDATE_CHANNEL_MAPPING[10] = {0, 0, 0, 1, 2, 3, 2, 2, 3, 3}; @@ -50,19 +51,37 @@ void OutputCalibrationUtil::setupOutputRates(const QList &outputRates) //Set actuator settings for channels ActuatorSettings *actuatorSettings = ActuatorSettings::GetInstance(m_uavObjectManager); Q_ASSERT(actuatorSettings); - ActuatorSettings::DataFields data = actuatorSettings->getData(); + ActuatorSettings::DataFields aData = actuatorSettings->getData(); for(int i = 0; i < outputRates.size(); i++) { - data.ChannelType[i] = ActuatorSettings::CHANNELTYPE_PWM; - data.ChannelAddr[i] = i; - data.ChannelMin[i] = 1000; - data.ChannelNeutral[i] = 1000; - data.ChannelMax[i] = 2000; - data.ChannelUpdateFreq[UPDATE_CHANNEL_MAPPING[i]] = outputRates[i]; + aData.ChannelType[i] = ActuatorSettings::CHANNELTYPE_PWM; + aData.ChannelAddr[i] = i; + aData.ChannelMin[i] = 1000; + aData.ChannelNeutral[i] = 1000; + aData.ChannelMax[i] = 2000; + aData.ChannelUpdateFreq[UPDATE_CHANNEL_MAPPING[i]] = outputRates[i]; } - actuatorSettings->setData(data); + actuatorSettings->setData(aData); actuatorSettings->updated(); + + ManualControlSettings *manualControlSettings = ManualControlSettings::GetInstance(m_uavObjectManager); + Q_ASSERT(manualControlSettings); + ManualControlSettings::DataFields cData = manualControlSettings->getData(); + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_THROTTLE] = ManualControlSettings::CHANNELGROUPS_PWM; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_ROLL] = ManualControlSettings::CHANNELGROUPS_PWM; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_YAW] = ManualControlSettings::CHANNELGROUPS_PWM; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_PITCH] = ManualControlSettings::CHANNELGROUPS_PWM; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_FLIGHTMODE] = ManualControlSettings::CHANNELGROUPS_PWM; + + cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_THROTTLE] = 1; + cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_ROLL] = 2; + cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_YAW] = 3; + cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_PITCH] = 4; + cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_FLIGHTMODE] = 5; + + manualControlSettings->setData(cData); + manualControlSettings->updated(); } void OutputCalibrationUtil::startChannelOutput(quint16 channel, quint16 safeValue) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.h b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.h index ae1a77223..38be02cb7 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.h @@ -54,7 +54,6 @@ public slots: private: static const quint16 UPDATE_CHANNEL_MAPPING[10]; - VehicleConfigurationSource *m_configSource; actuatorSettings *m_actuatorSettings; qint16 m_outputChannel; quint16 m_safeValue; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui index 1bb92aabe..f608f43b8 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui @@ -19,7 +19,7 @@ 20 20 550 - 201 + 261 @@ -31,7 +31,10 @@ p, li { white-space: pre-wrap; } <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;"><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;">To continue the wizard needs to know what kind of OpenPilot controller you want to create a configuration for. The wizard will try to automatically detect what type of board you have when connected.</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 connect the board to a free usb port on your computer, or if a serial modem like BlueTooth, PipX or other is used, power up the board and select the device to connect with from the list below. Then press 'Connect'. If the board already is connected and succesfully detected the board type will already be displayed. You can disconnect and select another device if you need to detect another board.</span></p></body></html> +<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 connect the board to a free usb port on your computer, or if a serial modem like BlueTooth, PipX or other is used, power up the board and select the device to connect with from the list below. Then press 'Connect'. If the board already is connected and succesfully detected the board type will already be displayed. You can disconnect and select another device if you need to detect another board.</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;">Important:</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:10pt;">If you need to power your controller with an external power source if not using USB, please disconnect all components like ESC and servos connected to the output ports of the controller.</span></p></body></html> Qt::AutoText diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui index 131d02540..75323607b 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui @@ -46,9 +46,9 @@ p, li { white-space: pre-wrap; } - 200 + 225 250 - 200 + 150 70 @@ -61,6 +61,11 @@ p, li { white-space: pre-wrap; } Save + + + :/setupwizard/resources/bttn-save-up.png + :/setupwizard/resources/bttn-save-down.png:/setupwizard/resources/bttn-save-up.png + 200 @@ -118,6 +123,8 @@ QProgressBar::chunk { - + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp index 1f96a6029..92726b1ae 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -58,6 +58,14 @@ bool LevellingPage::isComplete() const ui->levelButton->isEnabled(); } +void LevellingPage::enableButtons(bool enable) +{ + ui->levelButton->setEnabled(enable); + getWizard()->button(QWizard::NextButton)->setEnabled(enable); + getWizard()->button(QWizard::CancelButton)->setEnabled(enable); + getWizard()->button(QWizard::BackButton)->setEnabled(enable); +} + void LevellingPage::performLevelling() { if(!getWizard()->getConnectionManager()->isConnected()) { @@ -70,11 +78,7 @@ void LevellingPage::performLevelling() return; } - getWizard()->button(QWizard::BackButton)->setEnabled(false); - getWizard()->button(QWizard::NextButton)->setEnabled(false); - getWizard()->button(QWizard::CancelButton)->setEnabled(false); - - ui->levelButton->setEnabled(false); + enableButtons(false); if(!m_levellingUtil) { @@ -124,9 +128,6 @@ void LevellingPage::stopLevelling() disconnect(m_levellingUtil, SIGNAL(progress(long,long)), this, SLOT(levellingProgress(long,long))); disconnect(m_levellingUtil, SIGNAL(done(accelGyroBias)), this, SLOT(levellingDone(accelGyroBias))); disconnect(m_levellingUtil, SIGNAL(timeout(QString)), this, SLOT(levellingTimeout(QString))); - getWizard()->button(QWizard::BackButton)->setEnabled(true); - getWizard()->button(QWizard::NextButton)->setEnabled(true); - getWizard()->button(QWizard::CancelButton)->setEnabled(true); - ui->levelButton->setEnabled(true); + enableButtons(true); } } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h index 447851739..06b18ed75 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.h @@ -59,6 +59,7 @@ private: LevellingUtil *m_levellingUtil; void stopLevelling(); + void enableButtons(bool enable); }; #endif // LEVELLINGPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp index c83b83822..2584cd9c6 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp @@ -27,6 +27,8 @@ #include "outputcalibrationpage.h" #include "ui_outputcalibrationpage.h" +#include "systemalarms.h" +#include "uavobjectmanager.h" OutputCalibrationPage::OutputCalibrationPage(SetupWizard *wizard, QWidget *parent) : AbstractWizardPage(wizard, parent), ui(new Ui::OutputCalibrationPage), m_vehicleBoundsItem(0), @@ -60,6 +62,7 @@ void OutputCalibrationPage::setupVehicle() m_vehicleHighlightElementIndexes.clear(); m_currentWizardIndex = 0; m_vehicleScene->clear(); + m_channelUpdateRates.clear(); quint16 escUpdateRate = getEscUpdateRate(); quint16 servoUpdateRate = getServoUpdateRate(); switch(getWizard()->getVehicleSubType()) @@ -69,6 +72,8 @@ void OutputCalibrationPage::setupVehicle() m_vehicleElementIds << "tri" << "tri-frame" << "tri-m1" << "tri-m2" << "tri-m3" << "tri-s1"; m_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4; m_channelUpdateRates << escUpdateRate << escUpdateRate << escUpdateRate << servoUpdateRate; + m_actuatorSettings.channels[4].channelMin = 1500; + m_actuatorSettings.channels[4].channelMax = 1500; break; case SetupWizard::MULTI_ROTOR_QUAD_X: m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; @@ -91,8 +96,8 @@ void OutputCalibrationPage::setupVehicle() break; case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y: m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; - m_vehicleElementIds << "hexa-y6" << "hexa-y6-frame" << "hexa-y6-m1" << "hexa-y6-m2" << "hexa-y6-m3" << "hexa-y6-m4" - << "hexa-y6-m5" << "hexa-y6-m6"; + 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 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5 << 6 << 6; m_channelUpdateRates << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate; break; @@ -107,6 +112,9 @@ void OutputCalibrationPage::setupVehicle() break; } + VehicleConfigurationHelper helper(getWizard()); + helper.setupVehicle(false); + if(m_calibrationUtil) { delete m_calibrationUtil; m_calibrationUtil = 0; @@ -136,6 +144,7 @@ void OutputCalibrationPage::setupVehicleItems() item->setElementId(m_vehicleElementIds[i]); item->setZValue(i); item->setOpacity(1.0); + QRectF itemBounds = m_vehicleRenderer->boundsOnElement(m_vehicleElementIds[i]); item->setPos(itemBounds.x() - parentBounds.x(), itemBounds.y() - parentBounds.y()); @@ -234,27 +243,57 @@ void OutputCalibrationPage::on_motorNeutralButton_toggled(bool checked) { ui->motorNeutralButton->setText(checked ? tr("Stop") : tr("Start")); quint16 channel = getCurrentChannel(); - onStartButtonToggle(checked, channel, m_actuatorSettings.channels[channel].channelNeutral, 1000,ui->motorNeutralSlider); + onStartButtonToggle(ui->motorNeutralButton, channel, m_actuatorSettings.channels[channel].channelNeutral, 1000, ui->motorNeutralSlider); } -void OutputCalibrationPage::onStartButtonToggle(bool checked, quint16 channel, quint16 &value, quint16 safeValue, QSlider *slider) { - if(checked) { - enableButtons(false); - m_calibrationUtil->startChannelOutput(channel, safeValue); - slider->setValue(value); - m_calibrationUtil->setChannelOutputValue(slider->value()); +void OutputCalibrationPage::onStartButtonToggle(QAbstractButton *button, quint16 channel, quint16 value, quint16 safeValue, QSlider *slider) { + if(button->isChecked()) { + if(checkAlarms()) { + enableButtons(false); + m_calibrationUtil->startChannelOutput(channel, safeValue); + slider->setValue(value); + //m_calibrationUtil->setChannelOutputValue(value); + } + else { + button->setChecked(false); + } } else { - value = slider->value(); m_calibrationUtil->stopChannelOutput(); enableButtons(true); } } +bool OutputCalibrationPage::checkAlarms() +{ + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *uavObjectManager = pm->getObject(); + Q_ASSERT(uavObjectManager); + SystemAlarms * systemAlarmsObj = SystemAlarms::GetInstance(uavObjectManager); + SystemAlarms::DataFields systemAlarms = systemAlarmsObj->getData(); + + if(systemAlarms.Alarm[SystemAlarms::ALARM_ACTUATOR] != SystemAlarms::ALARM_OK) { + QMessageBox mbox; + mbox.setText(QString(tr("The actuator module is in an error state.\n\n" + "This error can be caused by not having the board correctly connected or\n" + "if the board is not sufficiently powered by an external power source like\n" + "a battery. To use only USB as power source is not enough when the USB can't\n" + "power external components like ESCs and servos.\n\n" + "Please fix the error before continuing calibration."))); + mbox.setStandardButtons(QMessageBox::Ok); + mbox.setIcon(QMessageBox::Critical); + mbox.exec(); + return false; + } + return true; +} + void OutputCalibrationPage::on_motorNeutralSlider_valueChanged(int value) { if(ui->motorNeutralButton->isChecked()) { - m_calibrationUtil->setChannelOutputValue(ui->motorNeutralSlider->value()); + quint16 value = ui->motorNeutralSlider->value(); + m_calibrationUtil->setChannelOutputValue(value); + m_actuatorSettings.channels[getCurrentChannel()].channelNeutral = value; } } @@ -262,42 +301,73 @@ void OutputCalibrationPage::on_motorMaxButton_toggled(bool checked) { ui->motorNeutralButton->setText(checked ? tr("Stop") : tr("Start")); quint16 channel = getCurrentChannel(); - onStartButtonToggle(checked, channel, m_actuatorSettings.channels[channel].channelMax, 1000, ui->motorMaxSlider); + onStartButtonToggle(ui->motorMaxButton, channel, m_actuatorSettings.channels[channel].channelMax, 1000, ui->motorMaxSlider); } void OutputCalibrationPage::on_motorMaxSlider_valueChanged(int position) { if(ui->motorMaxButton->isChecked()) { - m_calibrationUtil->setChannelOutputValue(ui->motorMaxSlider->value()); + quint16 value = ui->motorMaxSlider->value(); + m_calibrationUtil->setChannelOutputValue(value); + m_actuatorSettings.channels[getCurrentChannel()].channelMax = value; } } void OutputCalibrationPage::on_servoCenterButton_toggled(bool checked) { - ui->motorNeutralButton->setText(checked ? tr("Stop") : tr("Start")); + ui->servoCenterButton->setText(checked ? tr("Stop") : tr("Start")); quint16 channel = getCurrentChannel(); m_actuatorSettings.channels[channel].channelNeutral = 1500; - onStartButtonToggle(checked, channel, m_actuatorSettings.channels[channel].channelNeutral, 1500, ui->servoCenterSlider); + onStartButtonToggle(ui->servoCenterButton, channel, m_actuatorSettings.channels[channel].channelNeutral, 1500, ui->servoCenterSlider); } void OutputCalibrationPage::on_servoCenterSlider_valueChanged(int position) { if(ui->servoCenterButton->isChecked()) { - m_calibrationUtil->setChannelOutputValue(ui->servoCenterSlider->value()); + quint16 value = ui->servoCenterSlider->value(); + m_calibrationUtil->setChannelOutputValue(value); + m_actuatorSettings.channels[getCurrentChannel()].channelNeutral = value; } } void OutputCalibrationPage::on_servoAngleButton_toggled(bool checked) { - + ui->servoAngleButton->setText(checked ? tr("Stop") : tr("Start")); + quint16 channel = getCurrentChannel(); + ui->servoMinAngleSlider->setValue(m_actuatorSettings.channels[channel].channelMax); + onStartButtonToggle(ui->servoAngleButton, channel, m_actuatorSettings.channels[channel].channelMin, 1500, ui->servoMinAngleSlider); } void OutputCalibrationPage::on_servoMaxAngleSlider_valueChanged(int position) { - + if(ui->servoAngleButton->isChecked()) { + quint16 value = ui->servoMaxAngleSlider->value(); + m_calibrationUtil->setChannelOutputValue(value); + m_actuatorSettings.channels[getCurrentChannel()].channelMax = value; + } } void OutputCalibrationPage::on_servoMinAngleSlider_valueChanged(int position) { - + if(ui->servoAngleButton->isChecked()) { + quint16 value = ui->servoMinAngleSlider->value(); + m_calibrationUtil->setChannelOutputValue(value); + m_actuatorSettings.channels[getCurrentChannel()].channelMin = value; + } +} + +void OutputCalibrationPage::on_servoMaxAngleSliderRB_toggled(bool checked) +{ + if(ui->servoAngleButton->isChecked() && ui->servoMaxAngleSliderRB->isChecked()) + { + m_calibrationUtil->setChannelOutputValue(ui->servoMaxAngleSlider->value()); + } +} + +void OutputCalibrationPage::on_servoMinAngleSliderRB_toggled(bool checked) +{ + if(ui->servoAngleButton->isChecked() && ui->servoMinAngleSliderRB->isChecked()) + { + m_calibrationUtil->setChannelOutputValue(ui->servoMinAngleSlider->value()); + } } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h index 855c66b1c..65cddb977 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h @@ -67,6 +67,10 @@ private slots: void on_servoMaxAngleSlider_valueChanged(int position); void on_servoMinAngleSlider_valueChanged(int position); + void on_servoMaxAngleSliderRB_toggled(bool checked); + + void on_servoMinAngleSliderRB_toggled(bool checked); + private: void setupVehicle(); void startWizard(); @@ -74,7 +78,8 @@ private: void setupVehicleHighlightedPart(); void setWizardPage(); void enableButtons(bool enable); - void onStartButtonToggle(bool checked, quint16 channel, quint16 &value, quint16 safeValue, QSlider *slider); + void onStartButtonToggle(QAbstractButton *button, quint16 channel, quint16 value, quint16 safeValue, QSlider *slider); + bool checkAlarms(); quint16 getCurrentChannel(); quint16 getEscUpdateRate(){ return getWizard()->getESCType() == VehicleConfigurationSource::ESC_RAPID ? diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui index 74448ab07..f4f6e9e83 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui @@ -36,7 +36,7 @@ - 0 + 1 @@ -49,7 +49,7 @@ - <html><head/><body><p><span style=" font-size:10pt;">It is now time to calibrate the output levels for the signal controlling your vehichle. </span></p><p><span style=" font-size:10pt;">Depending on what vehichle you have selected, both motors controlled by ESC and servos controlled directly by the OpenPilot controller may have to be calibrated. <br/>The following steps will guide you safely through this process.<br/></span></p><p align="center"><span style=" font-size:14pt; font-weight:600; color:#ff0000;">VERY IMPORTANT!</span></p><p align="center"><br/><span style=" font-size:12pt; font-weight:600; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICHLE BEFORE PROCEEDING!</span></p></body></html> + <html><head/><body><p><span style=" font-size:10pt;">It is now time to calibrate the output levels for the signals controlling your vehichle. </span></p><p align="center"><span style=" font-size:10pt; font-weight:600; color:#ff0000;">VERY IMPORTANT!</span><span style=" font-size:10pt;"><br/></span><span style=" font-size:10pt; font-weight:600; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICHLE BEFORE PROCEEDING!</span></p><p><span style=" font-size:10pt; color:#000000;">Connect all components according to the illustration on the previous page and provide power using an external power supply like a battery to continue.</span></p><p><span style=" font-size:10pt;">Depending on what vehichle you have selected, both motors controlled by ESC and servos controlled directly by the OpenPilot controller may have to be calibrated. <br/>The following steps will guide you safely through this process.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui index 47cc2dbeb..9c054dcd1 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui @@ -43,7 +43,7 @@ p, li { white-space: pre-wrap; } true - + 460 @@ -55,10 +55,22 @@ p, li { white-space: pre-wrap; } Show connection diagram for configuration + + QToolButton { border: none } + - Hardware -Configuration -Illustration + + + + + :/setupwizard/resources/bttn-illustration-up.png + :/setupwizard/resources/bttn-illustration-down.png:/setupwizard/resources/bttn-illustration-up.png + + + + 100 + 100 + false @@ -69,8 +81,8 @@ Illustration true - - false + + Qt::ToolButtonIconOnly @@ -98,6 +110,8 @@ Illustration - + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui index 864e62194..a7b612f4b 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui @@ -41,6 +41,9 @@ p, li { white-space: pre-wrap; } + + false + 430 @@ -141,6 +144,9 @@ p, li { white-space: pre-wrap; } + + false + 190 @@ -191,6 +197,9 @@ p, li { white-space: pre-wrap; } + + false + 310 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-illustration-down.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-illustration-down.png new file mode 100644 index 0000000000000000000000000000000000000000..a4402d5b029d27f465bd03949de874d7dadc0b89 GIT binary patch literal 6683 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 w@?gks7^;zO1IptV82|tP literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-illustration-up.png b/ground/openpilotgcs/src/plugins/setupwizard/resources/bttn-illustration-up.png new file mode 100644 index 0000000000000000000000000000000000000000..5013d30b2a74b35f9eb54961ae0c5133c46a67d1 GIT binary patch literal 8406 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 \ No newline at end of file + id="g10143" + transform="matrix(1,0,0,-1,0,2688.54)" + style="display:inline" /> \ No newline at end of file diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp index 024960bb7..875278016 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -49,15 +49,17 @@ VehicleConfigurationHelper::VehicleConfigurationHelper(VehicleConfigurationSourc Q_ASSERT(m_uavoManager); } -bool VehicleConfigurationHelper::setupVehicle() +bool VehicleConfigurationHelper::setupVehicle(bool save) { m_progress = 0; - clearModifiedObjects(); - resetVehicleConfig(); - resetGUIData(); - if(!saveChangesToController()) - { - return false; + if(save) { + clearModifiedObjects(); + resetVehicleConfig(); + resetGUIData(); + if(!saveChangesToController()) + { + return false; + } } applyHardwareConfiguration(); @@ -67,14 +69,17 @@ bool VehicleConfigurationHelper::setupVehicle() applyLevellingConfiguration(); applyStabilizationConfiguration(); - bool result = saveChangesToController(); - if(result) { - emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Done!")); + if(save) { + bool result = saveChangesToController(); + if(result) { + emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Done!")); + } + else { + emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Failed!")); + } + return result; } - else { - emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Failed!")); - } - return result; + return true; } void VehicleConfigurationHelper::addModifiedObject(UAVDataObject *object, QString description) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h index d4dde1ccb..f3065ed42 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h @@ -60,7 +60,7 @@ class VehicleConfigurationHelper : public QObject public: VehicleConfigurationHelper(VehicleConfigurationSource* configSource); - bool setupVehicle(); + bool setupVehicle(bool save = true); static const qint16 LEGACY_ESC_FREQUENCE; static const qint16 RAPID_ESC_FREQUENCE; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc b/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc index fef744911..342af58e5 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc +++ b/ground/openpilotgcs/src/plugins/setupwizard/wizardResources.qrc @@ -30,5 +30,9 @@ resources/bttn-turbo-down.png resources/bttn-turbo-up.png resources/multirotor-shapes.svg + resources/bttn-illustration-down.png + resources/bttn-illustration-up.png + resources/bttn-save-down.png + resources/bttn-save-up.png From d337fcf1d8663475e54fbd2681e80740e917cc28 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sun, 9 Sep 2012 23:44:42 +0200 Subject: [PATCH 24/56] OP-39 Finished up motor/servo calibration, actuator settings. Bug fixes after initial testing end2end testing. I am making a note here: First successful 1-2-Fly! session ever! --- .../setupwizard/outputcalibrationutil.cpp | 40 --- .../setupwizard/outputcalibrationutil.h | 3 - .../setupwizard/pages/levellingpage.cpp | 1 + .../pages/outputcalibrationpage.cpp | 147 ++++----- .../setupwizard/pages/outputcalibrationpage.h | 18 +- .../pages/outputcalibrationpage.ui | 306 +++++++++--------- .../src/plugins/setupwizard/setupwizard.cpp | 5 + .../src/plugins/setupwizard/setupwizard.h | 6 +- .../vehicleconfigurationhelper.cpp | 97 +++--- .../setupwizard/vehicleconfigurationhelper.h | 10 +- .../setupwizard/vehicleconfigurationsource.h | 5 +- 11 files changed, 299 insertions(+), 339 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.cpp b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.cpp index ad7e68184..5a52dab65 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.cpp @@ -31,8 +31,6 @@ #include "vehicleconfigurationhelper.h" #include "manualcontrolsettings.h" -const quint16 OutputCalibrationUtil::UPDATE_CHANNEL_MAPPING[10] = {0, 0, 0, 1, 2, 3, 2, 2, 3, 3}; - OutputCalibrationUtil::OutputCalibrationUtil(QObject *parent) : QObject(parent), m_outputChannel(-1), m_safeValue(1000) { @@ -46,44 +44,6 @@ OutputCalibrationUtil::~OutputCalibrationUtil() stopChannelOutput(); } -void OutputCalibrationUtil::setupOutputRates(const QList &outputRates) -{ - //Set actuator settings for channels - ActuatorSettings *actuatorSettings = ActuatorSettings::GetInstance(m_uavObjectManager); - Q_ASSERT(actuatorSettings); - ActuatorSettings::DataFields aData = actuatorSettings->getData(); - - for(int i = 0; i < outputRates.size(); i++) { - aData.ChannelType[i] = ActuatorSettings::CHANNELTYPE_PWM; - aData.ChannelAddr[i] = i; - aData.ChannelMin[i] = 1000; - aData.ChannelNeutral[i] = 1000; - aData.ChannelMax[i] = 2000; - aData.ChannelUpdateFreq[UPDATE_CHANNEL_MAPPING[i]] = outputRates[i]; - } - - actuatorSettings->setData(aData); - actuatorSettings->updated(); - - ManualControlSettings *manualControlSettings = ManualControlSettings::GetInstance(m_uavObjectManager); - Q_ASSERT(manualControlSettings); - ManualControlSettings::DataFields cData = manualControlSettings->getData(); - cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_THROTTLE] = ManualControlSettings::CHANNELGROUPS_PWM; - cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_ROLL] = ManualControlSettings::CHANNELGROUPS_PWM; - cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_YAW] = ManualControlSettings::CHANNELGROUPS_PWM; - cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_PITCH] = ManualControlSettings::CHANNELGROUPS_PWM; - cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_FLIGHTMODE] = ManualControlSettings::CHANNELGROUPS_PWM; - - cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_THROTTLE] = 1; - cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_ROLL] = 2; - cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_YAW] = 3; - cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_PITCH] = 4; - cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_FLIGHTMODE] = 5; - - manualControlSettings->setData(cData); - manualControlSettings->updated(); -} - void OutputCalibrationUtil::startChannelOutput(quint16 channel, quint16 safeValue) { if(m_outputChannel < 0 && channel >= 0 && channel < ActuatorCommand::CHANNEL_NUMELEM) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.h b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.h index 38be02cb7..dc9fc7fc8 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/outputcalibrationutil.h @@ -46,15 +46,12 @@ public: signals: public slots: - void setupOutputRates(const QList &outputRates); void startChannelOutput(quint16 channel, quint16 safeValue); void stopChannelOutput(); void setChannelOutputValue(quint16 value); private: - static const quint16 UPDATE_CHANNEL_MAPPING[10]; - actuatorSettings *m_actuatorSettings; qint16 m_outputChannel; quint16 m_safeValue; UAVObject::Metadata m_savedActuatorCommandMetadata; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp index 92726b1ae..1384865a6 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -64,6 +64,7 @@ void LevellingPage::enableButtons(bool enable) getWizard()->button(QWizard::NextButton)->setEnabled(enable); getWizard()->button(QWizard::CancelButton)->setEnabled(enable); getWizard()->button(QWizard::BackButton)->setEnabled(enable); + QApplication::processEvents(); } void LevellingPage::performLevelling() diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp index 2584cd9c6..a6389cb84 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp @@ -57,57 +57,53 @@ OutputCalibrationPage::~OutputCalibrationPage() void OutputCalibrationPage::setupVehicle() { + m_actuatorSettings = getWizard()->getActuatorSettings(); m_wizardIndexes.clear(); m_vehicleElementIds.clear(); m_vehicleHighlightElementIndexes.clear(); + m_channelIndex.clear(); m_currentWizardIndex = 0; m_vehicleScene->clear(); - m_channelUpdateRates.clear(); - quint16 escUpdateRate = getEscUpdateRate(); - quint16 servoUpdateRate = getServoUpdateRate(); switch(getWizard()->getVehicleSubType()) { case SetupWizard::MULTI_ROTOR_TRI_Y: - m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 3 << 4; + m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 3 << 4 << 5; m_vehicleElementIds << "tri" << "tri-frame" << "tri-m1" << "tri-m2" << "tri-m3" << "tri-s1"; - m_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4; - m_channelUpdateRates << escUpdateRate << escUpdateRate << escUpdateRate << servoUpdateRate; - m_actuatorSettings.channels[4].channelMin = 1500; - m_actuatorSettings.channels[4].channelMax = 1500; + m_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 4; + m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 3; + m_actuatorSettings[4].channelMin = 1500; + m_actuatorSettings[4].channelMax = 1500; break; case SetupWizard::MULTI_ROTOR_QUAD_X: m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; m_vehicleElementIds << "quad-x" << "quad-x-frame" << "quad-x-m1" << "quad-x-m2" << "quad-x-m3" << "quad-x-m4"; m_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4; - m_channelUpdateRates << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate; + m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3; break; case SetupWizard::MULTI_ROTOR_QUAD_PLUS: m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; m_vehicleElementIds << "quad-p" << "quad-p-frame" << "quad-p-m1" << "quad-p-m2" << "quad-p-m3" << "quad-p-m4"; m_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4; - m_channelUpdateRates << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate; + m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3; break; case SetupWizard::MULTI_ROTOR_HEXA: m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; - 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 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5 << 6 << 6; - m_channelUpdateRates << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate; + m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5; break; case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y: m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; - 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 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5 << 6 << 6; - m_channelUpdateRates << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate; + 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 << 2 << 1 << 1 << 4 << 4 << 3 << 3 << 6 << 6 << 5 << 5; + m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5; break; case SetupWizard::MULTI_ROTOR_HEXA_H: m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; - 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 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5 << 6 << 6; - m_channelUpdateRates << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate << escUpdateRate; - break; + m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5; + break; default: break; } @@ -120,7 +116,6 @@ void OutputCalibrationPage::setupVehicle() m_calibrationUtil = 0; } m_calibrationUtil = new OutputCalibrationUtil(); - m_calibrationUtil->setupOutputRates(m_channelUpdateRates); setupVehicleItems(); } @@ -172,28 +167,38 @@ void OutputCalibrationPage::setupVehicleHighlightedPart() void OutputCalibrationPage::setWizardPage() { + qDebug() << "Wizard index: " << m_currentWizardIndex; m_calibrationUtil->stopChannelOutput(); ui->backPageButton->setEnabled(m_currentWizardIndex > 0); ui->nextPageButton->setEnabled(m_currentWizardIndex < m_wizardIndexes.size() - 1); - int currentPageIndex = m_wizardIndexes.at(m_currentWizardIndex); + + QApplication::processEvents(); + + int currentPageIndex = m_wizardIndexes[m_currentWizardIndex]; + qDebug() << "Current page: " << currentPageIndex; ui->calibrationStack->setCurrentIndex(currentPageIndex); + int currentChannel = getCurrentChannel(); + qDebug() << "Current channel: " << currentChannel; if(currentChannel >= 0) { if(currentPageIndex == 1) { - ui->motorNeutralSlider->setValue(m_actuatorSettings.channels[currentChannel].channelNeutral); + ui->motorNeutralSlider->setValue(m_actuatorSettings[currentChannel].channelNeutral); } else if (currentPageIndex == 2) { - ui->motorMaxSlider->setValue(m_actuatorSettings.channels[currentChannel].channelMax); + ui->motorMaxSlider->setValue(m_actuatorSettings[currentChannel].channelMax); } else if(currentPageIndex == 3) { - ui->servoCenterSlider->setValue(m_actuatorSettings.channels[currentChannel].channelNeutral); + ui->servoCenterSlider->setValue(m_actuatorSettings[currentChannel].channelNeutral); } else if(currentPageIndex == 4) { - ui->servoMinAngleSlider->setValue(m_actuatorSettings.channels[currentChannel].channelMin); - ui->servoMaxAngleSlider->setValue(m_actuatorSettings.channels[currentChannel].channelMax); + ui->servoMinAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMin); + } + else if(currentPageIndex == 5) { + ui->servoMaxAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMax); } } setupVehicleHighlightedPart(); + QApplication::processEvents(); } void OutputCalibrationPage::initializePage() @@ -204,6 +209,12 @@ void OutputCalibrationPage::initializePage() } } +bool OutputCalibrationPage::validatePage() +{ + getWizard()->setActuatorSettings(m_actuatorSettings); + return true; +} + void OutputCalibrationPage::showEvent(QShowEvent *event) { Q_UNUSED(event); @@ -215,19 +226,23 @@ void OutputCalibrationPage::showEvent(QShowEvent *event) void OutputCalibrationPage::on_nextPageButton_clicked() { - m_currentWizardIndex++; - setWizardPage(); + if(m_currentWizardIndex < m_wizardIndexes.size() - 1) { + m_currentWizardIndex++; + setWizardPage(); + } } void OutputCalibrationPage::on_backPageButton_clicked() { - m_currentWizardIndex--; - setWizardPage(); + if(m_currentWizardIndex > 0) { + m_currentWizardIndex--; + setWizardPage(); + } } quint16 OutputCalibrationPage::getCurrentChannel() { - return m_vehicleHighlightElementIndexes[m_currentWizardIndex] - 1; + return m_channelIndex[m_currentWizardIndex]; } void OutputCalibrationPage::enableButtons(bool enable) @@ -237,13 +252,14 @@ void OutputCalibrationPage::enableButtons(bool enable) getWizard()->button(QWizard::NextButton)->setEnabled(enable); getWizard()->button(QWizard::CancelButton)->setEnabled(enable); getWizard()->button(QWizard::BackButton)->setEnabled(enable); + QApplication::processEvents(); } void OutputCalibrationPage::on_motorNeutralButton_toggled(bool checked) { ui->motorNeutralButton->setText(checked ? tr("Stop") : tr("Start")); quint16 channel = getCurrentChannel(); - onStartButtonToggle(ui->motorNeutralButton, channel, m_actuatorSettings.channels[channel].channelNeutral, 1000, ui->motorNeutralSlider); + onStartButtonToggle(ui->motorNeutralButton, channel, m_actuatorSettings[channel].channelNeutral, 1000, ui->motorNeutralSlider); } void OutputCalibrationPage::onStartButtonToggle(QAbstractButton *button, quint16 channel, quint16 value, quint16 safeValue, QSlider *slider) { @@ -252,7 +268,7 @@ void OutputCalibrationPage::onStartButtonToggle(QAbstractButton *button, quint16 enableButtons(false); m_calibrationUtil->startChannelOutput(channel, safeValue); slider->setValue(value); - //m_calibrationUtil->setChannelOutputValue(value); + m_calibrationUtil->setChannelOutputValue(value); } else { button->setChecked(false); @@ -269,10 +285,11 @@ bool OutputCalibrationPage::checkAlarms() ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); UAVObjectManager *uavObjectManager = pm->getObject(); Q_ASSERT(uavObjectManager); - SystemAlarms * systemAlarmsObj = SystemAlarms::GetInstance(uavObjectManager); - SystemAlarms::DataFields systemAlarms = systemAlarmsObj->getData(); + SystemAlarms * systemAlarms = SystemAlarms::GetInstance(uavObjectManager); + Q_ASSERT(systemAlarms); + SystemAlarms::DataFields data = systemAlarms->getData(); - if(systemAlarms.Alarm[SystemAlarms::ALARM_ACTUATOR] != SystemAlarms::ALARM_OK) { + if(data.Alarm[SystemAlarms::ALARM_ACTUATOR] != SystemAlarms::ALARM_OK) { QMessageBox mbox; mbox.setText(QString(tr("The actuator module is in an error state.\n\n" "This error can be caused by not having the board correctly connected or\n" @@ -293,7 +310,7 @@ void OutputCalibrationPage::on_motorNeutralSlider_valueChanged(int value) if(ui->motorNeutralButton->isChecked()) { quint16 value = ui->motorNeutralSlider->value(); m_calibrationUtil->setChannelOutputValue(value); - m_actuatorSettings.channels[getCurrentChannel()].channelNeutral = value; + m_actuatorSettings[getCurrentChannel()].channelNeutral = value; } } @@ -301,7 +318,7 @@ void OutputCalibrationPage::on_motorMaxButton_toggled(bool checked) { ui->motorNeutralButton->setText(checked ? tr("Stop") : tr("Start")); quint16 channel = getCurrentChannel(); - onStartButtonToggle(ui->motorMaxButton, channel, m_actuatorSettings.channels[channel].channelMax, 1000, ui->motorMaxSlider); + onStartButtonToggle(ui->motorMaxButton, channel, m_actuatorSettings[channel].channelMax, 1000, ui->motorMaxSlider); } void OutputCalibrationPage::on_motorMaxSlider_valueChanged(int position) @@ -309,7 +326,7 @@ void OutputCalibrationPage::on_motorMaxSlider_valueChanged(int position) if(ui->motorMaxButton->isChecked()) { quint16 value = ui->motorMaxSlider->value(); m_calibrationUtil->setChannelOutputValue(value); - m_actuatorSettings.channels[getCurrentChannel()].channelMax = value; + m_actuatorSettings[getCurrentChannel()].channelMax = value; } } @@ -317,8 +334,8 @@ void OutputCalibrationPage::on_servoCenterButton_toggled(bool checked) { ui->servoCenterButton->setText(checked ? tr("Stop") : tr("Start")); quint16 channel = getCurrentChannel(); - m_actuatorSettings.channels[channel].channelNeutral = 1500; - onStartButtonToggle(ui->servoCenterButton, channel, m_actuatorSettings.channels[channel].channelNeutral, 1500, ui->servoCenterSlider); + m_actuatorSettings[channel].channelNeutral = 1500; + onStartButtonToggle(ui->servoCenterButton, channel, m_actuatorSettings[channel].channelNeutral, 1500, ui->servoCenterSlider); } void OutputCalibrationPage::on_servoCenterSlider_valueChanged(int position) @@ -326,48 +343,34 @@ void OutputCalibrationPage::on_servoCenterSlider_valueChanged(int position) if(ui->servoCenterButton->isChecked()) { quint16 value = ui->servoCenterSlider->value(); m_calibrationUtil->setChannelOutputValue(value); - m_actuatorSettings.channels[getCurrentChannel()].channelNeutral = value; + m_actuatorSettings[getCurrentChannel()].channelNeutral = value; } } -void OutputCalibrationPage::on_servoAngleButton_toggled(bool checked) +void OutputCalibrationPage::on_servoMinAngleButton_toggled(bool checked) { - ui->servoAngleButton->setText(checked ? tr("Stop") : tr("Start")); + ui->servoMinAngleButton->setText(checked ? tr("Stop") : tr("Start")); quint16 channel = getCurrentChannel(); - ui->servoMinAngleSlider->setValue(m_actuatorSettings.channels[channel].channelMax); - onStartButtonToggle(ui->servoAngleButton, channel, m_actuatorSettings.channels[channel].channelMin, 1500, ui->servoMinAngleSlider); -} - -void OutputCalibrationPage::on_servoMaxAngleSlider_valueChanged(int position) -{ - if(ui->servoAngleButton->isChecked()) { - quint16 value = ui->servoMaxAngleSlider->value(); - m_calibrationUtil->setChannelOutputValue(value); - m_actuatorSettings.channels[getCurrentChannel()].channelMax = value; - } + onStartButtonToggle(ui->servoMinAngleButton, channel, m_actuatorSettings[channel].channelMin, 1500, ui->servoMinAngleSlider); } void OutputCalibrationPage::on_servoMinAngleSlider_valueChanged(int position) { - if(ui->servoAngleButton->isChecked()) { - quint16 value = ui->servoMinAngleSlider->value(); - m_calibrationUtil->setChannelOutputValue(value); - m_actuatorSettings.channels[getCurrentChannel()].channelMin = value; - } + quint16 value = ui->servoMinAngleSlider->value(); + m_calibrationUtil->setChannelOutputValue(value); + m_actuatorSettings[getCurrentChannel()].channelMin = value; } -void OutputCalibrationPage::on_servoMaxAngleSliderRB_toggled(bool checked) +void OutputCalibrationPage::on_servoMaxAngleButton_toggled(bool checked) { - if(ui->servoAngleButton->isChecked() && ui->servoMaxAngleSliderRB->isChecked()) - { - m_calibrationUtil->setChannelOutputValue(ui->servoMaxAngleSlider->value()); - } + ui->servoMaxAngleButton->setText(checked ? tr("Stop") : tr("Start")); + quint16 channel = getCurrentChannel(); + onStartButtonToggle(ui->servoMaxAngleButton, channel, m_actuatorSettings[channel].channelMax, 1500, ui->servoMaxAngleSlider); } -void OutputCalibrationPage::on_servoMinAngleSliderRB_toggled(bool checked) +void OutputCalibrationPage::on_servoMaxAngleSlider_valueChanged(int position) { - if(ui->servoAngleButton->isChecked() && ui->servoMinAngleSliderRB->isChecked()) - { - m_calibrationUtil->setChannelOutputValue(ui->servoMinAngleSlider->value()); - } + quint16 value = ui->servoMaxAngleSlider->value(); + m_calibrationUtil->setChannelOutputValue(value); + m_actuatorSettings[getCurrentChannel()].channelMax = value; } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h index 65cddb977..c67bff74b 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h @@ -46,6 +46,7 @@ public: explicit OutputCalibrationPage(SetupWizard *wizard, QWidget *parent = 0); ~OutputCalibrationPage(); void initializePage(); + bool validatePage(); protected: void showEvent(QShowEvent *event); @@ -63,13 +64,11 @@ private slots: void on_servoCenterButton_toggled(bool checked); void on_servoCenterSlider_valueChanged(int position); - void on_servoAngleButton_toggled(bool checked); - void on_servoMaxAngleSlider_valueChanged(int position); + void on_servoMinAngleButton_toggled(bool checked); void on_servoMinAngleSlider_valueChanged(int position); - void on_servoMaxAngleSliderRB_toggled(bool checked); - - void on_servoMinAngleSliderRB_toggled(bool checked); + void on_servoMaxAngleButton_toggled(bool checked); + void on_servoMaxAngleSlider_valueChanged(int position); private: void setupVehicle(); @@ -82,11 +81,6 @@ private: bool checkAlarms(); quint16 getCurrentChannel(); - quint16 getEscUpdateRate(){ return getWizard()->getESCType() == VehicleConfigurationSource::ESC_RAPID ? - VehicleConfigurationHelper::RAPID_ESC_FREQUENCE : VehicleConfigurationHelper::LEGACY_ESC_FREQUENCE; } - - quint16 getServoUpdateRate(){ return VehicleConfigurationHelper::LEGACY_ESC_FREQUENCE; } - Ui::OutputCalibrationPage *ui; QSvgRenderer *m_vehicleRenderer; QGraphicsScene *m_vehicleScene; @@ -97,10 +91,10 @@ private: QList m_vehicleElementIds; QList m_vehicleItems; QList m_vehicleHighlightElementIndexes; + QList m_channelIndex; QList m_wizardIndexes; - QList m_channelUpdateRates; - actuatorSettings m_actuatorSettings; + QList m_actuatorSettings; OutputCalibrationUtil *m_calibrationUtil; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui index f4f6e9e83..f3c0652e2 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui @@ -36,7 +36,7 @@ - 1 + 5 @@ -306,7 +306,7 @@ - + 90 @@ -335,7 +335,7 @@ - <html><head/><body><p>To save the servo and other hardware from damage we have to set the max and min angles for the servo. </p><p>To set the extreme angles for the servo, press the Start button below and select the top slider and slide it to the right until max angle is reached. Then select the lower slider and slide it left until the minimum angle is set.</p><p>When done press button again to stop.</p></body></html> + <html><head/><body><p>To save the servo and other hardware from damage we have to set the max and min angles for the servo. </p><p>To set the minimum angle for the servo, press the Start button below and select the top slider and slide it to the left until min angle is reached.</p><p>When done press button again to stop.</p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -344,133 +344,137 @@ true - + + + false + + + + 10 + 200 + 241 + 20 + + + + 1000 + + + 1500 + + + 10 + + + 20 + + + 1500 + + + true + + + Qt::Horizontal + + + false + + + false + + + QSlider::TicksBelow + + + 40 + + + + + + + + 90 + 240 + 75 + 23 + + + + Start + + + true + + + false + + + + + false + + + + 10 + 200 + 241 + 20 + + + + 1500 + + + 2000 + + + 10 + + + 20 + + + 1500 + + + true + + + Qt::Horizontal + + + false + + + false + + + QSlider::TicksBelow + + + 40 + + + 0 - 160 + 10 261 - 80 + 151 - - - - 10 - 40 - 16 - 17 - - - - - - - - - - 10 - 0 - 16 - 17 - - - - - - - true - - - - - - 39 - 0 - 211 - 20 - - - - 1500 - - - 2000 - - - 10 - - - 20 - - - 1500 - - - true - - - Qt::Horizontal - - - false - - - false - - - QSlider::TicksBelow - - - 40 - - - - - false - - - - 39 - 40 - 211 - 20 - - - - 1000 - - - 1500 - - - 10 - - - 20 - - - 1500 - - - true - - - Qt::Horizontal - - - false - - - false - - - QSlider::TicksBelow - - - 40 - - + + <html><head/><body><p>To set the maximum angle for the servo, press the Start button below and select the top slider and slide it to the right until max angle is reached.</p><p>When done press button again to stop.</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + @@ -529,38 +533,6 @@ - - servoMaxAngleSliderRB - toggled(bool) - servoMaxAngleSlider - setEnabled(bool) - - - 37 - 208 - - - 164 - 209 - - - - - servoMinAngleSliderRB - toggled(bool) - servoMinAngleSlider - setEnabled(bool) - - - 37 - 248 - - - 164 - 249 - - - motorNeutralButton toggled(bool) @@ -610,9 +582,9 @@ - servoAngleButton + servoMaxAngleButton toggled(bool) - sliderWidget + servoMaxAngleSlider setEnabled(bool) @@ -621,7 +593,23 @@ 150 - 239 + 249 + + + + + servoMinAngleButton + toggled(bool) + servoMinAngleSlider + setEnabled(bool) + + + 147 + 291 + + + 150 + 249 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index ff304322c..a74c026f2 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -43,6 +43,7 @@ #include "pages/notyetimplementedpage.h" #include "extensionsystem/pluginmanager.h" #include "vehicleconfigurationhelper.h" +#include "actuatorsettings.h" SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), VehicleConfigurationSource(), m_controllerType(CONTROLLER_UNKNOWN), @@ -52,6 +53,10 @@ SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), VehicleConfiguratio setWindowTitle(tr("OpenPilot Setup Wizard")); setOption(QWizard::IndependentPages, false); setFixedSize(640, 530); + for(int i = 0; i < ActuatorSettings::CHANNELMAX_NUMELEM; i++) + { + m_actuatorSettings << actuatorChannelSettings(); + } createPages(); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h index 571beb6c6..ae57e613c 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h @@ -63,9 +63,9 @@ public: bool isLevellingPerformed() const { return m_levellingPerformed; } accelGyroBias getLevellingBias() const { return m_levellingBias; } - void setActuatorSettings(actuatorSettings neutralSettings) { m_actuatorNeutralConfig = neutralSettings; } + void setActuatorSettings(QList actuatorSettings) { m_actuatorSettings = actuatorSettings; } bool isMotorCalibrationPerformed() const { return m_motorCalibrationPerformed; } - actuatorSettings getActuatorSettings() const { return m_actuatorNeutralConfig; } + QList getActuatorSettings() const { return m_actuatorSettings; } QString getSummaryText(); @@ -93,7 +93,7 @@ private: accelGyroBias m_levellingBias; bool m_motorCalibrationPerformed; - actuatorSettings m_actuatorNeutralConfig; + QList m_actuatorSettings; Core::ConnectionManager *m_connectionManager; }; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp index 875278016..42b0de356 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -52,14 +52,12 @@ VehicleConfigurationHelper::VehicleConfigurationHelper(VehicleConfigurationSourc bool VehicleConfigurationHelper::setupVehicle(bool save) { m_progress = 0; - if(save) { - clearModifiedObjects(); - resetVehicleConfig(); - resetGUIData(); - if(!saveChangesToController()) - { - return false; - } + clearModifiedObjects(); + resetVehicleConfig(); + resetGUIData(); + if(!saveChangesToController(save)) + { + return false; } applyHardwareConfiguration(); @@ -68,18 +66,16 @@ bool VehicleConfigurationHelper::setupVehicle(bool save) applyFlighModeConfiguration(); applyLevellingConfiguration(); applyStabilizationConfiguration(); + applyManualControlDefaults(); - if(save) { - bool result = saveChangesToController(); - if(result) { - emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Done!")); - } - else { - emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Failed!")); - } - return result; + bool result = saveChangesToController(save); + if(result) { + emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Done!")); } - return true; + else { + emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Failed!")); + } + return result; } void VehicleConfigurationHelper::addModifiedObject(UAVDataObject *object, QString description) @@ -189,13 +185,13 @@ void VehicleConfigurationHelper::applyActuatorConfiguration() case VehicleConfigurationSource::VEHICLE_MULTI: { ActuatorSettings::DataFields data = actSettings->getData(); - actuatorSettings actuatorSettings = m_configSource->getActuatorSettings(); + QList actuatorSettings = m_configSource->getActuatorSettings(); for(quint16 i = 0; i < ActuatorSettings::CHANNELMAX_NUMELEM; i++) { data.ChannelType[i] = ActuatorSettings::CHANNELTYPE_PWM; data.ChannelAddr[i] = i; - data.ChannelMin[i] = actuatorSettings.channels[i].channelMin; - data.ChannelNeutral[i] = actuatorSettings.channels[i].channelNeutral; - data.ChannelMax[i] = actuatorSettings.channels[i].channelMax; + data.ChannelMin[i] = actuatorSettings[i].channelMin; + data.ChannelNeutral[i] = actuatorSettings[i].channelNeutral; + data.ChannelMax[i] = actuatorSettings[i].channelMax; } data.MotorsSpinWhileArmed = ActuatorSettings::MOTORSSPINWHILEARMED_FALSE; @@ -241,7 +237,7 @@ void VehicleConfigurationHelper::applyActuatorConfiguration() break; } actSettings->setData(data); - addModifiedObject(actSettings, tr("Writing output rate settings")); + addModifiedObject(actSettings, tr("Writing actuator settings")); break; } case VehicleConfigurationSource::VEHICLE_FIXEDWING: @@ -336,7 +332,7 @@ void VehicleConfigurationHelper::applyMixerConfiguration(mixerSettings mixer) } // Apply updates - //mSettings->setData(mSettings->getData()); + mSettings->setData(mSettings->getData()); addModifiedObject(mSettings, tr("Writing mixer settings")); } @@ -356,7 +352,28 @@ void VehicleConfigurationHelper::applyMultiGUISettings(SystemSettings::AirframeT addModifiedObject(sSettings, tr("Writing vehicle settings")); } -bool VehicleConfigurationHelper::saveChangesToController() +void VehicleConfigurationHelper::applyManualControlDefaults() +{ + ManualControlSettings *mcSettings = ManualControlSettings::GetInstance(m_uavoManager); + Q_ASSERT(mcSettings); + ManualControlSettings::DataFields cData = mcSettings->getData(); + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_THROTTLE] = ManualControlSettings::CHANNELGROUPS_PWM; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_ROLL] = ManualControlSettings::CHANNELGROUPS_PWM; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_YAW] = ManualControlSettings::CHANNELGROUPS_PWM; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_PITCH] = ManualControlSettings::CHANNELGROUPS_PWM; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_FLIGHTMODE] = ManualControlSettings::CHANNELGROUPS_PWM; + + cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_THROTTLE] = 1; + cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_ROLL] = 2; + cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_YAW] = 3; + cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_PITCH] = 4; + cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_FLIGHTMODE] = 5; + + mcSettings->setData(cData); + addModifiedObject(mcSettings, tr("Writing manual control defaults")); +} + +bool VehicleConfigurationHelper::saveChangesToController(bool save) { qDebug() << "Saving modified objects to controller. " << m_modifiedObjects.count() << " objects in found."; const int OUTER_TIMEOUT = 3000 * 20; // 10 seconds timeout for saving all objects @@ -404,21 +421,23 @@ bool VehicleConfigurationHelper::saveChangesToController() disconnect(obj, SIGNAL(transactionCompleted(UAVObject* ,bool)), this, SLOT(uAVOTransactionCompleted(UAVObject*, bool))); if(m_transactionOK) { qDebug() << "Object " << obj->getName() << " was successfully updated."; - m_transactionOK = false; - m_currentTransactionObjectID = obj->getObjID(); - // Try to save until success or timeout - while(!m_transactionOK && !m_transactionTimeout) { - // Allow the transaction to take some time - innerTimeoutTimer.start(INNER_TIMEOUT); + if(save) { + m_transactionOK = false; + m_currentTransactionObjectID = obj->getObjID(); + // Try to save until success or timeout + while(!m_transactionOK && !m_transactionTimeout) { + // Allow the transaction to take some time + innerTimeoutTimer.start(INNER_TIMEOUT); - // Persist object in controller - utilMngr->saveObjectToSD(obj); - if(!m_transactionOK) { - m_eventLoop.exec(); + // Persist object in controller + utilMngr->saveObjectToSD(obj); + if(!m_transactionOK) { + m_eventLoop.exec(); + } + innerTimeoutTimer.stop(); } - innerTimeoutTimer.stop(); + m_currentTransactionObjectID = -1; } - m_currentTransactionObjectID = -1; } if(!m_transactionOK) { @@ -665,8 +684,8 @@ void VehicleConfigurationHelper::setupQuadCopter() guiSettings.multi.VTOLMotorNW = 1; guiSettings.multi.VTOLMotorNE = 2; - guiSettings.multi.VTOLMotorSW = 3; - guiSettings.multi.VTOLMotorSE = 4; + guiSettings.multi.VTOLMotorSE = 3; + guiSettings.multi.VTOLMotorSW = 4; break; } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h index f3065ed42..0810d3390 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h @@ -68,16 +68,11 @@ signals: void saveProgress(int total, int current, QString description); private: - - static const qint16 ACTUATOR_MIN = 1000; - static const qint16 ACTUATOR_NEUTRAL = 1000; - static const qint16 ACTUATOR_MAX = 2000; - static const int MIXER_TYPE_DISABLED = 0; static const int MIXER_TYPE_MOTOR = 1; static const int MIXER_TYPE_SERVO = 2; - static const int PROGRESS_STEPS = 10; + static const int PROGRESS_STEPS = 11; VehicleConfigurationSource *m_configSource; UAVObjectManager *m_uavoManager; @@ -92,13 +87,14 @@ private: void applyFlighModeConfiguration(); void applyLevellingConfiguration(); void applyStabilizationConfiguration(); + void applyManualControlDefaults(); void applyMixerConfiguration(mixerSettings mixer); GUIConfigDataUnion getGUIConfigData(); void applyMultiGUISettings(SystemSettings::AirframeTypeOptions airframe, GUIConfigDataUnion guiConfig); - bool saveChangesToController(); + bool saveChangesToController(bool save); QEventLoop m_eventLoop; bool m_transactionOK; bool m_transactionTimeout; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h index a80340726..f84d02316 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h @@ -50,9 +50,6 @@ struct actuatorChannelSettings { actuatorChannelSettings(): channelMin(1000), channelNeutral(1080), channelMax(1800) {} }; -struct actuatorSettings { - actuatorChannelSettings channels[ActuatorSettings::CHANNELADDR_NUMELEM]; -}; class VehicleConfigurationSource { @@ -78,7 +75,7 @@ public: virtual accelGyroBias getLevellingBias() const = 0; virtual bool isMotorCalibrationPerformed() const = 0; - virtual actuatorSettings getActuatorSettings() const = 0; + virtual QList getActuatorSettings() const = 0; virtual QString getSummaryText() = 0; }; From 37abf82fc28d4640bed153bb83b6d6354fc3505a Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Mon, 10 Sep 2012 22:37:39 +0200 Subject: [PATCH 25/56] OP-39 Added saving as image to the connection diagram dialog. --- .../plugins/setupwizard/connectiondiagram.cpp | 25 ++++-- .../plugins/setupwizard/connectiondiagram.h | 6 +- .../plugins/setupwizard/connectiondiagram.ui | 82 ++++++++++++------- 3 files changed, 74 insertions(+), 39 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp index 6ded9bda6..f3dbd2dca 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp @@ -27,6 +27,7 @@ #include #include +#include #include "connectiondiagram.h" #include "ui_connectiondiagram.h" @@ -62,8 +63,8 @@ void ConnectionDiagram::setupGraphicsScene() m_renderer->load(QString(":/setupwizard/resources/connection-diagrams.svg")) && m_renderer->isValid()) { - QGraphicsScene *scene = new QGraphicsScene(this); - ui->connectionDiagram->setScene(scene); + m_scene = new QGraphicsScene(this); + ui->connectionDiagram->setScene(m_scene); //ui->connectionDiagram->setViewportUpdateMode(QGraphicsView::FullViewportUpdate); m_background = new QGraphicsSvgItem(); @@ -72,7 +73,7 @@ void ConnectionDiagram::setupGraphicsScene() m_background->setOpacity(0); //m_background->setFlags(QGraphicsItem::ItemClipsToShape); m_background->setZValue(-1); - scene->addItem(m_background); + m_scene->addItem(m_background); QList elementsToShow; @@ -139,7 +140,7 @@ void ConnectionDiagram::setupGraphicsScene() break; } - setupGraphicsSceneItems(scene, elementsToShow); + setupGraphicsSceneItems(elementsToShow); ui->connectionDiagram->setSceneRect(m_background->boundingRect()); ui->connectionDiagram->fitInView(m_background, Qt::KeepAspectRatio); @@ -148,7 +149,7 @@ void ConnectionDiagram::setupGraphicsScene() } } -void ConnectionDiagram::setupGraphicsSceneItems(QGraphicsScene *scene, QList elementsToShow) +void ConnectionDiagram::setupGraphicsSceneItems(QList elementsToShow) { qreal z = 0; QRectF backgBounds = m_renderer->boundsOnElement("background"); @@ -168,7 +169,7 @@ void ConnectionDiagram::setupGraphicsSceneItems(QGraphicsScene *scene, QListboundsOnElement(elementId); //element->setPos(orig.x() - backgBounds.x(), orig.y() - backgBounds.y()); - scene->addItem(element); + m_scene->addItem(element); qDebug() << "Adding " << elementId << " to scene at " << element->pos(); } else { @@ -177,4 +178,14 @@ void ConnectionDiagram::setupGraphicsSceneItems(QGraphicsScene *scene, QListrender(&painter); + QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "", tr("Images (*.png *.xpm *.jpg)")); + if(!fileName.isEmpty()) { + image.save(fileName); + } +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h index 2063403a5..e03ed6b0e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.h @@ -54,13 +54,17 @@ private: QSvgRenderer *m_renderer; QGraphicsSvgItem* m_background; + QGraphicsScene *m_scene; void setupGraphicsScene(); - void setupGraphicsSceneItems(QGraphicsScene *scene, QList elementsToShow); + void setupGraphicsSceneItems(QList elementsToShow); protected: void resizeEvent(QResizeEvent *event); void showEvent(QShowEvent *event); +private slots: + + void on_saveButton_clicked(); }; #endif // CONNECTIONDIAGRAM_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui index 690364a6d..7e86a99a2 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.ui @@ -43,48 +43,68 @@ - - - Qt::Horizontal - - - QDialogButtonBox::Close|QDialogButtonBox::Save - - + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Save + + + + + + + + 0 + 0 + + + + Close + + + true + + + + - buttonBox - accepted() + closeButton + clicked() ConnectionDiagram - accept() + close() - 248 - 254 + 752 + 418 - 157 - 274 - - - - - buttonBox - rejected() - ConnectionDiagram - reject() - - - 316 - 260 - - - 286 - 274 + 399 + 219 From 7d7d1644bcbaff2afe5bd12494d1fd6e282e004b Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Mon, 10 Sep 2012 22:55:02 +0200 Subject: [PATCH 26/56] OP-39 Fixed disabling of wizard buttons during bias calculation and saving of configuration. --- .../plugins/setupwizard/pages/flashpage.cpp | 20 +++++++++++++------ .../src/plugins/setupwizard/pages/flashpage.h | 3 ++- .../setupwizard/pages/levellingpage.cpp | 1 - .../src/plugins/setupwizard/setupwizard.cpp | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp index 988312bef..c31cda0c6 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp @@ -66,20 +66,28 @@ void FlashPage::writeToController() return; } - ui->saveButton->setEnabled(false); - getWizard()->button(QWizard::CancelButton)->setEnabled(false); - setCommitPage(true); + enableButtons(false); VehicleConfigurationHelper helper(getWizard()); connect(&helper, SIGNAL(saveProgress(int, int, QString)),this, SLOT(saveProgress(int, int, QString))); + m_successfulWrite = helper.setupVehicle(); + disconnect(&helper, SIGNAL(saveProgress(int, int, QString)),this, SLOT(saveProgress(int, int, QString))); ui->saveProgressLabel->setText(QString("%2").arg(m_successfulWrite ? "green" : "red", ui->saveProgressLabel->text())); - ui->saveButton->setEnabled(true); - getWizard()->button(QWizard::CancelButton)->setEnabled(true); - setCommitPage(false); + enableButtons(true); + emit completeChanged(); } +void FlashPage::enableButtons(bool enable) +{ + ui->saveButton->setEnabled(enable); + getWizard()->button(QWizard::NextButton)->setEnabled(enable); + getWizard()->button(QWizard::CancelButton)->setEnabled(enable); + getWizard()->button(QWizard::BackButton)->setEnabled(enable); + QApplication::processEvents(); +} + void FlashPage::saveProgress(int total, int current, QString description) { if(ui->saveProgressBar->maximum() != total) { diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h index 45e83ed61..6602926ea 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h @@ -44,9 +44,10 @@ public: bool validatePage(); bool isComplete() const; -private: +private: Ui::FlashPage *ui; bool m_successfulWrite; + void enableButtons(bool enable); private slots: void writeToController(); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp index 1384865a6..6d7340f4e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -85,7 +85,6 @@ void LevellingPage::performLevelling() { m_levellingUtil = new LevellingUtil(BIAS_CYCLES, BIAS_RATE); } - emit completeChanged(); connect(m_levellingUtil, SIGNAL(progress(long,long)), this, SLOT(levellingProgress(long,long))); connect(m_levellingUtil, SIGNAL(done(accelGyroBias)), this, SLOT(levellingDone(accelGyroBias))); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index a74c026f2..a7b24ec50 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -53,7 +53,7 @@ SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), VehicleConfiguratio setWindowTitle(tr("OpenPilot Setup Wizard")); setOption(QWizard::IndependentPages, false); setFixedSize(640, 530); - for(int i = 0; i < ActuatorSettings::CHANNELMAX_NUMELEM; i++) + for(quint16 i = 0; i < ActuatorSettings::CHANNELMAX_NUMELEM; i++) { m_actuatorSettings << actuatorChannelSettings(); } From a5335a0acea831aa8b00751edef17e19c7e925c9 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Tue, 11 Sep 2012 20:05:07 +0200 Subject: [PATCH 27/56] OP-39 Minor fixes --- .../src/plugins/setupwizard/pages/outputcalibrationpage.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp index a6389cb84..30750d807 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp @@ -198,7 +198,6 @@ void OutputCalibrationPage::setWizardPage() } } setupVehicleHighlightedPart(); - QApplication::processEvents(); } void OutputCalibrationPage::initializePage() @@ -316,7 +315,7 @@ void OutputCalibrationPage::on_motorNeutralSlider_valueChanged(int value) void OutputCalibrationPage::on_motorMaxButton_toggled(bool checked) { - ui->motorNeutralButton->setText(checked ? tr("Stop") : tr("Start")); + ui->motorMaxButton->setText(checked ? tr("Stop") : tr("Start")); quint16 channel = getCurrentChannel(); onStartButtonToggle(ui->motorMaxButton, channel, m_actuatorSettings[channel].channelMax, 1000, ui->motorMaxSlider); } From 463c14bf8445968e50b9757e49ad49391a698338 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Thu, 13 Sep 2012 23:49:08 +0200 Subject: [PATCH 28/56] OP-39 Removed the motor max rate calibration steps from the wizard. Hardcoded max rate to 1900 ms for now. Fixed a bug with button enable/disable in the output calibration page. --- .../pages/outputcalibrationpage.cpp | 65 ++++------- .../setupwizard/pages/outputcalibrationpage.h | 3 - .../pages/outputcalibrationpage.ui | 109 +----------------- .../setupwizard/vehicleconfigurationsource.h | 2 +- 4 files changed, 29 insertions(+), 150 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp index 30750d807..bbf625e2e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp @@ -67,42 +67,42 @@ void OutputCalibrationPage::setupVehicle() switch(getWizard()->getVehicleSubType()) { case SetupWizard::MULTI_ROTOR_TRI_Y: - m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 3 << 4 << 5; + m_wizardIndexes << 0 << 1 << 1 << 1 << 2 << 3 << 4; m_vehicleElementIds << "tri" << "tri-frame" << "tri-m1" << "tri-m2" << "tri-m3" << "tri-s1"; - m_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 4; - m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 3; + m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 4 << 4; + m_channelIndex << 0 << 0 << 1 << 2 << 3 << 3 << 3; m_actuatorSettings[4].channelMin = 1500; m_actuatorSettings[4].channelMax = 1500; break; case SetupWizard::MULTI_ROTOR_QUAD_X: - m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; + 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_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4; - m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3; + m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4; + m_channelIndex << 0 << 0 << 1 << 2 << 3; break; case SetupWizard::MULTI_ROTOR_QUAD_PLUS: - m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; + 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_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4; - m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3; + m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4; + m_channelIndex << 0 << 0 << 1 << 2 << 3; break; case SetupWizard::MULTI_ROTOR_HEXA: - m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; + 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_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5 << 6 << 6; - m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5; + m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 5 << 6; + m_channelIndex << 0 << 0 << 1 << 2 << 3 << 4 << 5; break; case SetupWizard::MULTI_ROTOR_HEXA_COAX_Y: - m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; + 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_vehicleHighlightElementIndexes << 0 << 2 << 2 << 1 << 1 << 4 << 4 << 3 << 3 << 6 << 6 << 5 << 5; - m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5; + m_vehicleHighlightElementIndexes << 0 << 2 << 1 << 4 << 3 << 6 << 5; + m_channelIndex << 0 << 0 << 1 << 2 << 3 << 4 << 5; break; case SetupWizard::MULTI_ROTOR_HEXA_H: - m_wizardIndexes << 0 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2 << 1 << 2; + 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_vehicleHighlightElementIndexes << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5 << 6 << 6; - m_channelIndex << 0 << 0 << 0 << 1 << 1 << 2 << 2 << 3 << 3 << 4 << 4 << 5 << 5; + m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 5 << 6; + m_channelIndex << 0 << 0 << 1 << 2 << 3 << 4 << 5; break; default: break; @@ -184,16 +184,13 @@ void OutputCalibrationPage::setWizardPage() if(currentPageIndex == 1) { ui->motorNeutralSlider->setValue(m_actuatorSettings[currentChannel].channelNeutral); } - else if (currentPageIndex == 2) { - ui->motorMaxSlider->setValue(m_actuatorSettings[currentChannel].channelMax); - } - else if(currentPageIndex == 3) { + else if(currentPageIndex == 2) { ui->servoCenterSlider->setValue(m_actuatorSettings[currentChannel].channelNeutral); } - else if(currentPageIndex == 4) { + else if(currentPageIndex == 3) { ui->servoMinAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMin); } - else if(currentPageIndex == 5) { + else if(currentPageIndex == 4) { ui->servoMaxAngleSlider->setValue(m_actuatorSettings[currentChannel].channelMax); } } @@ -246,8 +243,8 @@ quint16 OutputCalibrationPage::getCurrentChannel() void OutputCalibrationPage::enableButtons(bool enable) { - ui->nextPageButton->setEnabled(enable); - ui->backPageButton->setEnabled(enable); + ui->nextPageButton->setEnabled(enable && (m_currentWizardIndex < m_wizardIndexes.size() - 1)); + ui->backPageButton->setEnabled(enable && (m_currentWizardIndex > 0)); getWizard()->button(QWizard::NextButton)->setEnabled(enable); getWizard()->button(QWizard::CancelButton)->setEnabled(enable); getWizard()->button(QWizard::BackButton)->setEnabled(enable); @@ -313,22 +310,6 @@ void OutputCalibrationPage::on_motorNeutralSlider_valueChanged(int value) } } -void OutputCalibrationPage::on_motorMaxButton_toggled(bool checked) -{ - ui->motorMaxButton->setText(checked ? tr("Stop") : tr("Start")); - quint16 channel = getCurrentChannel(); - onStartButtonToggle(ui->motorMaxButton, channel, m_actuatorSettings[channel].channelMax, 1000, ui->motorMaxSlider); -} - -void OutputCalibrationPage::on_motorMaxSlider_valueChanged(int position) -{ - if(ui->motorMaxButton->isChecked()) { - quint16 value = ui->motorMaxSlider->value(); - m_calibrationUtil->setChannelOutputValue(value); - m_actuatorSettings[getCurrentChannel()].channelMax = value; - } -} - void OutputCalibrationPage::on_servoCenterButton_toggled(bool checked) { ui->servoCenterButton->setText(checked ? tr("Stop") : tr("Start")); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h index c67bff74b..f66e29e88 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h @@ -58,9 +58,6 @@ private slots: void on_motorNeutralButton_toggled(bool checked); void on_motorNeutralSlider_valueChanged(int value); - void on_motorMaxButton_toggled(bool checked); - void on_motorMaxSlider_valueChanged(int position); - void on_servoCenterButton_toggled(bool checked); void on_servoCenterSlider_valueChanged(int position); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui index f3c0652e2..470a79c4b 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui @@ -36,7 +36,7 @@ - 5 + 2 @@ -136,89 +136,6 @@ - - - - - 90 - 240 - 75 - 23 - - - - Start - - - true - - - false - - - - - - 0 - 10 - 261 - 171 - - - - <html><head/><body><p>Now it is time to find out the maximum rate for the motor highlighted in the illustration to the right. </p><p>To find the maximum rate for this engine, press the Start button below and slide the slider to the left until the engine just starts to slow down.</p><p>Running a brushless motor for a long time without proper cooling can in theory damage it. Therefore do not leave the motor running at full rate longer than neccesary.<br/><br/>When done press button again to stop.</p></body></html> - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - true - - - - - false - - - - 10 - 200 - 241 - 19 - - - - 1400 - - - 2000 - - - 10 - - - 20 - - - 2000 - - - Qt::Horizontal - - - false - - - false - - - QSlider::TicksBelow - - - 20 - - - @@ -550,25 +467,9 @@ - motorMaxButton + servoMinAngleButton toggled(bool) - motorMaxSlider - setEnabled(bool) - - - 147 - 291 - - - 150 - 249 - - - - - servoCenterButton - toggled(bool) - servoCenterSlider + servoMinAngleSlider setEnabled(bool) @@ -598,9 +499,9 @@ - servoMinAngleButton + servoCenterButton toggled(bool) - servoMinAngleSlider + servoCenterSlider setEnabled(bool) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h index f84d02316..41aca3e28 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h @@ -47,7 +47,7 @@ struct actuatorChannelSettings { quint16 channelMax; //Default values - actuatorChannelSettings(): channelMin(1000), channelNeutral(1080), channelMax(1800) {} + actuatorChannelSettings(): channelMin(1000), channelNeutral(1080), channelMax(1900) {} }; From 3236f432b9d3132b0706fff0526ec7d648346dfe Mon Sep 17 00:00:00 2001 From: Kevin Vertucio Date: Fri, 14 Sep 2012 11:32:09 -0400 Subject: [PATCH 29/56] Content revisions and updates to SetupWizard plugin Corrected grammar and spelling. Revised Wizard introduction, multirotor platform descriptions for QuadX, Quad+, Tricopter. Signed-off-by: Kevin Vertucio --- .../plugins/setupwizard/pages/multipage.cpp | 10 +++--- .../plugins/setupwizard/pages/startpage.ui | 33 ++++++++++--------- .../plugins/setupwizard/pages/vehiclepage.ui | 12 +++---- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp index 6d10509b7..3b986d6e9 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp @@ -71,18 +71,18 @@ bool MultiPage::validatePage() void MultiPage::setupMultiTypesCombo() { ui->typeCombo->addItem(tr("Tricopter"), SetupWizard::MULTI_ROTOR_TRI_Y); - m_descriptions << tr("The Tricopter uses three motors and one servo. The servo is used to give yaw authority to the aft motor. " - "The fore motors are rotating in opposite directions. The Tricopter is known for its sweeping yaw movement and " + m_descriptions << tr("The Tricopter uses three motors and one servo. The servo is used to give yaw authority to the rear motor. " + "The front motors are rotating in opposite directions. The Tricopter is known for its sweeping yaw movement and " "it is very well suited for FPV since the front rotors are spread wide apart."); ui->typeCombo->addItem(tr("Quadcopter X"), SetupWizard::MULTI_ROTOR_QUAD_X); - m_descriptions << tr("The X Quadcopter uses four motors and is the most common multi rotor configuration. Two of the motors rotates clockwise " - "and two counter clockwise. The motors positioned diagonal of each other rotates in the same direction. " + m_descriptions << tr("The X Quadcopter uses four motors and is the most common multi rotor configuration. Two of the motors rotate clockwise " + "and two counter clockwise. The motors positioned diagonal to each other rotate in the same direction. " "This setup is perfect for sport flying and is also commonly used for FPV platforms."); ui->typeCombo->addItem(tr("Quadcopter +"), SetupWizard::MULTI_ROTOR_QUAD_PLUS); m_descriptions << tr("The Plus(+) Quadcopter uses four motors and is similar to the X Quadcopter but the forward direction is offset by 45 degrees. " - "The motors fore and aft rotates in one direction and the motors steerboard and port rotates in the other. " + "The motors front and rear rotate in clockwise and the motors right and left rotate counter-clockwise. " "This setup was one of the first to be used and is still used for sport flying. This configuration is not that well suited " "for FPV since the fore rotor tend to be in the way of the camera."); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui index f6b649191..209d53e26 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui @@ -32,22 +32,23 @@ <!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"> p, li { white-space: pre-wrap; } -</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;">Welcome to the OpenPilot Setup Wizard</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;"><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 wizard will guide you through the basic steps of setting up your OpenPilot controller board. The following pages contains simple questions about your vehicle and its characteristics. </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:10pt;">From the information gathered the wizard will create a baseline configuration that should be good enough for you to get a quick start using your OpenPilot product.</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:10pt;">The baseline configuration can, if desired, be uploaded to the OpenPilot Controller board at the end of this wizard.</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;">This wizard does not contain the full range of settings available in the GCS Config plugin. All configuration parameters can be changed at later by using the GCS Config plugin.</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="-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 align="center" 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; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICHLE </span></p> -<p align="center" 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; color:#ff0000;">BEFORE PROCEEDING!</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;">Ignoring the above request will put you in a</span><span style=" font-size:10pt; font-weight:600; color:#000000;"> risk of serious injury</span><span style=" font-size:10pt;">!</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;">Ok, lets start the configuration by clicking on the 'Next'/'Continue' button below.</span></p></body></html> +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">Welcome to the OpenPilot Setup Wizard</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-family:'MS Shell Dlg 2'; font-size:8pt;"></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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">This wizard will guide you through the basic steps required to setup your OpenPilot controller for the first time. You will be asked questions about your platform (multirotor/heli/fixed-wing) which this wizard will use to configure your aircraft for a safe maiden flight. </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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">This wizard does not configure all any of the advanced settings available in the GCS Configuration. All basic and advanced configuration parameters can be modified later by using the GCS Configuration plugin.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></span></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600; color:#ff0000;">WARNING: YOU MUST REMOVE ALL PROPELLERS </span></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600; color:#ff0000;">FROM THE VEHICLE BEFORE PROCEEDING!</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Disregarding this warning puts you at</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; color:#000000;"> risk of very serious injury</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">!</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Now that your props are removed we can get started. Ready?</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui index a7b612f4b..609f84d24 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui @@ -26,12 +26,12 @@ <!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"> 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;"> -<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;">Vehicle type selection</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:12pt; font-weight:600;"></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;">To continue the wizard needs to know what type of vehicle that the OpenPilot controller board is going to be used with. This step is cruicial since most of the following configuration is unique per vehicle type.</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> -<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;">So go ahead and select the type of vehicle you want to create a configuration for.</span></p></body></html> +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">Vehicle type selection</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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">To continue the wizard needs to know what type of vehicle that the OpenPilot controller board is going to be used with. This step is crucial since most of the following configuration is unique per vehicle type.</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-family:'MS Shell Dlg 2'; font-size:8pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">So go ahead and select the type of vehicle you want to create a configuration for.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop From e3b5727dc144f79af02e3364ace7bef4d9bb274a Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sat, 15 Sep 2012 11:06:19 +0200 Subject: [PATCH 30/56] OP-39 Fixed some layout stuff. --- .../plugins/setupwizard/pages/startpage.ui | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui index 209d53e26..f450724d9 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui @@ -32,23 +32,22 @@ <!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"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">Welcome to the OpenPilot Setup Wizard</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-family:'MS Shell Dlg 2'; font-size:8pt;"></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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">This wizard will guide you through the basic steps required to setup your OpenPilot controller for the first time. You will be asked questions about your platform (multirotor/heli/fixed-wing) which this wizard will use to configure your aircraft for a safe maiden flight. </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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">This wizard does not configure all any of the advanced settings available in the GCS Configuration. All basic and advanced configuration parameters can be modified later by using the GCS Configuration plugin.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></span></p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600; color:#ff0000;">WARNING: YOU MUST REMOVE ALL PROPELLERS </span></p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600; color:#ff0000;">FROM THE VEHICLE BEFORE PROCEEDING!</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Disregarding this warning puts you at</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; color:#000000;"> risk of very serious injury</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">!</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Now that your props are removed we can get started. Ready?</span></p></body></html> +</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;">Welcome to the OpenPilot Setup Wizard</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;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><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 wizard will guide you through the basic steps required to setup your OpenPilot controller for the first time. You will be asked questions about your platform (multirotor/heli/fixed-wing) which this wizard will use to configure your aircraft for a safe maiden flight. </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;">This wizard does not configure all any of the advanced settings available in the GCS Configuration. All basic and advanced configuration parameters can be modified later by using the GCS Configuration plugin.</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="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande'; font-size:13pt;"><br /></p> +<p align="center" 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; color:#ff0000;">WARNING: YOU MUST REMOVE ALL PROPELLERS </span></p> +<p align="center" 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; color:#ff0000;">FROM THE VEHICLE BEFORE PROCEEDING!</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:10pt;"><br /></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:10pt;">Disregarding this warning puts you at</span><span style=" font-size:10pt; font-weight:600; color:#000000;"> risk of very serious injury</span><span style=" font-size:10pt;">!</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="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande'; font-size:13pt;"><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;">Now that your props are removed we can get started. Ready?</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop From 098c0d43fdaf8b0dc69aac8ebc7882d8ea213d33 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sun, 16 Sep 2012 16:21:51 +0200 Subject: [PATCH 31/56] OP-39 Hopefully fixed the servo calibration neutral value issue. --- .../src/plugins/setupwizard/pages/outputcalibrationpage.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp index 7341d2c4f..812694f66 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp @@ -74,6 +74,7 @@ void OutputCalibrationPage::setupVehicle() m_actuatorSettings[3].channelMin = 1500; m_actuatorSettings[3].channelNeutral = 1500; m_actuatorSettings[3].channelMax = 1500; + getWizard()->setActuatorSettings(m_actuatorSettings); break; case SetupWizard::MULTI_ROTOR_QUAD_X: m_wizardIndexes << 0 << 1 << 1 << 1 << 1; From 806097fd5664573bdf4ec2806efbdea152c10936 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sun, 16 Sep 2012 23:03:15 +0200 Subject: [PATCH 32/56] OP-39 Added reboot page to wizard. User needing to reboot should NOT forget it now. Added code to invoke Vehicle Setup Wizard and Radio Wizard from Welcome page. --- .../plugins/config/configgadgetfactory.cpp | 24 +++++ .../src/plugins/config/configgadgetfactory.h | 2 + .../src/plugins/coreplugin/modemanager.cpp | 10 ++ .../src/plugins/coreplugin/modemanager.h | 1 + .../src/plugins/setupwizard/pages/endpage.cpp | 2 +- .../plugins/setupwizard/pages/rebootpage.cpp | 66 ++++++++++++++ .../plugins/setupwizard/pages/rebootpage.h | 57 ++++++++++++ .../plugins/setupwizard/pages/rebootpage.ui | 91 +++++++++++++++++++ .../src/plugins/setupwizard/setupwizard.cpp | 9 ++ .../src/plugins/setupwizard/setupwizard.h | 2 +- .../src/plugins/setupwizard/setupwizard.pro | 9 +- .../plugins/setupwizard/setupwizardplugin.cpp | 7 +- .../src/plugins/welcome/qml/main.qml | 4 +- .../src/plugins/welcome/welcomemode.cpp | 5 + .../src/plugins/welcome/welcomemode.h | 1 + 15 files changed, 281 insertions(+), 9 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.cpp create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.h create mode 100644 ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp b/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp index 2a1996729..a927f2179 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp +++ b/ground/openpilotgcs/src/plugins/config/configgadgetfactory.cpp @@ -29,6 +29,10 @@ #include "configgadgetconfiguration.h" #include "configgadgetoptionspage.h" #include +#include +#include +#include +#include ConfigGadgetFactory::ConfigGadgetFactory(QObject *parent) : IUAVGadgetFactory(QString("ConfigGadget"), tr("Config Gadget"), parent), @@ -43,6 +47,25 @@ ConfigGadgetFactory::~ConfigGadgetFactory() Core::IUAVGadget* ConfigGadgetFactory::createGadget(QWidget *parent) { gadgetWidget = new ConfigGadgetWidget(parent); + + // Add Menu entry + Core::ActionManager* am = Core::ICore::instance()->actionManager(); + Core::ActionContainer* ac = am->actionContainer(Core::Constants::M_TOOLS); + + Core::Command* cmd = am->registerAction(new QAction(this), + "ConfigPlugin.ShowInputWizard", + QList() << + Core::Constants::C_GLOBAL_ID); + cmd->setDefaultKeySequence(QKeySequence("Ctrl+R")); + cmd->action()->setText(tr("Radio Setup Wizard")); + + Core::ModeManager::instance()->addAction(cmd, 1); + + ac->appendGroup("Wizard"); + ac->addAction(cmd, "Wizard"); + + connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(startInputWizard())); + return new ConfigGadget(QString("ConfigGadget"), gadgetWidget, parent); } @@ -60,6 +83,7 @@ void ConfigGadgetFactory::startInputWizard() { if(gadgetWidget) { + Core::ModeManager::instance()->activateModeByWorkspaceName("Configuration"); gadgetWidget->startInputWizard(); } } diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetfactory.h b/ground/openpilotgcs/src/plugins/config/configgadgetfactory.h index 77963a842..f44f2c02a 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetfactory.h +++ b/ground/openpilotgcs/src/plugins/config/configgadgetfactory.h @@ -50,6 +50,8 @@ public: IUAVGadget *createGadget(QWidget *parent); IUAVGadgetConfiguration *createConfiguration(QSettings* qSettings); IOptionsPage *createOptionsPage(IUAVGadgetConfiguration *config); + +public slots: void startInputWizard(); private: diff --git a/ground/openpilotgcs/src/plugins/coreplugin/modemanager.cpp b/ground/openpilotgcs/src/plugins/coreplugin/modemanager.cpp index aa5356705..85b3c4bde 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/modemanager.cpp +++ b/ground/openpilotgcs/src/plugins/coreplugin/modemanager.cpp @@ -326,3 +326,13 @@ void ModeManager::setFocusToCurrentMode() widget->setFocus(); } } + +void ModeManager::triggerAction(const QString &actionId) +{ + foreach(Command * command, m_actions.keys()){ + if(command->action()->objectName() == actionId) { + command->action()->trigger(); + break; + } + } +} diff --git a/ground/openpilotgcs/src/plugins/coreplugin/modemanager.h b/ground/openpilotgcs/src/plugins/coreplugin/modemanager.h index ccaf50607..d8fba46bd 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/modemanager.h +++ b/ground/openpilotgcs/src/plugins/coreplugin/modemanager.h @@ -82,6 +82,7 @@ public slots: void activateMode(const QString &id); void activateModeByWorkspaceName(const QString &id); void setFocusToCurrentMode(); + void triggerAction(const QString &actionId); private slots: void objectAdded(QObject *obj); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp index 5c445d5ba..34228c401 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.cpp @@ -51,7 +51,7 @@ void EndPage::openInputWizard() ConfigGadgetFactory* configGadgetFactory = pm->getObject(); if(configGadgetFactory) { - Core::ModeManager::instance()->activateModeByWorkspaceName("Configuration"); + //Core::ModeManager::instance()->activateModeByWorkspaceName("Configuration"); getWizard()->close(); configGadgetFactory->startInputWizard(); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.cpp new file mode 100644 index 000000000..4a2100e3a --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.cpp @@ -0,0 +1,66 @@ +/** + ****************************************************************************** + * + * @file rebootpage.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup RebootPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "rebootpage.h" +#include "ui_rebootpage.h" + +RebootPage::RebootPage(SetupWizard *wizard, QWidget *parent) : + AbstractWizardPage(wizard, parent), + ui(new Ui::RebootPage), m_toggl(false) +{ + ui->setupUi(this); + ui->yellowLabel->setVisible(false); + ui->redLabel->setVisible(true); +} + +RebootPage::~RebootPage() +{ + disconnect(&m_timer, SIGNAL(timeout()), this, SLOT(toggleLabel())); + m_timer.stop(); + delete ui; +} + +void RebootPage::initializePage() +{ + connect(&m_timer, SIGNAL(timeout()), this, SLOT(toggleLabel())); + m_timer.setInterval(500); + m_timer.setSingleShot(false); + m_timer.start(); +} + +bool RebootPage::validatePage() +{ + return true; +} + +void RebootPage::toggleLabel() +{ + m_toggl = !m_toggl; + ui->yellowLabel->setVisible(m_toggl); + ui->redLabel->setVisible(!m_toggl); + qDebug() << "Toggle = " << m_toggl; +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.h new file mode 100644 index 000000000..c3d32fca2 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.h @@ -0,0 +1,57 @@ +/** + ****************************************************************************** + * + * @file rebootpage.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. + * @addtogroup + * @{ + * @addtogroup RebootPage + * @{ + * @brief + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef REBOOTPAGE_H +#define REBOOTPAGE_H + +#include "abstractwizardpage.h" + +namespace Ui { +class RebootPage; +} + +class RebootPage : public AbstractWizardPage +{ + Q_OBJECT + +public: + explicit RebootPage(SetupWizard *wizard, QWidget *parent = 0); + ~RebootPage(); + + void initializePage(); + bool validatePage(); + +private: + Ui::RebootPage *ui; + QTimer m_timer; + bool m_toggl; + +private slots: + void toggleLabel(); +}; + +#endif // REBOOTPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui new file mode 100644 index 000000000..4218fa81b --- /dev/null +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui @@ -0,0 +1,91 @@ + + + RebootPage + + + + 0 + 0 + 600 + 400 + + + + WizardPage + + + + + 50 + 130 + 501 + 41 + + + + <!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"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt; color:#ff0000;">PLEASE REBOOT YOUR CONTROLLER</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + 50 + 180 + 501 + 61 + + + + <!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"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> +<p align="center" 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; color:#000000;">The configuration created by the wizard contains settings that require a reboot of your controller. Please power cycle the controller before continuing.</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + 50 + 130 + 501 + 41 + + + + <!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"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt; color:#ffd500;">PLEASE REBOOT YOUR CONTROLLER</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + yellowLabel + redLabel + label_3 + + + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index 28328f9a4..993e632bf 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -41,6 +41,7 @@ #include "pages/flashpage.h" #include "pages/outputcalibrationpage.h" #include "pages/notyetimplementedpage.h" +#include "pages/rebootpage.h" #include "extensionsystem/pluginmanager.h" #include "vehicleconfigurationhelper.h" #include "actuatorsettings.h" @@ -105,6 +106,13 @@ int SetupWizard::nextId() const case PAGE_SUMMARY: return PAGE_LEVELLING; case PAGE_FLASH: + if(isRestartNeeded()) { + return PAGE_REBOOT; + } + else { + return PAGE_END; + } + case PAGE_REBOOT: return PAGE_END; case PAGE_NOTYETIMPLEMENTED: return PAGE_END; @@ -251,6 +259,7 @@ void SetupWizard::createPages() setPage(PAGE_CALIBRATION, new OutputCalibrationPage(this)); setPage(PAGE_SUMMARY, new SummaryPage(this)); setPage(PAGE_FLASH, new FlashPage(this)); + setPage(PAGE_REBOOT, new RebootPage(this)); setPage(PAGE_NOTYETIMPLEMENTED, new NotYetImplementedPage(this)); setPage(PAGE_END, new EndPage(this)); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h index 0b793a56d..8c908e92a 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h @@ -83,7 +83,7 @@ public: private: enum {PAGE_START, PAGE_CONTROLLER, PAGE_VEHICLES, PAGE_MULTI, PAGE_FIXEDWING, PAGE_HELI, PAGE_SURFACE, PAGE_INPUT, PAGE_OUTPUT, PAGE_LEVELLING, PAGE_CALIBRATION, - PAGE_FLASH, PAGE_SUMMARY, PAGE_NOTYETIMPLEMENTED, PAGE_END}; + PAGE_FLASH, PAGE_SUMMARY, PAGE_NOTYETIMPLEMENTED, PAGE_REBOOT, PAGE_END}; void createPages(); CONTROLLER_TYPE m_controllerType; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro index 977a99900..e94f4a4a4 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro @@ -30,7 +30,8 @@ HEADERS += setupwizardplugin.h \ vehicleconfigurationhelper.h \ connectiondiagram.h \ pages/outputcalibrationpage.h \ - outputcalibrationutil.h + outputcalibrationutil.h \ + pages/rebootpage.h SOURCES += setupwizardplugin.cpp \ setupwizard.cpp \ @@ -54,7 +55,8 @@ SOURCES += setupwizardplugin.cpp \ vehicleconfigurationhelper.cpp \ connectiondiagram.cpp \ pages/outputcalibrationpage.cpp \ - outputcalibrationutil.cpp + outputcalibrationutil.cpp \ + pages/rebootpage.cpp OTHER_FILES += SetupWizard.pluginspec @@ -74,7 +76,8 @@ FORMS += \ pages/flashpage.ui \ pages/levellingpage.ui \ connectiondiagram.ui \ - pages/outputcalibrationpage.ui + pages/outputcalibrationpage.ui \ + pages/rebootpage.ui RESOURCES += \ wizardResources.qrc diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.cpp index 9f5b5c67b..d36a747be 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizardplugin.cpp @@ -35,6 +35,7 @@ #include #include #include +#include SetupWizardPlugin::SetupWizardPlugin() { @@ -58,8 +59,10 @@ bool SetupWizardPlugin::initialize(const QStringList& args, QString *errMsg) "SetupWizardPlugin.ShowSetupWizard", QList() << Core::Constants::C_GLOBAL_ID); - cmd->setDefaultKeySequence(QKeySequence("Ctrl+W")); - cmd->action()->setText(tr("OpenPilot Setup Wizard")); + cmd->setDefaultKeySequence(QKeySequence("Ctrl+V")); + cmd->action()->setText(tr("Vehicle Setup Wizard")); + + Core::ModeManager::instance()->addAction(cmd, 1); ac->menu()->addSeparator(); ac->appendGroup("Wizard"); diff --git a/ground/openpilotgcs/src/plugins/welcome/qml/main.qml b/ground/openpilotgcs/src/plugins/welcome/qml/main.qml index f2f2a302c..ea370db82 100644 --- a/ground/openpilotgcs/src/plugins/welcome/qml/main.qml +++ b/ground/openpilotgcs/src/plugins/welcome/qml/main.qml @@ -36,12 +36,12 @@ Rectangle { WelcomePageButton { baseIconName: "bttn-vehwizard" - onClicked: welcomePlugin.openPage("VehWizard") + onClicked: welcomePlugin.triggerAction("SetupWizardPlugin.ShowSetupWizard") } WelcomePageButton { baseIconName: "bttn-txwizard" - onClicked: welcomePlugin.openPage("TxWizard") + onClicked: welcomePlugin.triggerAction("ConfigPlugin.ShowInputWizard") } } diff --git a/ground/openpilotgcs/src/plugins/welcome/welcomemode.cpp b/ground/openpilotgcs/src/plugins/welcome/welcomemode.cpp index cf36b3036..814a04bf4 100644 --- a/ground/openpilotgcs/src/plugins/welcome/welcomemode.cpp +++ b/ground/openpilotgcs/src/plugins/welcome/welcomemode.cpp @@ -127,4 +127,9 @@ void WelcomeMode::openPage(const QString &page) Core::ModeManager::instance()->activateModeByWorkspaceName(page); } +void WelcomeMode::triggerAction(const QString &actionId) +{ + Core::ModeManager::instance()->triggerAction(actionId); +} + } // namespace Welcome diff --git a/ground/openpilotgcs/src/plugins/welcome/welcomemode.h b/ground/openpilotgcs/src/plugins/welcome/welcomemode.h index 24b47613e..c1b259552 100644 --- a/ground/openpilotgcs/src/plugins/welcome/welcomemode.h +++ b/ground/openpilotgcs/src/plugins/welcome/welcomemode.h @@ -65,6 +65,7 @@ public: public slots: void openUrl(const QString &url); void openPage(const QString &page); + void triggerAction(const QString &actionId); private: WelcomeModePrivate *m_d; From 7363a2a266a23fd038118db3173e32b16115df91 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Mon, 17 Sep 2012 07:12:30 +0200 Subject: [PATCH 33/56] OP-39 Unmade the mistake :) --- .../opmapcontrol/src/internals/projections/lks94projection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h b/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h index d32b6ee1c..d3e09b868 100644 --- a/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h +++ b/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h @@ -28,7 +28,7 @@ #define LKS94PROJECTION_H #include #include "cmath" -#include "C:/Users/Fredrik/development/OpenPilot/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/pureprojection.h" +#include "../pureprojection.h" namespace projections { From b9597e96f911df5fe319787456dd3bd9a9e013e7 Mon Sep 17 00:00:00 2001 From: David Ankers Date: Mon, 17 Sep 2012 22:11:51 +1000 Subject: [PATCH 34/56] Spelling fix with input wizard, add a t to transmitter spotted by Drifter. Conflicts: ground/openpilotgcs/src/plugins/config/configinputwidget.cpp --- ground/openpilotgcs/src/plugins/config/configinputwidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 5a4e7c176..47d713cd2 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -438,7 +438,7 @@ void ConfigInputWidget::wizardSetUpStep(enum wizardSteps step) m_config->graphicsView->setVisible(true); m_config->graphicsView->fitInView(m_txBackground, Qt::KeepAspectRatio ); setTxMovement(nothing); - m_config->wzText->setText(tr("Please choose your transmiter type.\n" + m_config->wzText->setText(tr("Please choose your transmitter type.\n" "Mode 1 means your throttle stick is on the right\n" "Mode 2 means your throttle stick is on the left\n")); m_config->wzBack->setEnabled(true); @@ -454,7 +454,7 @@ void ConfigInputWidget::wizardSetUpStep(enum wizardSteps step) break; case wizardChooseType: { - m_config->wzText->setText(tr("Please choose your transmiter mode.\n" + m_config->wzText->setText(tr("Please choose your transmitter mode.\n" "Acro means normal transmitter\n" "Heli means there is a collective pitch and throttle input\n" "If you are using a heli transmitter please engage throttle hold now please.\n")); From 715aa6543bb88af4cfa45b18b187a033816b438a Mon Sep 17 00:00:00 2001 From: David Ankers Date: Mon, 17 Sep 2012 22:26:21 +1000 Subject: [PATCH 35/56] Fixed a couple of more spelling mistakes spotted by Drifter (Thanks!) --- .../src/plugins/setupwizard/pages/outputcalibrationpage.ui | 2 +- .../openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui index f170685be..69e00c08e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui @@ -49,7 +49,7 @@ - <html><head/><body><p><span style=" font-size:10pt;">It is now time to calibrate the output levels for the signals controlling your vehichle. </span></p><p align="center"><span style=" font-size:10pt; font-weight:600; color:#ff0000;">VERY IMPORTANT!</span><span style=" font-size:10pt;"><br/></span><span style=" font-size:10pt; font-weight:600; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICHLE BEFORE PROCEEDING!</span></p><p><span style=" font-size:10pt; color:#000000;">Connect all components according to the illustration on the previous page and provide power using an external power supply like a battery to continue.</span></p><p><span style=" font-size:10pt;">Depending on what vehichle you have selected, both motors controlled by ESC and servos controlled directly by the OpenPilot controller may have to be calibrated. <br/>The following steps will guide you safely through this process.</span></p></body></html> + <html><head/><body><p><span style=" font-size:10pt;">It is now time to calibrate the output levels for the signals controlling your vehicle. </span></p><p align="center"><span style=" font-size:10pt; font-weight:600; color:#ff0000;">VERY IMPORTANT!</span><span style=" font-size:10pt;"><br/></span><span style=" font-size:10pt; font-weight:600; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICLE BEFORE PROCEEDING!</span></p><p><span style=" font-size:10pt; color:#000000;">Connect all components according to the illustration on the previous page and provide power using an external power supply like a battery to continue.</span></p><p><span style=" font-size:10pt;">Depending on what vehicle you have selected, both motors controlled by ESC and servos controlled directly by the OpenPilot controller may have to be calibrated. <br/>The following steps will guide you safely through this process.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui index 9c054dcd1..cf9d87a86 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui @@ -29,7 +29,7 @@ p, li { white-space: pre-wrap; } </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;">OpenPilot configuration summary</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: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;">The first part of this wizard is now complete. All information required to create a basic OpenPilot controller configuration for a specific vehichle has been collected.</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:10pt;">The first part of this wizard is now complete. All information required to create a basic OpenPilot controller configuration for a specific vehicle has been collected.</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:10pt;">Below is a summary of the configuration and a button that links to a diagram illustrating how to connect required hardware and the OpenPilotController with the current 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: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;">To continue the wizard and go through some basic configuration steps please continue to the next step of this wizard.</span></p> From 633286ab730b90db2420482fff66514329672a03 Mon Sep 17 00:00:00 2001 From: David Ankers Date: Mon, 17 Sep 2012 22:30:01 +1000 Subject: [PATCH 36/56] Grammar change: accidently added and extra extra word. Drifter credit --- ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui index f450724d9..7223e2aca 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui @@ -38,7 +38,7 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><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 wizard will guide you through the basic steps required to setup your OpenPilot controller for the first time. You will be asked questions about your platform (multirotor/heli/fixed-wing) which this wizard will use to configure your aircraft for a safe maiden flight. </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;">This wizard does not configure all any of the advanced settings available in the GCS Configuration. All basic and advanced configuration parameters can be modified later by using the GCS Configuration plugin.</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:10pt;">This wizard does not configure all of the advanced settings available in the GCS Configuration. All basic and advanced configuration parameters can be modified later by using the GCS Configuration plugin.</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="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande'; font-size:13pt;"><br /></p> <p align="center" 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; color:#ff0000;">WARNING: YOU MUST REMOVE ALL PROPELLERS </span></p> From 30c1523b80c0a9365886160a21a4b069465cc47c Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Mon, 17 Sep 2012 20:00:26 +0200 Subject: [PATCH 37/56] OP-39 Fixed a bug causing output rate for channel 2 and max channel rate for channel 0 to be wrong when configuring a hexacopter. --- .../src/plugins/setupwizard/vehicleconfigurationhelper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp index 42b0de356..855f24014 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -230,8 +230,8 @@ void VehicleConfigurationHelper::applyActuatorConfiguration() case VehicleConfigurationSource::MULTI_ROTOR_OCTO_V: data.ChannelUpdateFreq[0] = updateFrequence; data.ChannelUpdateFreq[1] = updateFrequence; + data.ChannelUpdateFreq[2] = updateFrequence; data.ChannelUpdateFreq[3] = updateFrequence; - data.ChannelUpdateFreq[4] = updateFrequence; break; default: break; From 57169ceeb20d133cd84450f969587247f5d95e71 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Mon, 17 Sep 2012 21:40:42 +0200 Subject: [PATCH 38/56] OP-39 Fixed a bug when changing receiver type in wizard. The channel group type was not correctly set in manual control settings. Added support in code for all known DSM types (2/X10Bit/X11Bit). Still have to add/create GUI/Icons to enable selection of specific protocol. Renamed some enums to have better and more correct names. --- .../plugins/setupwizard/connectiondiagram.cpp | 4 +- .../plugins/setupwizard/pages/inputpage.cpp | 4 +- .../src/plugins/setupwizard/setupwizard.cpp | 8 +++- .../vehicleconfigurationhelper.cpp | 41 +++++++++++++++---- .../setupwizard/vehicleconfigurationsource.h | 2 +- 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp index f3dbd2dca..1b94c1cae 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/connectiondiagram.cpp @@ -133,7 +133,9 @@ void ConnectionDiagram::setupGraphicsScene() case VehicleConfigurationSource::INPUT_SBUS: elementsToShow << "sbus"; break; - case VehicleConfigurationSource::INPUT_DSM: + case VehicleConfigurationSource::INPUT_DSMX10: + case VehicleConfigurationSource::INPUT_DSMX11: + case VehicleConfigurationSource::INPUT_DSM2: elementsToShow << "satellite"; break; default: diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp index e19d850c4..b442db3a5 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp @@ -57,7 +57,7 @@ bool InputPage::validatePage() getWizard()->setInputType(SetupWizard::INPUT_SBUS); } else if(ui->spectrumButton->isChecked()) { - getWizard()->setInputType(SetupWizard::INPUT_DSM); + getWizard()->setInputType(SetupWizard::INPUT_DSM2); } else { getWizard()->setInputType(SetupWizard::INPUT_PWM); @@ -82,7 +82,7 @@ bool InputPage::restartNeeded(VehicleConfigurationSource::INPUT_TYPE selectedTyp return data.CC_RcvrPort != HwSettings::CC_RCVRPORT_PPM; case VehicleConfigurationSource::INPUT_SBUS: return data.CC_MainPort != HwSettings::CC_MAINPORT_SBUS; - case VehicleConfigurationSource::INPUT_DSM: + case VehicleConfigurationSource::INPUT_DSM2: // TODO: Handle all of the DSM types ?? Which is most common? return data.CC_MainPort != HwSettings::CC_MAINPORT_DSM2; default: diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index 993e632bf..95fc75747 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -217,9 +217,15 @@ QString SetupWizard::getSummaryText() case INPUT_SBUS: summary.append(tr("Futaba S.Bus")); break; - case INPUT_DSM: + case INPUT_DSM2: summary.append(tr("Spectrum satellite (DSM2)")); break; + case INPUT_DSMX10: + summary.append(tr("Spectrum satellite (DSMX10BIT)")); + break; + case INPUT_DSMX11: + summary.append(tr("Spectrum satellite (DSMX11BIT)")); + break; default: summary.append(tr("Unknown")); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp index 855f24014..add4e8a29 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -118,8 +118,13 @@ void VehicleConfigurationHelper::applyHardwareConfiguration() case VehicleConfigurationSource::INPUT_SBUS: data.CC_MainPort = HwSettings::CC_MAINPORT_SBUS; break; - case VehicleConfigurationSource::INPUT_DSM: - // TODO: Handle all of the DSM types ?? Which is most common? + case VehicleConfigurationSource::INPUT_DSMX10: + data.CC_MainPort = HwSettings::CC_MAINPORT_DSMX10BIT; + break; + case VehicleConfigurationSource::INPUT_DSMX11: + data.CC_MainPort = HwSettings::CC_MAINPORT_DSMX11BIT; + break; + case VehicleConfigurationSource::INPUT_DSM2: data.CC_MainPort = HwSettings::CC_MAINPORT_DSM2; break; default: @@ -357,11 +362,33 @@ void VehicleConfigurationHelper::applyManualControlDefaults() ManualControlSettings *mcSettings = ManualControlSettings::GetInstance(m_uavoManager); Q_ASSERT(mcSettings); ManualControlSettings::DataFields cData = mcSettings->getData(); - cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_THROTTLE] = ManualControlSettings::CHANNELGROUPS_PWM; - cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_ROLL] = ManualControlSettings::CHANNELGROUPS_PWM; - cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_YAW] = ManualControlSettings::CHANNELGROUPS_PWM; - cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_PITCH] = ManualControlSettings::CHANNELGROUPS_PWM; - cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_FLIGHTMODE] = ManualControlSettings::CHANNELGROUPS_PWM; + + ManualControlSettings::ChannelGroupsOptions channelType = ManualControlSettings::CHANNELGROUPS_PWM; + switch(m_configSource->getInputType()) + { + case VehicleConfigurationSource::INPUT_PWM: + channelType = ManualControlSettings::CHANNELGROUPS_PWM; + break; + case VehicleConfigurationSource::INPUT_PPM: + channelType = ManualControlSettings::CHANNELGROUPS_PPM; + break; + case VehicleConfigurationSource::INPUT_SBUS: + channelType = ManualControlSettings::CHANNELGROUPS_SBUS; + break; + case VehicleConfigurationSource::INPUT_DSMX10: + case VehicleConfigurationSource::INPUT_DSMX11: + case VehicleConfigurationSource::INPUT_DSM2: + channelType = ManualControlSettings::CHANNELGROUPS_DSMMAINPORT; + break; + default: + break; + } + + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_THROTTLE] = channelType; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_ROLL] = channelType; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_YAW] = channelType; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_PITCH] = channelType; + cData.ChannelGroups[ManualControlSettings::CHANNELGROUPS_FLIGHTMODE] = channelType; cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_THROTTLE] = 1; cData.ChannelNumber[ManualControlSettings::CHANNELGROUPS_ROLL] = 2; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h index f96402614..6332ee23b 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h @@ -63,7 +63,7 @@ public: MULTI_ROTOR_OCTO_V, MULTI_ROTOR_OCTO_COAX_X, MULTI_ROTOR_OCTO_COAX_PLUS, FIXED_WING_AILERON, FIXED_WING_VTAIL, HELI_CCPM}; enum ESC_TYPE {ESC_RAPID, ESC_LEGACY, ESC_UNKNOWN}; - enum INPUT_TYPE {INPUT_PWM, INPUT_PPM, INPUT_SBUS, INPUT_DSM, INPUT_UNKNOWN}; + enum INPUT_TYPE {INPUT_PWM, INPUT_PPM, INPUT_SBUS, INPUT_DSMX10, INPUT_DSMX11, INPUT_DSM2, INPUT_UNKNOWN}; virtual VehicleConfigurationSource::CONTROLLER_TYPE getControllerType() const = 0; virtual VehicleConfigurationSource::VEHICLE_TYPE getVehicleType() const = 0; From d80954e13a75ee9c31d6179336f47ac72a5f04ad Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Tue, 18 Sep 2012 12:48:57 +0200 Subject: [PATCH 39/56] OP-39 Changed the layout of the welcome screen and placed the wizard buttons grouped with all other buttons. --- .../src/plugins/welcome/qml/main.qml | 37 +++++++------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/welcome/qml/main.qml b/ground/openpilotgcs/src/plugins/welcome/qml/main.qml index ea370db82..8815a352a 100644 --- a/ground/openpilotgcs/src/plugins/welcome/qml/main.qml +++ b/ground/openpilotgcs/src/plugins/welcome/qml/main.qml @@ -24,27 +24,6 @@ Rectangle { smooth: true } - Column { - id: wizarButtonsColumn - - anchors { - top: parent.top - right: parent.right - margins: 8 - } - spacing: 8 - - WelcomePageButton { - baseIconName: "bttn-vehwizard" - onClicked: welcomePlugin.triggerAction("SetupWizardPlugin.ShowSetupWizard") - } - - WelcomePageButton { - baseIconName: "bttn-txwizard" - onClicked: welcomePlugin.triggerAction("ConfigPlugin.ShowInputWizard") - } - } - Column { id: buttonsGrid @@ -58,8 +37,7 @@ Rectangle { Row { //if the buttons grid overlaps vertically with the wizard buttons, //move it left to use only the space left to wizard buttons - property real availableWidth: buttonsGrid.y > wizarButtonsColumn.y+wizarButtonsColumn.height ? - container.width : wizarButtonsColumn.x + property real availableWidth: container.width x: (availableWidth-width)/2 spacing: 16 @@ -74,7 +52,7 @@ Rectangle { Grid { id: buttons - columns: 3 + columns: 4 spacing: 4 anchors.verticalCenter: parent.verticalCenter @@ -97,6 +75,11 @@ Rectangle { } WelcomePageButton { + baseIconName: "bttn-vehwizard" + onClicked: welcomePlugin.triggerAction("SetupWizardPlugin.ShowSetupWizard") + } + + WelcomePageButton { baseIconName: "scopes" label: "Scopes" onClicked: welcomePlugin.openPage("Scopes") @@ -113,6 +96,12 @@ Rectangle { label: "Firmware" onClicked: welcomePlugin.openPage("Firmware") } + + WelcomePageButton { + baseIconName: "bttn-txwizard" + onClicked: welcomePlugin.triggerAction("ConfigPlugin.ShowInputWizard") + } + } //icons grid } // images row From 8f8dd1261594d2cdea707993891fd560fa53df8b Mon Sep 17 00:00:00 2001 From: Kevin Vertucio Date: Wed, 19 Sep 2012 10:14:59 -0400 Subject: [PATCH 40/56] copy revisions and corrections in SetupWizard plugin Signed-off-by: Kevin Vertucio --- .../plugins/setupwizard/pages/outputpage.ui | 14 ++++---- .../plugins/setupwizard/pages/startpage.ui | 35 +++++++++++-------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui index 45090f1e6..ca335eabc 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui @@ -26,12 +26,14 @@ <!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"> 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;"> -<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 basic output signal 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:12pt; font-weight:600;"></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;">To set an optimal configuration of the output signals powering your motors used by your OpenPilot controller the wizard needs to know what type of Electronic Speed Controllers (ESC) you will use and what their capabilities are.</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;"></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 one of the options below. If you are unsure about the capabilities of your ESC:s just leave the default option selected and continue the wizard.</span></p></body></html> +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">OpenPilot basic output signal 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">To set an optimal configuration of the output signals powering your motors used by your OpenPilot controller the wizard needs to know what type of Electronic Speed Controllers (ESC) you will use and what their capabilities are.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">Please select one of the options below. If you are unsure about the capabilities of your ESC:s just leave the default option selected and continue the wizard.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">To read more regarding ESC refresh rates, please see </span><a href="http://wiki.openpilot.org/display/Doc/TurboPWM+ESC%27s"><span style=" text-decoration: underline; color:#0000ff;">this article</span></a><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;"> in the OpenPilot WIki</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui index 7223e2aca..48c41f15f 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui @@ -32,22 +32,27 @@ <!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"> p, li { white-space: pre-wrap; } -</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;">Welcome to the OpenPilot Setup Wizard</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;"><br /></p> +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">Welcome to the OpenPilot Setup Wizard</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-family:'MS Shell Dlg 2'; font-size:8pt;"></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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">This wizard will guide you through the basic steps required to setup your OpenPilot controller for the first time. You will be asked questions about your platform (multirotor/heli/fixed-wing) which this wizard will use to configure your aircraft for your maiden flight. </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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">This wizard does not configure all of the advanced settings available in the GCS Configuration. All basic and advanced configuration parameters can be modified later by using the GCS Configuration plugin.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><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 wizard will guide you through the basic steps required to setup your OpenPilot controller for the first time. You will be asked questions about your platform (multirotor/heli/fixed-wing) which this wizard will use to configure your aircraft for a safe maiden flight. </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;">This wizard does not configure all of the advanced settings available in the GCS Configuration. All basic and advanced configuration parameters can be modified later by using the GCS Configuration plugin.</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="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande'; font-size:13pt;"><br /></p> -<p align="center" 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; color:#ff0000;">WARNING: YOU MUST REMOVE ALL PROPELLERS </span></p> -<p align="center" 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; color:#ff0000;">FROM THE VEHICLE BEFORE PROCEEDING!</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:10pt;"><br /></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:10pt;">Disregarding this warning puts you at</span><span style=" font-size:10pt; font-weight:600; color:#000000;"> risk of very serious injury</span><span style=" font-size:10pt;">!</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="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Lucida Grande'; font-size:13pt;"><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;">Now that your props are removed we can get started. Ready?</span></p></body></html> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600; color:#ff0000;">WARNING: YOU MUST REMOVE ALL PROPELLERS </span></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600; color:#ff0000;">FROM THE VEHICLE BEFORE PROCEEDING!</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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Disregarding this warning puts you at</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; color:#000000;"> risk of very serious injury</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">!</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><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-family:'MS Shell Dlg 2'; font-size:10pt;">Now that your props are removed we can get started. Ready?</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop From 607497758fe0dd9716e4a4827fbb6b126ef81b50 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Thu, 20 Sep 2012 23:08:09 +0200 Subject: [PATCH 41/56] OP-39 Changed to one single wizard button on the welcome page. KISS :) --- .../plugins/setupwizard/pages/rebootpage.ui | 4 +-- .../plugins/welcome/qml/images/wizard-off.png | Bin 0 -> 22409 bytes .../plugins/welcome/qml/images/wizard-on.png | Bin 0 -> 22200 bytes .../src/plugins/welcome/qml/main.qml | 23 ++++++++---------- .../src/plugins/welcome/welcome.qrc | 2 ++ 5 files changed, 14 insertions(+), 15 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/welcome/qml/images/wizard-off.png create mode 100644 ground/openpilotgcs/src/plugins/welcome/qml/images/wizard-on.png diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui index 4218fa81b..b808d13b1 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui @@ -42,7 +42,7 @@ p, li { white-space: pre-wrap; } 50 180 501 - 61 + 71 @@ -50,7 +50,7 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> -<p align="center" 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; color:#000000;">The configuration created by the wizard contains settings that require a reboot of your controller. Please power cycle the controller before continuing.</span></p></body></html> +<p align="center" 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; color:#000000;">The configuration created by the wizard contains settings that require a reboot of your controller. Please power cycle the controller before continuing. To power cycle the controller remove all batteries and the usb cable for at least 30 seconds.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/welcome/qml/images/wizard-off.png b/ground/openpilotgcs/src/plugins/welcome/qml/images/wizard-off.png new file mode 100644 index 0000000000000000000000000000000000000000..6e00e1526bd7fb15369eab73f5dd7d46b1709133 GIT binary patch literal 22409 zcmbTdWmsE5+b)W`6n8BWJh;0?<%=AL+vrZO%TB^Ck#0FZoSbN(e$l7_>*wd?mtsU)k?5*try+-UM5D<`^ob`-+jWphf*?NGv zt^d{G4gh22&Co!uoF&)T~g>7DH)84U$BfEu3i_D;?!LEiSd zL7IBDL9Vu4gNic?E!?0-~Jsd_Z0x4=*1NP?(DsC?+T@2IQsx?++u~ znzx;Un2v(df7^oJNisV5`g)4-@IW9CZU{fOhqogSuc)Xf50HoS@qeuCqZjCD&!c1SHBPGQ$7iwsW?FLnH#^^j5k{+JroB^c1qqJVEX?cEav=w@ZkSD^8b>x`~QO)58N4^f9di6N|*mBg6H7B%m1DH z@SFeLeeB)gea0K!IV@{jXAlr{TT~Tf^#YcTJJD;H76U784EIm-ws$(jy&N5d_Iflv z1Guv@0cx28PVw_Zc6StMZ{r+?&qiXw8J%Bst`!tnT4ND}hJuU&{<$>Z?O|H6nt z-i(MNZcfJ6V_NQi`WTT!Zc`)K`ijiy-IQx&!v$&*HfQ<~!$Zd|It}l@D_cKxE~X9Z z+m2mqN_;Cf&x_~;ou`&3>u}2+MYy^Te{EpTOLRd9Zq#XB2tQEC#3hK2imF_~X38{p z*c1NPf4`Hu7cmRf!r>h-3YITV5|O9N_BDU`34_6;T|OGrA^iv<=Z4MF>mn!Nn;lze zUo?h3Tzl+Z9=`mUcEkxdMx|*!VQJW-M>HmNEShtdQcAetP5)Iuq4C&3P=?`oh;4jU z-FwN!bmx(V@?bmtvf4`Dzn_Lf*Im^UFH8)`Zdz{(yxhInUpBe2Mo&iO!vRWpYP+R| z1P2G-Y;0_toptCwC$B%Bu}?QDMsIr2>}KQU7y~0-HP+K%oKHJ~FB{%6b)y>ElNx+neWB z{bGsGZzr(EZRwCb$gnV;q+wKs;TROV83T#|tr3F`NLpC?7yuaXXoh>UT9!BCUR0l- zlc|KCxkB5Fvh1kYGmtd32&AU;H+5iLp$})FyV!p`)?O~hJP%D2E98#I0iW?+)rvvW zZiigBkOyt^isXL4S`ph%=Oa0PpXJgWaZgT7g}XgeeNlpy)_X607ifq;Dw^o$V zsYL#MYDcvFtF<1uogqsQq~Ly6|uq z;lr))jQzN)Ji`GE>#420NLSr=S?dOzFJ`SR?429PVD|Cp>L`BZ9-a5z=}ch2=y$7F zgaibvZ)Ibx#xhe=ev3x-am>9cA5gZNdja~|+63f5+~ zkecE({@6neOpnRfZ_(;FEz&zTBHeUdhJY6^fjSz5=c0}aU|OSAO;X)>0XKT#waVy! zLd;IkLr#L5OF&Qyf!a|-|9S&Op^eTG)}xYkVNbVIMN>p54U{2}1tYLFPhU;vGhjZJE4F+VrD7@ z2Eel$G3Ik{lEG_`Tx=Xo)sco#X9NNFwm_sDAwq@rKR0U;iMR5z%cWWlk;#l`A_!!h zo4;q!!Xq@5kI>nB6x}`De85inJGv)J8vTs|EYyN;+Nb%2akvVegn|Yc*N
ChZ$4twtUA#h6w_Yv7+|i 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 KMNUMnLSTX~)5c2x literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/welcome/qml/images/wizard-on.png b/ground/openpilotgcs/src/plugins/welcome/qml/images/wizard-on.png new file mode 100644 index 0000000000000000000000000000000000000000..0f85087b3ab8484e7454be0c79a2d809851eb57d GIT binary patch literal 22200 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 FV1mwFjmH20 literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/welcome/qml/main.qml b/ground/openpilotgcs/src/plugins/welcome/qml/main.qml index 8815a352a..dc88c42bc 100644 --- a/ground/openpilotgcs/src/plugins/welcome/qml/main.qml +++ b/ground/openpilotgcs/src/plugins/welcome/qml/main.qml @@ -47,12 +47,12 @@ Rectangle { anchors.verticalCenterOffset: -2 //it looks better aligned to icons grid //hide the logo on the very small screen to fit the buttons - visible: parent.availableWidth > width + parent.spacing + buttons.width + visible: parent.availableWidth > width + parent.spacing + buttons.width + wizard.width } Grid { id: buttons - columns: 4 + columns: 3 spacing: 4 anchors.verticalCenter: parent.verticalCenter @@ -74,11 +74,6 @@ Rectangle { onClicked: welcomePlugin.openPage("System") } - WelcomePageButton { - baseIconName: "bttn-vehwizard" - onClicked: welcomePlugin.triggerAction("SetupWizardPlugin.ShowSetupWizard") - } - WelcomePageButton { baseIconName: "scopes" label: "Scopes" @@ -96,13 +91,15 @@ Rectangle { label: "Firmware" onClicked: welcomePlugin.openPage("Firmware") } - - WelcomePageButton { - baseIconName: "bttn-txwizard" - onClicked: welcomePlugin.triggerAction("ConfigPlugin.ShowInputWizard") - } - } //icons grid + + WelcomePageButton { + id: wizard + anchors.verticalCenter: parent.verticalCenter + baseIconName: "wizard" + onClicked: welcomePlugin.triggerAction("SetupWizardPlugin.ShowSetupWizard") + } + } // images row CommunityPanel { diff --git a/ground/openpilotgcs/src/plugins/welcome/welcome.qrc b/ground/openpilotgcs/src/plugins/welcome/welcome.qrc index 2fc8bf23c..5007edc6b 100644 --- a/ground/openpilotgcs/src/plugins/welcome/welcome.qrc +++ b/ground/openpilotgcs/src/plugins/welcome/welcome.qrc @@ -30,5 +30,7 @@ qml/images/bttn-txwizard-off.png qml/images/bttn-vehwizard-on.png qml/images/bttn-vehwizard-off.png + qml/images/wizard-off.png + qml/images/wizard-on.png From 7797a99bb13d08693403072577c844c144a3a363 Mon Sep 17 00:00:00 2001 From: Kevin Vertucio Date: Thu, 20 Sep 2012 21:34:14 -0400 Subject: [PATCH 42/56] copy/content revisions and corrections. More corrections in SetupWizard plugin Signed-off-by: Kevin Vertucio --- .../setupwizard/pages/controllerpage.ui | 21 ++++++++------- .../src/plugins/setupwizard/pages/endpage.ui | 4 +-- .../setupwizard/pages/fixedwingpage.ui | 2 +- .../plugins/setupwizard/pages/flashpage.ui | 22 ++++++++------- .../src/plugins/setupwizard/pages/helipage.ui | 2 +- .../plugins/setupwizard/pages/inputpage.ui | 4 +-- .../setupwizard/pages/levellingpage.ui | 12 ++++----- .../plugins/setupwizard/pages/multipage.ui | 2 +- .../pages/notyetimplementedpage.ui | 2 +- .../pages/outputcalibrationpage.ui | 27 ++++++++++++++++++- .../plugins/setupwizard/pages/outputpage.ui | 6 ++--- .../plugins/setupwizard/pages/summarypage.ui | 21 ++++++++------- .../plugins/setupwizard/pages/surfacepage.ui | 2 +- .../plugins/setupwizard/pages/vehiclepage.ui | 4 +-- 14 files changed, 83 insertions(+), 48 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui index f608f43b8..0a3182426 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui @@ -26,15 +26,18 @@ <!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"> p, li { white-space: pre-wrap; } -</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;">OpenPilot board identification</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;"><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;">To continue the wizard needs to know what kind of OpenPilot controller you want to create a configuration for. The wizard will try to automatically detect what type of board you have when connected.</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 connect the board to a free usb port on your computer, or if a serial modem like BlueTooth, PipX or other is used, power up the board and select the device to connect with from the list below. Then press 'Connect'. If the board already is connected and succesfully detected the board type will already be displayed. You can disconnect and select another device if you need to detect another board.</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;">Important:</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:10pt;">If you need to power your controller with an external power source if not using USB, please disconnect all components like ESC and servos connected to the output ports of the controller.</span></p></body></html> +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">OpenPilot board identification</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-family:'MS Shell Dlg 2'; font-size:8pt;"></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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">To continue, the wizard needs to determine the configuration required for the type of OpenPilot controller you have. When connected, the wizard will attempt to automatically detect the type of board.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Please connect the board to a USB port on your computer, or if a serial modem like BlueTooth, PipX or other, power up the board and select the device from the list below. Then press </span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600;">Connect</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">. If the board is already connected and successfully detected, the board type will already be displayed. You can disconnect and select another device if you need to detect another board.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Important:</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-family:'MS Shell Dlg 2'; font-size:10pt;">If you need to power your controller with an external power source and are not using USB, please disconnect all components, such as ESCs and servos connected to the output ports of the controller.</span></p></body></html> Qt::AutoText diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui index adeb1b87d..068203153 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui @@ -38,9 +38,9 @@ p, li { white-space: pre-wrap; } <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 setup procedure is now complete and you are one step away from having a complete setup of your OpenPilot controller.</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;">To complete the setup please push the Radio Setup Wizard button below to close this wizard and go directly to the Radio Setup Wizard.</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:10pt;">To complete the setup please click the Radio Setup Wizard button below to close this wizard and go directly to the Radio Setup Wizard.</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;">Or close this wizard and go to the Input tab in the Configuration Plugin and run the </span><span style=" font-size:10pt;">Radio Setup Wizard</span><span style=" font-size:10pt;"> to configure the input signals to be used before trying to operate your vehicle. If you already have performed the Radio configuration you can skip this step. </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:10pt;">Or, before trying to operate your vehicle, close this wizard, go to the Input tab in the Configuration plugin and run the Radio Setup Wizard to configure the input signals to be used. If you have already performed the Radio configuration, you can skip this step. </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></body></html> diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/fixedwingpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/fixedwingpage.ui index 0e4fde978..ed0e963e9 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/fixedwingpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/fixedwingpage.ui @@ -27,7 +27,7 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> 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;"> -<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 part 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;">The Fixed Wing section of the OpenPilot Setup Wizard is not yet implemented</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> diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui index 75323607b..f3e6743e2 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui @@ -26,15 +26,19 @@ <!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"> p, li { white-space: pre-wrap; } -</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;">OpenPilot configuration ready to save</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: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;">The wizard is now ready to save the configuration directly to your OpenPilot controller. </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;">If any of the selections made in this wizard requires a reboot of the controller then that will have to be performed after this step by power cycling the OpenPilot controller board.</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;">Press the Save button to save the 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:10pt;"><br /></p></body></html> +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">OpenPilot configuration ready to save</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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"></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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">The wizard is now ready to save the configuration directly to your OpenPilot controller. </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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">If any of the selections made in this wizard require a reboot of the controller, then power cycling the OpenPilot controller board will have to be performed after you save in this step.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Press the Save button to save the 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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/helipage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/helipage.ui index c3c6efd11..8e14881d9 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/helipage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/helipage.ui @@ -27,7 +27,7 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> 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;"> -<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 helicopter part 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;">The Helicopter section of the OpenPilot Setup Wizard is not yet implemented</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> diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui index 7446dbbc3..1b7b2575e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui @@ -29,9 +29,9 @@ 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;"> <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 basic input signal 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:12pt; font-weight:600;"></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;">The OpenPilot controller supports many different types of input signals. Please select the type of input that matches your receiver configuration. If you are unsure just leave the default option selected and continue the wizard.</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:10pt;">The OpenPilot controller supports many different types of input signals. Please select the type of input that matches your receiver configuration. If you are unsure, just leave the default option selected and continue the wizard.</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;"></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;">Some input options require the OpenPilot controller to be rebooted before the changes can take place. If an option that requires a reboot is selected the controller will need to be rebooted at the end of this wizard after the configuration is written to the controller.</span></p></body></html> +<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;">Some input options require the OpenPilot controller to be rebooted before the changes can take place. If an option that requires a reboot is selected, the controller will need to be rebooted at the end of this wizard after the configuration is written to the controller.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui index 493dbea91..ee29b25f0 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui @@ -26,12 +26,12 @@ <!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"> 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;"> -<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 controller levelling calibration procedure</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:12pt; font-weight:600;"></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;">The wizard needs to get information from the controller about in which position the vehicle normally is considered to be level. To be able to successfully perform these measurements you need to place the vehicle on a flat and as level as possible surface. Example of such surfaces could be a table top or the floor. Be careful to assure that the vehicle really is level since this step will affect the accelerometer and gyro bias in the controller software.</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;"></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;">To perform the levelling, please push the 'Calculate' button and wait for the process to finish.</span></p></body></html> +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">OpenPilot controller leveling calibration procedure</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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">The wizard needs to get information from the controller to determine in which position the vehicle is normally considered to be level. To be able to successfully perform these measurements, you need to place the vehicle on a surface that is as flat and level as possible. Examples of such surfaces could be a table top or the floor. Be careful to ensure that the vehicle really is level, since this step will affect the accelerometer and gyro bias in the controller software.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">To perform the leveling, please push the Calculate button and wait for the process to finish. </span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui index a369f1019..0b00607c6 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui @@ -29,7 +29,7 @@ p, li { white-space: pre-wrap; } </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;">OpenPilot multirotor 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: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 with multiple rotors. The wizard supports the most common types of multirotors. Other variants of multirotors can be configured by using custom configuration options in the configuration plugin in GCS.</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: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 multirotors. Other variants of multirotors 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 multirotor you want to create a configuration for below:</span></p></body></html> diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/notyetimplementedpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/notyetimplementedpage.ui index b5b54240d..776a53540 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/notyetimplementedpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/notyetimplementedpage.ui @@ -27,7 +27,7 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> 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;"> -<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;">This part 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;">This section of the OpenPilot Setup Wizard is not yet implemented</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> diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui index 69e00c08e..f98d5a497 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui @@ -49,7 +49,32 @@ - <html><head/><body><p><span style=" font-size:10pt;">It is now time to calibrate the output levels for the signals controlling your vehicle. </span></p><p align="center"><span style=" font-size:10pt; font-weight:600; color:#ff0000;">VERY IMPORTANT!</span><span style=" font-size:10pt;"><br/></span><span style=" font-size:10pt; font-weight:600; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICLE BEFORE PROCEEDING!</span></p><p><span style=" font-size:10pt; color:#000000;">Connect all components according to the illustration on the previous page and provide power using an external power supply like a battery to continue.</span></p><p><span style=" font-size:10pt;">Depending on what vehicle you have selected, both motors controlled by ESC and servos controlled directly by the OpenPilot controller may have to be calibrated. <br/>The following steps will guide you safely through this process.</span></p></body></html> + <!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"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">It is now time to calibrate the output levels for the signals controlling your vehicle. </span></p> +<p align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#ff0000;">VERY IMPORTANT!</span><span style=" font-size:10pt;"><br /></span><span style=" font-size:10pt; font-weight:600; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICLE BEFORE PROCEEDING!</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; color:#000000;">Connect all components according to the illustration on the previous page, and provide power using an external power supply like a battery to continue.</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Depending on what vehicle you have selected, both the motors controlled by ESCs and/or servos controlled directly by the OpenPilot controller may have to be calibrated. The following steps will guide you safely through this process. </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In this step we will set the neutral rate for the motor highlighted in the illustration to the right. </p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; color:#000000;">Please</span><span style=" font-size:10pt;"> pay attention to the </span><span style=" font-size:10pt; color:#000000;">details, and</span><span style=" font-size:10pt;"> in particular the </span><span style=" font-size:10pt; color:#000000;">motor’s</span><span style=" font-size:10pt; color:#0000ff;"> </span><span style=" font-size:10pt;">position and its rotation direction. </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">To find the neutral rate for this </span><span style=" font-size:10pt; color:#000000;">motor, click</span><span style=" font-size:10pt;"> the </span><span style=" font-size:10pt; font-weight:600; color:#000000;">Start</span><span style=" font-size:10pt;"> button below and </span><span style=" font-size:10pt; color:#000000;">move</span><span style=" font-size:10pt;"> the slider to the right </span><span style=" font-size:10pt; color:#000000;">just</span><span style=" font-size:10pt;"> until the </span><span style=" font-size:10pt; color:#000000;">motor</span><span style=" font-size:10pt;"> starts to spin </span><span style=" font-size:10pt; color:#000000;">smoothly</span><span style=" font-size:10pt;">. </span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">When </span><span style=" font-size:10pt; color:#000000;">done, click the </span><span style=" font-size:10pt; font-weight:600; color:#000000;">Start</span><span style=" font-size:10pt;"> button again to stop.</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">This step calibrates the center position of the servo. To set the center position for this servo, click the Start button below and move the slider to center the servo. </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;"></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;">When done, click the Start button again to stop. </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;"></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;">To protect the servo and other hardware from damage, we have to set the max and min angles for the servo. </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;"></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;">To set the minimum angle for the servo, click the Start button below, select the top slider and slide it to the left until min angle is reached.</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;"></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;">When done, click the Start button again to stop. </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;"></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;">To set the maximum angle for the servo, click the Start button below and select the top slider and slide it to the right until max angle is reached.</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;"></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;">When done, click the Start button again to stop. </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;"></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui index ca335eabc..a395ae4bc 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui @@ -29,11 +29,11 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">OpenPilot basic output signal 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">To set an optimal configuration of the output signals powering your motors used by your OpenPilot controller the wizard needs to know what type of Electronic Speed Controllers (ESC) you will use and what their capabilities are.</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-family:'MS Shell Dlg 2'; font-size:10pt;">To set an optimal configuration of the output signals powering your motors used by your OpenPilot controller the wizard needs to know what type of Electronic Speed Controllers (ESCs) you will use and what their capabilities are.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">Please select one of the options below. If you are unsure about the capabilities of your ESC:s just leave the default option selected and continue the wizard.</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-family:'MS Shell Dlg 2'; font-size:10pt;">Please select one of the options below. If you are unsure about the capabilities of your ESCs, just leave the default option selected and continue the wizard.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">To read more regarding ESC refresh rates, please see </span><a href="http://wiki.openpilot.org/display/Doc/TurboPWM+ESC%27s"><span style=" text-decoration: underline; color:#0000ff;">this article</span></a><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;"> in the OpenPilot WIki</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">To read more regarding ESC refresh rates, please see </span><a href="http://wiki.openpilot.org/display/Doc/TurboPWM+ESC%27s"><span style=" text-decoration: underline; color:#0000ff;">this article</span></a><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;"> in the OpenPilot Wiki</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui index cf9d87a86..b0e90baca 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui @@ -26,15 +26,18 @@ <!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"> p, li { white-space: pre-wrap; } -</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;">OpenPilot configuration summary</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: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;">The first part of this wizard is now complete. All information required to create a basic OpenPilot controller configuration for a specific vehicle has been collected.</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:10pt;">Below is a summary of the configuration and a button that links to a diagram illustrating how to connect required hardware and the OpenPilotController with the current 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: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;">To continue the wizard and go through some basic configuration steps please continue to the next step of this wizard.</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;"><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;">The following steps requires that your OpenPilot controller is set up according to the diagram and that the vehicle is </span><span style=" font-size:10pt; font-weight:600;">powered by a battery</span><span style=" font-size:10pt;"> as well as </span><span style=" font-size:10pt; font-weight:600;">connected to the computer</span><span style=" font-size:10pt;">.</span></p></body></html> +</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">OpenPilot configuration summary</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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"></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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">The first part of this wizard is now complete. All information required to create a basic OpenPilot controller configuration for a specific vehicle has been collected.</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-family:'MS Shell Dlg 2'; font-size:10pt;">Below is a summary of the configuration and a button that links to a diagram illustrating how to connect required hardware and the OpenPilotController with the current 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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">To continue the wizard and go through some basic configuration steps, please continue to the next step of this wizard.</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-family:'MS Shell Dlg 2'; font-size:8pt;"></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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">The following steps require that your OpenPilot controller is set up according to the diagram, it is </span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600;">connected to the computer</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;"> by USB, and that the vehicle is</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600;"> powered by a battery</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/surfacepage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/surfacepage.ui index 988bc300a..d592a4eaf 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/surfacepage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/surfacepage.ui @@ -27,7 +27,7 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> 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;"> -<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 surface vehicle part 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;">The Surface Vehicle section of the OpenPilot Setup Wizard is not yet implemented</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> diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui index 609f84d24..48ef24ac8 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui @@ -29,9 +29,9 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">Vehicle type selection</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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">To continue the wizard needs to know what type of vehicle that the OpenPilot controller board is going to be used with. This step is crucial since most of the following configuration is unique per vehicle type.</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-family:'MS Shell Dlg 2'; font-size:10pt;">To continue, the wizard needs to know what type of vehicle the OpenPilot controller board is going to be used with. This step is crucial, since most of the following configuration is unique per vehicle type.</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-family:'MS Shell Dlg 2'; font-size:8pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">So go ahead and select the type of vehicle you want to create a configuration for.</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">Go ahead and select the type of vehicle you want to create a configuration for.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop From 98db6469f9be0a5112b429a7dc55805c1e0eb878 Mon Sep 17 00:00:00 2001 From: Kevin Vertucio Date: Fri, 21 Sep 2012 07:52:24 -0400 Subject: [PATCH 43/56] copy/content revisions and corrections Fixed some corrections missed in SetupWizard Signed-off-by: Kevin Vertucio --- .../pages/outputcalibrationpage.ui | 35 +++++++++++-------- .../plugins/setupwizard/pages/outputpage.ui | 2 +- .../plugins/setupwizard/pages/summarypage.ui | 4 +-- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui index f98d5a497..6d06176d2 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui @@ -55,26 +55,33 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">It is now time to calibrate the output levels for the signals controlling your vehicle. </span></p> <p align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#ff0000;">VERY IMPORTANT!</span><span style=" font-size:10pt;"><br /></span><span style=" font-size:10pt; font-weight:600; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICLE BEFORE PROCEEDING!</span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; color:#000000;">Connect all components according to the illustration on the previous page, and provide power using an external power supply like a battery to continue.</span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Depending on what vehicle you have selected, both the motors controlled by ESCs and/or servos controlled directly by the OpenPilot controller may have to be calibrated. The following steps will guide you safely through this process. </span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In this step we will set the neutral rate for the motor highlighted in the illustration to the right. </p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; color:#000000;">Please</span><span style=" font-size:10pt;"> pay attention to the </span><span style=" font-size:10pt; color:#000000;">details, and</span><span style=" font-size:10pt;"> in particular the </span><span style=" font-size:10pt; color:#000000;">motor’s</span><span style=" font-size:10pt; color:#0000ff;"> </span><span style=" font-size:10pt;">position and its rotation direction. </span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">To find the neutral rate for this </span><span style=" font-size:10pt; color:#000000;">motor, click</span><span style=" font-size:10pt;"> the </span><span style=" font-size:10pt; font-weight:600; color:#000000;">Start</span><span style=" font-size:10pt;"> button below and </span><span style=" font-size:10pt; color:#000000;">move</span><span style=" font-size:10pt;"> the slider to the right </span><span style=" font-size:10pt; color:#000000;">just</span><span style=" font-size:10pt;"> until the </span><span style=" font-size:10pt; color:#000000;">motor</span><span style=" font-size:10pt;"> starts to spin </span><span style=" font-size:10pt; color:#000000;">smoothly</span><span style=" font-size:10pt;">. </span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">When </span><span style=" font-size:10pt; color:#000000;">done, click the </span><span style=" font-size:10pt; font-weight:600; color:#000000;">Start</span><span style=" font-size:10pt;"> button again to stop.</span></p> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">This step calibrates the center position of the servo. To set the center position for this servo, click the Start button below and move the slider to center the servo. </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;"></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;">Connect all components according to the illustration on the previous page, and provide power using an external power supply like a battery to continue.</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;">Depending on what vehicle you have selected, both the motors controlled by ESCs and/or servos controlled directly by the OpenPilot controller may have to be calibrated. </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:10pt;">The following steps will guide you safely through this process. </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;">In this step we will set the neutral rate for the motor highlighted in the illustration to the right. </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:10pt;">Please pay attention to the details, and in particular the motor’s position and its rotation direction.</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;">To find the neutral rate for this motor, click the Start button below and move the slider to the right just until the motor starts to spin smoothly. </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;">When done, click the Start button again to stop. </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;"></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;">This step calibrates the center position of the servo. To set the center position for this servo, click the Start button below and move the slider to center the servo. </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;">When done, click the Start button again to stop. </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;">To protect the servo and other hardware from damage, we have to set the max and min angles for the servo. </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;"></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;">To set the minimum angle for the servo, click the Start button below, select the top slider and slide it to the left until min angle is reached.</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;"></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;">When done, click the Start button again to stop. </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;"></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;">To set the maximum angle for the servo, click the Start button below and select the top slider and slide it to the right until max angle is reached.</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;"></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;">When done, click the Start button again to stop. </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;"></p></body></html> +<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="-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></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui index a395ae4bc..a89c1fc77 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputpage.ui @@ -29,7 +29,7 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">OpenPilot basic output signal 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">To set an optimal configuration of the output signals powering your motors used by your OpenPilot controller the wizard needs to know what type of Electronic Speed Controllers (ESCs) you will use and what their capabilities are.</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-family:'MS Shell Dlg 2'; font-size:10pt;">To set an optimal configuration of the output signals powering your motors, the wizard needs to know what type of Electronic Speed Controllers (ESCs) you will use and what their capabilities are.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">Please select one of the options below. If you are unsure about the capabilities of your ESCs, just leave the default option selected and continue the wizard.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></p> diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui index b0e90baca..ee6607842 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui @@ -33,10 +33,8 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">The first part of this wizard is now complete. All information required to create a basic OpenPilot controller configuration for a specific vehicle has been collected.</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-family:'MS Shell Dlg 2'; font-size:10pt;">Below is a summary of the configuration and a button that links to a diagram illustrating how to connect required hardware and the OpenPilotController with the current 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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">To continue the wizard and go through some basic configuration steps, please continue to the next step of this wizard.</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-family:'MS Shell Dlg 2'; font-size:8pt;"></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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">The following steps require that your OpenPilot controller is set up according to the diagram, it is </span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600;">connected to the computer</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;"> by USB, and that the vehicle is</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600;"> powered by a battery</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">.</span></p></body></html> From 6eaa2daab12ccf025ba305f5a644b0de21c6ffd7 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sat, 22 Sep 2012 11:21:12 +0200 Subject: [PATCH 44/56] OP-39 Fixed some layout issues on the output calibration page. --- .../pages/outputcalibrationpage.ui | 40 ++++--------------- 1 file changed, 8 insertions(+), 32 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui index 6d06176d2..5947e6e3c 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui @@ -52,36 +52,12 @@ <!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"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">It is now time to calibrate the output levels for the signals controlling your vehicle. </span></p> -<p align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#ff0000;">VERY IMPORTANT!</span><span style=" font-size:10pt;"><br /></span><span style=" font-size:10pt; font-weight:600; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICLE BEFORE PROCEEDING!</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:10pt;">Connect all components according to the illustration on the previous page, and provide power using an external power supply like a battery to continue.</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;">Depending on what vehicle you have selected, both the motors controlled by ESCs and/or servos controlled directly by the OpenPilot controller may have to be calibrated. </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:10pt;">The following steps will guide you safely through this process. </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;">In this step we will set the neutral rate for the motor highlighted in the illustration to the right. </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:10pt;">Please pay attention to the details, and in particular the motor’s position and its rotation direction.</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;">To find the neutral rate for this motor, click the Start button below and move the slider to the right just until the motor starts to spin smoothly. </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;">When done, click the Start button again to stop. </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;">This step calibrates the center position of the servo. To set the center position for this servo, click the Start button below and move the slider to center the servo. </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;">When done, click the Start button again to stop. </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;">To protect the servo and other hardware from damage, we have to set the max and min angles for the servo. </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;">To set the minimum angle for the servo, click the Start button below, select the top slider and slide it to the left until min angle is reached.</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;">When done, click the Start button again to stop. </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;">To set the maximum angle for the servo, click the Start button below and select the top slider and slide it to the right until max angle is reached.</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;">When done, click the Start button again to stop. </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="-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></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:10pt;">It is now time to calibrate the output levels for the signals controlling your vehicle. </span></p> +<p align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:10pt; font-weight:600; color:#ff0000;">VERY IMPORTANT!</span><span style=" font-family:'Lucida Grande'; font-size:10pt;"><br /></span><span style=" font-family:'Lucida Grande'; font-size:10pt; font-weight:600; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICLE BEFORE PROCEEDING!</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-family:'Lucida Grande'; font-size:10pt;">Connect all components according to the illustration on the previous page, and provide power using an external power supply like a battery to continue.</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-family:'Lucida Grande'; 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-family:'Lucida Grande'; font-size:10pt;">Depending on what vehicle you have selected, both the motors controlled by ESCs and/or servos controlled directly by the OpenPilot controller may have to be calibrated. The following steps will guide you safely through this process. </span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -453,7 +429,7 @@ p, li { white-space: pre-wrap; } - 148 + 150 340 75 23 @@ -469,7 +445,7 @@ p, li { white-space: pre-wrap; } - 68 + 70 340 75 23 From 5ecf04fb159a5128be69d4f758c5e5d435703ca9 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sun, 23 Sep 2012 14:11:32 +0200 Subject: [PATCH 45/56] OP-39 Restricting connection device to USB when using the wizard. Changed text accordingly. --- .../setupwizard/pages/controllerpage.cpp | 6 +++++- .../setupwizard/pages/controllerpage.ui | 19 +++++++------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp index 1a0c06457..b17c26ab6 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp @@ -70,7 +70,8 @@ void ControllerPage::initializePage() bool ControllerPage::isComplete() const { - return m_connectionManager->isConnected() && ui->boardTypeCombo->currentIndex() > 0; + return m_connectionManager->isConnected() && ui->boardTypeCombo->currentIndex() > 0 && + m_connectionManager->getCurrentDevice().getConName().startsWith("USB:", Qt::CaseInsensitive); } bool ControllerPage::validatePage() @@ -150,6 +151,9 @@ void ControllerPage::devicesChanged(QLinkedList devices) ui->deviceCombo->addItem(deviceItem.getConName()); QString deviceName = (const QString)deviceItem.getConName(); ui->deviceCombo->setItemData(ui->deviceCombo->count() - 1, deviceName, Qt::ToolTipRole); + if(!deviceName.startsWith("USB:", Qt::CaseInsensitive)) { + ui->deviceCombo->setItemData(ui->deviceCombo->count() - 1, QVariant(0), Qt::UserRole - 1); + } if(currSelectedDeviceName != "" && currSelectedDeviceName == deviceName) { indexOfSelectedItem = i; } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui index 0a3182426..8164d77e7 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui @@ -26,18 +26,13 @@ <!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"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">OpenPilot board identification</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-family:'MS Shell Dlg 2'; font-size:8pt;"></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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">To continue, the wizard needs to determine the configuration required for the type of OpenPilot controller you have. When connected, the wizard will attempt to automatically detect the type of board.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Please connect the board to a USB port on your computer, or if a serial modem like BlueTooth, PipX or other, power up the board and select the device from the list below. Then press </span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600;">Connect</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">. If the board is already connected and successfully detected, the board type will already be displayed. You can disconnect and select another device if you need to detect another board.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Important:</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-family:'MS Shell Dlg 2'; font-size:10pt;">If you need to power your controller with an external power source and are not using USB, please disconnect all components, such as ESCs and servos connected to the output ports of the controller.</span></p></body></html> +</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;">OpenPilot board identification</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;"><br /></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-family:'Lucida Grande'; font-size:13pt;"><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;">To continue, the wizard needs to determine the configuration required for the type of OpenPilot controller you have. When connected, the wizard will attempt to automatically detect the type of board.</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 connect the board to a USB port on your computer and select the device from the list below. Then press </span><span style=" font-size:10pt; font-weight:600;">Connect</span><span style=" font-size:10pt;">. If the board is already connected and successfully detected, the board type will already be displayed. You can disconnect and select another device if you need to detect another board.</span></p></body></html> Qt::AutoText From 3ef26a633ab09fc2407199822fd610264fe0a05f Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sun, 23 Sep 2012 21:58:37 +0200 Subject: [PATCH 46/56] OP-39 Moved reboot page to directly after Rx config page. Added partial save to support changed hardware settings. Made it possible to skip leveling procedure. Changed some texts. Changed isRebootRequired() criteria. --- .../plugins/setupwizard/pages/flashpage.cpp | 1 + .../plugins/setupwizard/pages/inputpage.cpp | 2 +- .../setupwizard/pages/levellingpage.cpp | 4 +-- .../plugins/setupwizard/pages/rebootpage.cpp | 11 ++++---- .../plugins/setupwizard/pages/rebootpage.ui | 4 +-- .../src/plugins/setupwizard/setupwizard.cpp | 21 ++++++++++----- .../src/plugins/setupwizard/setupwizard.h | 1 + .../vehicleconfigurationhelper.cpp | 26 ++++++++++++------- .../setupwizard/vehicleconfigurationhelper.h | 3 +-- 9 files changed, 44 insertions(+), 29 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp index c31cda0c6..5a5900ac7 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp @@ -90,6 +90,7 @@ void FlashPage::enableButtons(bool enable) void FlashPage::saveProgress(int total, int current, QString description) { + qDebug() << "Progress " << current << "(" << total << ")"; if(ui->saveProgressBar->maximum() != total) { ui->saveProgressBar->setMaximum(total); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp index b442db3a5..607df838a 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.cpp @@ -62,7 +62,7 @@ bool InputPage::validatePage() else { getWizard()->setInputType(SetupWizard::INPUT_PWM); } - getWizard()->setRestartNeeded(restartNeeded(getWizard()->getInputType())); + getWizard()->setRestartNeeded(getWizard()->isRestartNeeded() || restartNeeded(getWizard()->getInputType())); return true; } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp index 6d7340f4e..a00959522 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -54,8 +54,8 @@ bool LevellingPage::validatePage() bool LevellingPage::isComplete() const { - return const_cast(this)->getWizard()->isLevellingPerformed() && - ui->levelButton->isEnabled(); + //const_cast(this)->getWizard()->isLevellingPerformed() && + return ui->levelButton->isEnabled(); } void LevellingPage::enableButtons(bool enable) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.cpp index 4a2100e3a..43153380b 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.cpp @@ -46,10 +46,12 @@ RebootPage::~RebootPage() void RebootPage::initializePage() { - connect(&m_timer, SIGNAL(timeout()), this, SLOT(toggleLabel())); - m_timer.setInterval(500); - m_timer.setSingleShot(false); - m_timer.start(); + if(!m_timer.isActive()) { + connect(&m_timer, SIGNAL(timeout()), this, SLOT(toggleLabel())); + m_timer.setInterval(500); + m_timer.setSingleShot(false); + m_timer.start(); + } } bool RebootPage::validatePage() @@ -62,5 +64,4 @@ void RebootPage::toggleLabel() m_toggl = !m_toggl; ui->yellowLabel->setVisible(m_toggl); ui->redLabel->setVisible(!m_toggl); - qDebug() << "Toggle = " << m_toggl; } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui index b808d13b1..f1720a3a5 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui @@ -42,7 +42,7 @@ p, li { white-space: pre-wrap; } 50 180 501 - 71 + 101 @@ -50,7 +50,7 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> -<p align="center" 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; color:#000000;">The configuration created by the wizard contains settings that require a reboot of your controller. Please power cycle the controller before continuing. To power cycle the controller remove all batteries and the usb cable for at least 30 seconds.</span></p></body></html> +<p align="center" 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; color:#000000;">The configuration created by the wizard contains settings that require a reboot of your controller. Please power cycle the controller before continuing. To power cycle the controller remove all batteries and the usb cable for at least 30 seconds. </span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index 95fc75747..7d30b6d1a 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -96,6 +96,14 @@ int SetupWizard::nextId() const case PAGE_MULTI: return PAGE_OUTPUT; case PAGE_INPUT: + if(isRestartNeeded()) { + saveHardwareSettings(); + return PAGE_REBOOT; + } + else { + return PAGE_VEHICLES; + } + case PAGE_REBOOT: return PAGE_VEHICLES; case PAGE_OUTPUT: return PAGE_SUMMARY; @@ -106,13 +114,6 @@ int SetupWizard::nextId() const case PAGE_SUMMARY: return PAGE_LEVELLING; case PAGE_FLASH: - if(isRestartNeeded()) { - return PAGE_REBOOT; - } - else { - return PAGE_END; - } - case PAGE_REBOOT: return PAGE_END; case PAGE_NOTYETIMPLEMENTED: return PAGE_END; @@ -271,3 +272,9 @@ void SetupWizard::createPages() setStartId(PAGE_START); } + +bool SetupWizard::saveHardwareSettings() const +{ + VehicleConfigurationHelper helper(const_cast(this)); + return helper.setupHardwareSettings(); +} diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h index 8c908e92a..72458ffe6 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h @@ -85,6 +85,7 @@ private: PAGE_HELI, PAGE_SURFACE, PAGE_INPUT, PAGE_OUTPUT, PAGE_LEVELLING, PAGE_CALIBRATION, PAGE_FLASH, PAGE_SUMMARY, PAGE_NOTYETIMPLEMENTED, PAGE_REBOOT, PAGE_END}; void createPages(); + bool saveHardwareSettings() const; CONTROLLER_TYPE m_controllerType; VEHICLE_TYPE m_vehicleType; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp index add4e8a29..6d0a5946e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -55,11 +55,11 @@ bool VehicleConfigurationHelper::setupVehicle(bool save) clearModifiedObjects(); resetVehicleConfig(); resetGUIData(); - if(!saveChangesToController(save)) - { + if(!saveChangesToController(save)) { return false; } + m_progress = 0; applyHardwareConfiguration(); applyVehicleConfiguration(); applyActuatorConfiguration(); @@ -69,12 +69,19 @@ bool VehicleConfigurationHelper::setupVehicle(bool save) applyManualControlDefaults(); bool result = saveChangesToController(save); - if(result) { - emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Done!")); - } - else { - emit saveProgress(PROGRESS_STEPS, ++m_progress, tr("Failed!")); - } + emit saveProgress(m_modifiedObjects.count() + 1, ++m_progress, result ? tr("Done!") : tr("Failed!")); + return result; +} + +bool VehicleConfigurationHelper::setupHardwareSettings(bool save) +{ + m_progress = 0; + clearModifiedObjects(); + applyHardwareConfiguration(); + applyManualControlDefaults(); + + bool result = saveChangesToController(save); + emit saveProgress(m_modifiedObjects.count() + 1, ++m_progress, result ? tr("Done!") : tr("Failed!")); return result; } @@ -429,7 +436,7 @@ bool VehicleConfigurationHelper::saveChangesToController(bool save) QString objDescription = objPair->second; if(UAVObject::GetGcsAccess(obj->getMetadata()) != UAVObject::ACCESS_READONLY && obj->isSettings()) { - emit saveProgress(PROGRESS_STEPS, ++m_progress, objDescription); + emit saveProgress(m_modifiedObjects.count() + 1, ++m_progress, objDescription); m_currentTransactionObjectID = obj->getObjID(); @@ -490,7 +497,6 @@ bool VehicleConfigurationHelper::saveChangesToController(bool save) qDebug() << "Finished saving modified objects to controller. Success = " << m_transactionOK; - clearModifiedObjects(); return m_transactionOK; } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h index 0810d3390..430594d7a 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h @@ -61,6 +61,7 @@ class VehicleConfigurationHelper : public QObject public: VehicleConfigurationHelper(VehicleConfigurationSource* configSource); bool setupVehicle(bool save = true); + bool setupHardwareSettings(bool save = true); static const qint16 LEGACY_ESC_FREQUENCE; static const qint16 RAPID_ESC_FREQUENCE; @@ -72,8 +73,6 @@ private: static const int MIXER_TYPE_MOTOR = 1; static const int MIXER_TYPE_SERVO = 2; - static const int PROGRESS_STEPS = 11; - VehicleConfigurationSource *m_configSource; UAVObjectManager *m_uavoManager; From e7e95412e86966aae18f4e67473532c253898adf Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Wed, 26 Sep 2012 00:42:17 +0200 Subject: [PATCH 47/56] OP-39 Fixed Wizard Style so that it looks ok on Mac and Windows Changed the output calibration part of the wizard so that it is a part of the wizard flow instead of a separate flow inside one page. --- .../setupwizard/pages/abstractwizardpage.h | 2 + .../plugins/setupwizard/pages/multipage.ui | 21 ++++++++ .../pages/outputcalibrationpage.cpp | 34 ++++++------- .../setupwizard/pages/outputcalibrationpage.h | 10 ++-- .../pages/outputcalibrationpage.ui | 51 ++++--------------- .../src/plugins/setupwizard/setupwizard.cpp | 24 ++++++++- .../src/plugins/setupwizard/setupwizard.h | 6 ++- 7 files changed, 83 insertions(+), 65 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/abstractwizardpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/abstractwizardpage.h index 072d619e7..bb4960a32 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/abstractwizardpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/abstractwizardpage.h @@ -42,6 +42,8 @@ private: public: SetupWizard* getWizard() { return m_wizard; } + virtual bool isFinished() { return true; } + virtual quint16 stage() { return 0; } }; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui index 0b00607c6..22e244836 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.ui @@ -55,6 +55,9 @@ p, li { white-space: pre-wrap; } 0 + + false + QFrame::NoFrame @@ -70,6 +73,24 @@ p, li { white-space: pre-wrap; } Qt::ScrollBarAlwaysOff + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + false diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp index 812694f66..d91dddc81 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.cpp @@ -32,7 +32,7 @@ OutputCalibrationPage::OutputCalibrationPage(SetupWizard *wizard, QWidget *parent) : AbstractWizardPage(wizard, parent), ui(new Ui::OutputCalibrationPage), m_vehicleBoundsItem(0), - m_currentWizardIndex(0), m_calibrationUtil(0) + m_currentWizardIndex(-1), m_calibrationUtil(0) { ui->setupUi(this); @@ -171,8 +171,6 @@ void OutputCalibrationPage::setWizardPage() { qDebug() << "Wizard index: " << m_currentWizardIndex; m_calibrationUtil->stopChannelOutput(); - ui->backPageButton->setEnabled(m_currentWizardIndex > 0); - ui->nextPageButton->setEnabled(m_currentWizardIndex < m_wizardIndexes.size() - 1); QApplication::processEvents(); @@ -211,8 +209,14 @@ void OutputCalibrationPage::initializePage() bool OutputCalibrationPage::validatePage() { - getWizard()->setActuatorSettings(m_actuatorSettings); - return true; + if(isFinished()) { + getWizard()->setActuatorSettings(m_actuatorSettings); + return true; + } else { + m_currentWizardIndex++; + setWizardPage(); + return false; + } } void OutputCalibrationPage::showEvent(QShowEvent *event) @@ -224,20 +228,17 @@ void OutputCalibrationPage::showEvent(QShowEvent *event) } } -void OutputCalibrationPage::on_nextPageButton_clicked() +void OutputCalibrationPage::customBackClicked() { - if(m_currentWizardIndex < m_wizardIndexes.size() - 1) { - m_currentWizardIndex++; - setWizardPage(); - } -} - -void OutputCalibrationPage::on_backPageButton_clicked() -{ - if(m_currentWizardIndex > 0) { + if(m_currentWizardIndex > 0) + { m_currentWizardIndex--; setWizardPage(); } + else + { + getWizard()->back(); + } } quint16 OutputCalibrationPage::getCurrentChannel() @@ -247,9 +248,8 @@ quint16 OutputCalibrationPage::getCurrentChannel() void OutputCalibrationPage::enableButtons(bool enable) { - ui->nextPageButton->setEnabled(enable && (m_currentWizardIndex < m_wizardIndexes.size() - 1)); - ui->backPageButton->setEnabled(enable && (m_currentWizardIndex > 0)); getWizard()->button(QWizard::NextButton)->setEnabled(enable); + getWizard()->button(QWizard::CustomButton1)->setEnabled(enable); getWizard()->button(QWizard::CancelButton)->setEnabled(enable); getWizard()->button(QWizard::BackButton)->setEnabled(enable); QApplication::processEvents(); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h index bf646e2f1..76af9534e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.h @@ -48,13 +48,15 @@ public: void initializePage(); bool validatePage(); + bool isFinished() { return m_currentWizardIndex >= m_wizardIndexes.size() - 1; } + protected: void showEvent(QShowEvent *event); -private slots: - void on_nextPageButton_clicked(); - void on_backPageButton_clicked(); +public slots: + void customBackClicked(); +private slots: void on_motorNeutralButton_toggled(bool checked); void on_motorNeutralSlider_valueChanged(int value); @@ -84,7 +86,7 @@ private: QGraphicsScene *m_vehicleScene; QGraphicsSvgItem *m_vehicleBoundsItem; - quint16 m_currentWizardIndex; + qint16 m_currentWizardIndex; QList m_vehicleElementIds; QList m_vehicleItems; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui index 5947e6e3c..22e0f0eec 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui @@ -19,7 +19,7 @@ 300 40 270 - 270 + 341 @@ -32,7 +32,7 @@ 20 40 270 - 291 + 341 @@ -45,7 +45,7 @@ 0 10 261 - 281 + 321 @@ -94,7 +94,7 @@ p, li { white-space: pre-wrap; } 10 - 200 + 250 241 19 @@ -128,7 +128,7 @@ p, li { white-space: pre-wrap; } 90 - 240 + 290 75 23 @@ -171,7 +171,7 @@ p, li { white-space: pre-wrap; } 10 - 200 + 250 241 19 @@ -214,7 +214,7 @@ p, li { white-space: pre-wrap; } 90 - 240 + 290 75 23 @@ -235,7 +235,7 @@ p, li { white-space: pre-wrap; } 90 - 240 + 290 75 23 @@ -276,7 +276,7 @@ p, li { white-space: pre-wrap; } 10 - 200 + 250 241 20 @@ -321,7 +321,7 @@ p, li { white-space: pre-wrap; } 90 - 240 + 290 75 23 @@ -343,7 +343,7 @@ p, li { white-space: pre-wrap; } 10 - 200 + 250 241 20 @@ -426,35 +426,6 @@ p, li { white-space: pre-wrap; } Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - 150 - 340 - 75 - 23 - - - - > - - - - - false - - - - 70 - 340 - 75 - 23 - - - - < - - diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index 7d30b6d1a..888e64035 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -39,9 +39,9 @@ #include "pages/levellingpage.h" #include "pages/summarypage.h" #include "pages/flashpage.h" -#include "pages/outputcalibrationpage.h" #include "pages/notyetimplementedpage.h" #include "pages/rebootpage.h" +#include "pages/outputcalibrationpage.h" #include "extensionsystem/pluginmanager.h" #include "vehicleconfigurationhelper.h" #include "actuatorsettings.h" @@ -53,12 +53,13 @@ SetupWizard::SetupWizard(QWidget *parent) : QWizard(parent), VehicleConfiguratio { setWindowTitle(tr("OpenPilot Setup Wizard")); setOption(QWizard::IndependentPages, false); - setFixedSize(640, 530); for(quint16 i = 0; i < ActuatorSettings::CHANNELMAX_NUMELEM; i++) { m_actuatorSettings << actuatorChannelSettings(); } createPages(); + setWizardStyle(QWizard::ModernStyle); + setFixedSize(640, 530); } int SetupWizard::nextId() const @@ -245,9 +246,11 @@ QString SetupWizard::getSummaryText() summary.append(tr("Unknown")); } + /* summary.append("
"); summary.append("").append(tr("Reboot required: ")).append(""); summary.append(isRestartNeeded() ? tr("Yes") : tr("No")); + */ return summary; } @@ -271,6 +274,23 @@ void SetupWizard::createPages() setPage(PAGE_END, new EndPage(this)); setStartId(PAGE_START); + + connect(button(QWizard::CustomButton1), SIGNAL(clicked()), this, SLOT(customBackClicked())); + setButtonText(QWizard::CustomButton1, buttonText(QWizard::BackButton)); + QList button_layout; + button_layout << QWizard::Stretch << QWizard::CustomButton1 << QWizard::NextButton << QWizard::CancelButton; + setButtonLayout(button_layout); + +} + +void SetupWizard::customBackClicked() +{ + if(currentId() == PAGE_CALIBRATION) { + static_cast(currentPage())->customBackClicked(); + } + else { + back(); + } } bool SetupWizard::saveHardwareSettings() const diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h index 72458ffe6..1a8728714 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h @@ -35,7 +35,6 @@ #include "vehicleconfigurationsource.h" #include "vehicleconfigurationhelper.h" - class SetupWizard : public QWizard, public VehicleConfigurationSource { Q_OBJECT @@ -79,7 +78,8 @@ public: } return m_connectionManager; } - +private slots: + void customBackClicked(); private: enum {PAGE_START, PAGE_CONTROLLER, PAGE_VEHICLES, PAGE_MULTI, PAGE_FIXEDWING, PAGE_HELI, PAGE_SURFACE, PAGE_INPUT, PAGE_OUTPUT, PAGE_LEVELLING, PAGE_CALIBRATION, @@ -101,6 +101,8 @@ private: bool m_restartNeeded; + bool m_back; + Core::ConnectionManager *m_connectionManager; }; From efd953b00c8bb8c3f4defd10b3cbb5a689c2d421 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Thu, 27 Sep 2012 08:18:50 +0200 Subject: [PATCH 48/56] OP-39 Fixed a bug in Welcome page button. --- .../openpilotgcs/src/plugins/welcome/qml/WelcomePageButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/welcome/qml/WelcomePageButton.qml b/ground/openpilotgcs/src/plugins/welcome/qml/WelcomePageButton.qml index 4874022be..9e5c1a74f 100644 --- a/ground/openpilotgcs/src/plugins/welcome/qml/WelcomePageButton.qml +++ b/ground/openpilotgcs/src/plugins/welcome/qml/WelcomePageButton.qml @@ -4,7 +4,7 @@ import QtQuick 1.1 Item { id: welcomeButton width: Math.max(116, icon.width) - height: 116 + height: icon.height z: 0 property string baseIconName From fdec9ce1494377166d213cdacb42791f7c1be606 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sat, 29 Sep 2012 11:47:16 +0200 Subject: [PATCH 49/56] OP-39 Fixed a lot of textual stuff. Changed layout on some pages to make room for longer texts. Changed default neutral value for output from 1080 to 1000. Renamed 'Hexacopter H' to 'Hexacopter X' --- .../setupwizard/pages/controllerpage.ui | 15 ++++---- .../src/plugins/setupwizard/pages/endpage.ui | 4 +-- .../plugins/setupwizard/pages/flashpage.ui | 28 +++++++-------- .../plugins/setupwizard/pages/inputpage.ui | 2 +- .../setupwizard/pages/levellingpage.ui | 4 +-- .../plugins/setupwizard/pages/multipage.cpp | 2 +- .../pages/outputcalibrationpage.ui | 16 ++++----- .../plugins/setupwizard/pages/rebootpage.ui | 2 +- .../plugins/setupwizard/pages/startpage.ui | 34 +++++++------------ .../plugins/setupwizard/pages/summarypage.ui | 29 ++++++++-------- .../plugins/setupwizard/pages/vehiclepage.ui | 21 +++++++----- .../src/plugins/setupwizard/setupwizard.cpp | 2 +- .../setupwizard/vehicleconfigurationsource.h | 2 +- 13 files changed, 78 insertions(+), 83 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui index 8164d77e7..3b06fa756 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui @@ -29,10 +29,11 @@ p, li { white-space: pre-wrap; } </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;">OpenPilot board identification</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;"><br /></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-family:'Lucida Grande'; font-size:13pt;"><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;">To continue, the wizard needs to determine the configuration required for the type of OpenPilot controller you have. When connected, the wizard will attempt to automatically detect the type of board.</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:10pt;">To continue, the wizard needs to determine the configuration required for the type of OpenPilot controller you have. When connected, the wizard will attempt to automatically detect the type of board.</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 connect the board to a USB port on your computer and select the device from the list below. Then press </span><span style=" font-size:10pt; font-weight:600;">Connect</span><span style=" font-size:10pt;">. If the board is already connected and successfully detected, the board type will already be displayed. You can disconnect and select another device if you need to detect another board.</span></p></body></html> +<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;">If the board is already connected and successfully detected, the board type will already be displayed. You can </span><span style=" font-size:10pt; font-weight:600;">Disconnect</span><span style=" font-size:10pt;"> and select another device if you need to detect another board.</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;">If your board is not connected please connect the board to a USB port on your computer and select the device from the list below. Then press </span><span style=" font-size:10pt; font-weight:600;">Connect</span><span style=" font-size:10pt;">.</span></p></body></html>
Qt::AutoText @@ -47,9 +48,9 @@ p, li { white-space: pre-wrap; } - 490 + 460 350 - 70 + 100 23 @@ -85,7 +86,7 @@ p, li { white-space: pre-wrap; } 170 350 - 300 + 279 22 @@ -95,7 +96,7 @@ p, li { white-space: pre-wrap; } 170 310 - 300 + 279 22
diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui index 068203153..c85c08176 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui @@ -25,7 +25,7 @@ 20 20 550 - 211 + 251
@@ -36,7 +36,7 @@ p, li { white-space: pre-wrap; } <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;">Congratulations!</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;">Setup wizard is completed.</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: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 setup procedure is now complete and you are one step away from having a complete setup of your OpenPilot controller.</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:10pt;">This part of the setup procedure is now complete and you are one step away from completing the setup of your OpenPilot controller.</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;">To complete the setup please click the Radio Setup Wizard button below to close this wizard and go directly to the Radio Setup Wizard.</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> diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui index f3e6743e2..0f5f62e9f 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui @@ -19,26 +19,24 @@ 20 20 541 - 201 + 231 <!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"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">OpenPilot configuration ready to save</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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"></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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">The wizard is now ready to save the configuration directly to your OpenPilot controller. </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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">If any of the selections made in this wizard require a reboot of the controller, then power cycling the OpenPilot controller board will have to be performed after you save in this step.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Press the Save button to save the 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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></span></p></body></html> +</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;">OpenPilot configuration ready to save</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: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;">The wizard is now ready to save the configuration directly to your OpenPilot controller. </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="-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;">If any of the selections made in this wizard require a reboot of the controller, then power cycling the OpenPilot controller board will have to be performed after you save in this step.</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;">Press the Save button to save the 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: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;"><br /></span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -51,7 +49,7 @@ p, li { white-space: pre-wrap; } 225 - 250 + 260 150 70 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui index 1b7b2575e..6212b1e3d 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui @@ -19,7 +19,7 @@ 20 20 541 - 171 + 221 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui index ee29b25f0..77152f792 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui @@ -19,7 +19,7 @@ 20 20 541 - 201 + 241 @@ -44,7 +44,7 @@ p, li { white-space: pre-wrap; } 200 - 250 + 270 200 70 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp index 3b986d6e9..26076f39e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/multipage.cpp @@ -92,7 +92,7 @@ void MultiPage::setupMultiTypesCombo() ui->typeCombo->addItem(tr("Hexacopter Coax (Y6)"), SetupWizard::MULTI_ROTOR_HEXA_COAX_Y); m_descriptions << tr("Hexacopter Coax (Y6)"); - ui->typeCombo->addItem(tr("Hexacopter H"), SetupWizard::MULTI_ROTOR_HEXA_H); + ui->typeCombo->addItem(tr("Hexacopter X"), SetupWizard::MULTI_ROTOR_HEXA_H); m_descriptions << tr("Hexacopter H"); // Fredrik Arvidsson(m_thread) 2012-08-26 Disable Octos until further notice diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui index 22e0f0eec..6b6d8810f 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/outputcalibrationpage.ui @@ -16,7 +16,7 @@ - 300 + 310 40 270 341 @@ -31,7 +31,7 @@ 20 40 - 270 + 290 341 @@ -44,7 +44,7 @@ 0 10 - 261 + 270 321 @@ -55,7 +55,7 @@ p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:10pt;">It is now time to calibrate the output levels for the signals controlling your vehicle. </span></p> <p align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lucida Grande'; font-size:10pt; font-weight:600; color:#ff0000;">VERY IMPORTANT!</span><span style=" font-family:'Lucida Grande'; font-size:10pt;"><br /></span><span style=" font-family:'Lucida Grande'; font-size:10pt; font-weight:600; color:#ff0000;">REMOVE ALL PROPELLERS FROM THE VEHICLE BEFORE PROCEEDING!</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-family:'Lucida Grande'; font-size:10pt;">Connect all components according to the illustration on the previous page, and provide power using an external power supply like a battery to continue.</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-family:'Lucida Grande'; font-size:10pt;">Connect all components according to the illustration on the summary page, and provide power using an external power supply such as a battery before continuing.</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-family:'Lucida Grande'; 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-family:'Lucida Grande'; font-size:10pt;">Depending on what vehicle you have selected, both the motors controlled by ESCs and/or servos controlled directly by the OpenPilot controller may have to be calibrated. The following steps will guide you safely through this process. </span></p></body></html> @@ -74,7 +74,7 @@ p, li { white-space: pre-wrap; } 0 10 261 - 141 + 221 @@ -151,7 +151,7 @@ p, li { white-space: pre-wrap; } 0 10 261 - 141 + 201 @@ -256,7 +256,7 @@ p, li { white-space: pre-wrap; } 0 10 261 - 151 + 211 @@ -388,7 +388,7 @@ p, li { white-space: pre-wrap; } 0 10 261 - 151 + 211 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui index f1720a3a5..a7340144f 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui @@ -42,7 +42,7 @@ p, li { white-space: pre-wrap; } 50 180 501 - 101 + 151 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui index 48c41f15f..3481e4b8e 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/startpage.ui @@ -32,27 +32,19 @@ <!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"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">Welcome to the OpenPilot Setup Wizard</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-family:'MS Shell Dlg 2'; font-size:8pt;"></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-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">This wizard will guide you through the basic steps required to setup your OpenPilot controller for the first time. You will be asked questions about your platform (multirotor/heli/fixed-wing) which this wizard will use to configure your aircraft for your maiden flight. </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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">This wizard does not configure all of the advanced settings available in the GCS Configuration. All basic and advanced configuration parameters can be modified later by using the GCS Configuration plugin.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600; color:#ff0000;">WARNING: YOU MUST REMOVE ALL PROPELLERS </span></p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600; color:#ff0000;">FROM THE VEHICLE BEFORE PROCEEDING!</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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">Disregarding this warning puts you at</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600; color:#000000;"> risk of very serious injury</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">!</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;"><br /></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;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><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-family:'MS Shell Dlg 2'; font-size:10pt;">Now that your props are removed we can get started. Ready?</span></p></body></html> +</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;">Welcome to the OpenPilot Setup Wizard</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;"><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 wizard will guide you through the basic steps required to setup your OpenPilot controller for the first time. You will be asked questions about your platform (multirotor/heli/fixed-wing) which this wizard will use to configure your aircraft for your maiden flight. </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;">This wizard does not configure all of the advanced settings available in the GCS Configuration. All basic and advanced configuration parameters can be modified later by using the GCS Configuration plugin.</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 align="center" 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; color:#ff0000;">WARNING: YOU MUST REMOVE ALL PROPELLERS </span></p> +<p align="center" 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; color:#ff0000;">FROM THE VEHICLE BEFORE PROCEEDING!</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-family:'Lucida Grande'; font-size:13pt;"><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;">Disregarding this warning puts you at</span><span style=" font-size:10pt; font-weight:600; color:#000000;"> risk of very serious injury</span><span style=" font-size:10pt;">!</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;">Now that your props are removed we can get started. Ready?</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui index ee6607842..879cfeb52 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/summarypage.ui @@ -19,23 +19,22 @@ 20 20 541 - 211 + 241 <!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"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">OpenPilot configuration summary</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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"></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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"><br /></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-family:'MS Shell Dlg 2'; font-size:10pt;">The first part of this wizard is now complete. All information required to create a basic OpenPilot controller configuration for a specific vehicle has been collected.</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-family:'MS Shell Dlg 2'; font-size:10pt;">Below is a summary of the configuration and a button that links to a diagram illustrating how to connect required hardware and the OpenPilotController with the current 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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">To continue the wizard and go through some basic configuration steps, please continue to the next step of this wizard.</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-family:'MS Shell Dlg 2'; font-size:10pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">The following steps require that your OpenPilot controller is set up according to the diagram, it is </span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600;">connected to the computer</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;"> by USB, and that the vehicle is</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600;"> powered by a battery</span><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt;">.</span></p></body></html> +</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;">OpenPilot configuration summary</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: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;">The first part of this wizard is now complete. All information required to create a basic OpenPilot controller configuration for a specific vehicle has been collected.</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:10pt;">Below is a summary of the configuration and a button that links to a diagram illustrating how to connect required hardware and the OpenPilot Controller with the current 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: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;">To continue the wizard and go through some basic configuration steps, please continue to the next step of this wizard.</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;">The following steps require that your OpenPilot controller is set up according to the diagram, it is </span><span style=" font-size:10pt; font-weight:600;">connected to the computer</span><span style=" font-size:10pt;"> by USB, and that the vehicle is</span><span style=" font-size:10pt; font-weight:600;"> powered by a battery</span><span style=" font-size:10pt;">.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -48,7 +47,7 @@ p, li { white-space: pre-wrap; } 460 - 260 + 271 100 100 @@ -89,10 +88,10 @@ p, li { white-space: pre-wrap; } - 40 - 249 + 20 + 270 400 - 121 + 100 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui index 48ef24ac8..804887b2d 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/vehiclepage.ui @@ -19,19 +19,21 @@ 20 20 550 - 131 + 221 <!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"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; 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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;">Vehicle type selection</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-family:'MS Shell Dlg 2'; font-size:12pt; font-weight:600;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">To continue, the wizard needs to know what type of vehicle the OpenPilot controller board is going to be used with. This step is crucial, since most of the following configuration is unique per vehicle type.</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-family:'MS Shell Dlg 2'; font-size:8pt;"></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-family:'MS Shell Dlg 2'; font-size:10pt;">Go ahead and select the type of vehicle you want to create a configuration for.</span></p></body></html> +</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;">Vehicle type selection</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: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;">To continue, the wizard needs to know what type of vehicle the OpenPilot controller board is going to be used with. This step is crucial since much of the following configuration is unique per vehicle type.</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;"><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;">Go ahead and select the type of vehicle for which you want to create a 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: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;">(The current version only provides functionality for multirotors.)</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -105,7 +107,7 @@ p, li { white-space: pre-wrap; } - Tricopter, Quadcopter, Hexacopter, Octocopter + Tricopter, Quadcopter, Hexacopter false @@ -213,6 +215,9 @@ p, li { white-space: pre-wrap; } 10 + + CCPM Helicopters + QToolButton { border: none } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index 888e64035..f91357b35 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -173,7 +173,7 @@ QString SetupWizard::getSummaryText() summary.append(tr("Hexacopter Coax (Y6)")); break; case SetupWizard::MULTI_ROTOR_HEXA_H: - summary.append(tr("Hexacopter H")); + summary.append(tr("Hexacopter X")); break; case SetupWizard::MULTI_ROTOR_OCTO: summary.append(tr("Octocopter")); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h index 6332ee23b..5e36902e9 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationsource.h @@ -47,7 +47,7 @@ struct actuatorChannelSettings { quint16 channelMax; //Default values - actuatorChannelSettings(): channelMin(1000), channelNeutral(1080), channelMax(1900) {} + actuatorChannelSettings(): channelMin(1000), channelNeutral(1000), channelMax(1900) {} }; From 19875fb70b7e15e2cd5a8d9ae26dc9b8e749b029 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sun, 30 Sep 2012 13:35:35 +0200 Subject: [PATCH 50/56] OP-39 Fixed controller identification bug. Now using telemetry manager to receive notifications about connect/disconnect. Changed text on last page in wizard. --- .../plugins/setupwizard/pages/controllerpage.cpp | 16 +++++++++++----- .../plugins/setupwizard/pages/controllerpage.h | 2 ++ .../src/plugins/setupwizard/pages/endpage.ui | 2 -- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp index b17c26ab6..deed9d6eb 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.cpp @@ -42,8 +42,12 @@ ControllerPage::ControllerPage(SetupWizard *wizard, QWidget *parent) : Q_ASSERT(m_connectionManager); connect(m_connectionManager, SIGNAL(availableDevicesChanged(QLinkedList)), this, SLOT(devicesChanged(QLinkedList))); - connect(m_connectionManager, SIGNAL(deviceConnected(QIODevice*)), this, SLOT(connectionStatusChanged())); - connect(m_connectionManager, SIGNAL(deviceDisconnected()), this, SLOT(connectionStatusChanged())); + ExtensionSystem::PluginManager *pluginManager = ExtensionSystem::PluginManager::instance(); + Q_ASSERT(pluginManager); + m_telemtryManager = pluginManager->getObject(); + Q_ASSERT(m_telemtryManager); + connect(m_telemtryManager, SIGNAL(connected()), this, SLOT(connectionStatusChanged())); + connect(m_telemtryManager, SIGNAL(disconnected()), this, SLOT(connectionStatusChanged())); connect(ui->connectButton, SIGNAL(clicked()), this, SLOT(connectDisconnect())); @@ -70,7 +74,7 @@ void ControllerPage::initializePage() bool ControllerPage::isComplete() const { - return m_connectionManager->isConnected() && ui->boardTypeCombo->currentIndex() > 0 && + return m_telemtryManager->isConnected() && ui->boardTypeCombo->currentIndex() > 0 && m_connectionManager->getCurrentDevice().getConName().startsWith("USB:", Qt::CaseInsensitive); } @@ -82,7 +86,7 @@ bool ControllerPage::validatePage() bool ControllerPage::anyControllerConnected() { - return m_connectionManager->isConnected(); + return m_telemtryManager->isConnected(); } SetupWizard::CONTROLLER_TYPE ControllerPage::getControllerType() @@ -164,7 +168,7 @@ void ControllerPage::devicesChanged(QLinkedList devices) if(indexOfSelectedItem != -1) { ui->deviceCombo->setCurrentIndex(indexOfSelectedItem); } - connectionStatusChanged(); + //connectionStatusChanged(); } void ControllerPage::connectionStatusChanged() @@ -183,6 +187,7 @@ void ControllerPage::connectionStatusChanged() SetupWizard::CONTROLLER_TYPE type = getControllerType(); setControllerType(type); + qDebug() << "Connection status changed: Connected, controller type: " << getControllerType(); } else { ui->deviceCombo->setEnabled(true); @@ -190,6 +195,7 @@ void ControllerPage::connectionStatusChanged() ui->boardTypeCombo->setEnabled(false); ui->boardTypeCombo->model()->setData(ui->boardTypeCombo->model()->index(0, 0), QVariant(0), Qt::UserRole - 1); setControllerType(SetupWizard::CONTROLLER_UNKNOWN); + qDebug() << "Connection status changed: Disconnected"; } emit completeChanged(); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.h index c906fff5f..9370f4cd4 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.h @@ -31,6 +31,7 @@ #include #include #include "setupwizard.h" +#include "uavtalk/telemetrymanager.h" #include "abstractwizardpage.h" namespace Ui { @@ -56,6 +57,7 @@ private: void setupBoardTypes(); void setControllerType(SetupWizard::CONTROLLER_TYPE type); Core::ConnectionManager *m_connectionManager; + TelemetryManager *m_telemtryManager; private slots: void devicesChanged(QLinkedList devices); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui index c85c08176..b8d9f104c 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/endpage.ui @@ -39,8 +39,6 @@ p, li { white-space: pre-wrap; } <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 setup procedure is now complete and you are one step away from completing the setup of your OpenPilot controller.</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;">To complete the setup please click the Radio Setup Wizard button below to close this wizard and go directly to the Radio Setup Wizard.</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;">Or, before trying to operate your vehicle, close this wizard, go to the Input tab in the Configuration plugin and run the Radio Setup Wizard to configure the input signals to be used. If you have already performed the Radio configuration, you can skip this step. </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></body></html> From 949569fdec1167da95ff4636e09a512b4bde28cc Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sun, 30 Sep 2012 14:19:31 +0200 Subject: [PATCH 51/56] OP-39 Added handling of switching to correct tab in input configuration section when starting Radio Setup Wizard. --- ground/openpilotgcs/src/plugins/config/configinputwidget.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index fe01e17e3..f93e5b2d8 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -300,6 +300,8 @@ void ConfigInputWidget::goToWizard() msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); + + m_config->tabWidget->setCurrentIndex(0); wizardSetUpStep(wizardWelcome); m_config->graphicsView->fitInView(m_txBackground, Qt::KeepAspectRatio ); } From ede0c2ebf912e5e0c551358571988b8eebe75134 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sun, 30 Sep 2012 14:24:54 +0200 Subject: [PATCH 52/56] OP-39 Small adjustment. --- ground/openpilotgcs/src/plugins/config/configinputwidget.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index f93e5b2d8..4b561ef62 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -301,7 +301,10 @@ void ConfigInputWidget::goToWizard() msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); - m_config->tabWidget->setCurrentIndex(0); + // Set correct tab visible before starting wizard. + if(m_config->tabWidget->currentIndex() != 0) { + m_config->tabWidget->setCurrentIndex(0); + } wizardSetUpStep(wizardWelcome); m_config->graphicsView->fitInView(m_txBackground, Qt::KeepAspectRatio ); } From eed564a3c4e171e30976b22cdc51280b6140ae56 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sun, 30 Sep 2012 14:41:58 +0200 Subject: [PATCH 53/56] OP-39 Adding label to indicate when leveling is done in a more clear way. --- .../setupwizard/pages/levellingpage.cpp | 3 +++ .../setupwizard/pages/levellingpage.ui | 20 ++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp index a00959522..28dac7c33 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.cpp @@ -80,6 +80,8 @@ void LevellingPage::performLevelling() } enableButtons(false); + ui->progressLabel->setText(QString(tr("Retrieving data..."))); + if(!m_levellingUtil) { @@ -128,6 +130,7 @@ void LevellingPage::stopLevelling() disconnect(m_levellingUtil, SIGNAL(progress(long,long)), this, SLOT(levellingProgress(long,long))); disconnect(m_levellingUtil, SIGNAL(done(accelGyroBias)), this, SLOT(levellingDone(accelGyroBias))); disconnect(m_levellingUtil, SIGNAL(timeout(QString)), this, SLOT(levellingTimeout(QString))); + ui->progressLabel->setText(QString(tr("Done!"))); enableButtons(true); } } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui index 77152f792..dae71e6b7 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/levellingpage.ui @@ -44,7 +44,7 @@ p, li { white-space: pre-wrap; } 200 - 270 + 260 200 70 @@ -98,6 +98,24 @@ QProgressBar::chunk { + + + + 42 + 330 + 511 + 16 + + + + + 10 + + + + + + From 138848453f19002a7edbf3edd24d545918f3f0e3 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Sun, 30 Sep 2012 17:27:20 +0200 Subject: [PATCH 54/56] OP-39 Changed the Radio Setup Wizard to go to the Arming Settings screen after the last step in the wizard. Changed the info text in a dialog. --- .../openpilotgcs/src/plugins/config/configinputwidget.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 4b561ef62..6d2e4b3ea 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -296,7 +296,9 @@ void ConfigInputWidget::goToWizard() { QMessageBox msgBox; msgBox.setText(tr("Arming Settings are now set to Always Disarmed for your safety.")); - msgBox.setDetailedText(tr("You will have to reconfigure the arming settings manually when the wizard is finished.")); + msgBox.setDetailedText(tr("You will have to reconfigure the arming settings manually " + "when the wizard is finished. After the last step of the " + "wizard you will be taken to the Arming Settings screen.")); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); msgBox.exec(); @@ -370,6 +372,7 @@ void ConfigInputWidget::wzNext() case wizardFinish: wizardStep=wizardNone; m_config->stackedWidget->setCurrentIndex(0); + m_config->tabWidget->setCurrentIndex(2); break; default: Q_ASSERT(0); @@ -544,7 +547,8 @@ void ConfigInputWidget::wizardSetUpStep(enum wizardSteps step) connect(flightStatusObj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); connect(accessoryDesiredObj0, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(moveSticks())); m_config->wzText->setText(QString(tr("You have completed this wizard, please check below if the picture mimics your sticks movement.\n" - "These new settings aren't saved to the board yet, after pressing next you will go to the initial screen where you can save the configuration."))); + "These new settings aren't saved to the board yet, after pressing next you will go to the Arming Settings " + "screen where you can set your desired arming sequence and save the configuration."))); fastMdata(); manualSettingsData.ChannelNeutral[ManualControlSettings::CHANNELNEUTRAL_THROTTLE]= From 13f10949e849d32cbbe4e6623f5a62b6e32da1ee Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Mon, 1 Oct 2012 21:50:00 +0200 Subject: [PATCH 55/56] OP-39 Removed an unnecessary struct declaration. Changed some texts. Removed some empty lines. --- .../src/plugins/config/configinputwidget.cpp | 2 +- .../setupwizard/pages/abstractwizardpage.h | 2 - .../setupwizard/pages/controllerpage.ui | 2 +- .../plugins/setupwizard/pages/inputpage.ui | 8 +- .../plugins/setupwizard/pages/rebootpage.ui | 2 +- .../vehicleconfigurationhelper.cpp | 774 +++++++++--------- .../setupwizard/vehicleconfigurationhelper.h | 6 +- .../plugins/uploader/uploadergadgetwidget.cpp | 5 +- 8 files changed, 397 insertions(+), 404 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 6d2e4b3ea..e16d735d9 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -289,9 +289,9 @@ void ConfigInputWidget::resizeEvent(QResizeEvent *event) void ConfigInputWidget::openHelp() { - QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/x/04Cf", QUrl::StrictMode) ); } + void ConfigInputWidget::goToWizard() { QMessageBox msgBox; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/abstractwizardpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/abstractwizardpage.h index bb4960a32..072d619e7 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/abstractwizardpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/abstractwizardpage.h @@ -42,8 +42,6 @@ private: public: SetupWizard* getWizard() { return m_wizard; } - virtual bool isFinished() { return true; } - virtual quint16 stage() { return 0; } }; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui index 3b06fa756..885feda4c 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/controllerpage.ui @@ -33,7 +33,7 @@ p, li { white-space: pre-wrap; } <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;">If the board is already connected and successfully detected, the board type will already be displayed. You can </span><span style=" font-size:10pt; font-weight:600;">Disconnect</span><span style=" font-size:10pt;"> and select another device if you need to detect another board.</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;">If your board is not connected please connect the board to a USB port on your computer and select the device from the list below. Then press </span><span style=" font-size:10pt; font-weight:600;">Connect</span><span style=" font-size:10pt;">.</span></p></body></html> +<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;">If your board is not connected, please connect the board to a USB port on your computer and select the device from the list below. Then press </span><span style=" font-size:10pt; font-weight:600;">Connect</span><span style=" font-size:10pt;">.</span></p></body></html> Qt::AutoText diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui index 6212b1e3d..af4129982 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/inputpage.ui @@ -26,12 +26,12 @@ <!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"> 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;">OpenPilot basic input signal 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:12pt; font-weight:600;"></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: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;">The OpenPilot controller supports many different types of input signals. Please select the type of input that matches your receiver configuration. If you are unsure, just leave the default option selected and continue the wizard.</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;"></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;">Some input options require the OpenPilot controller to be rebooted before the changes can take place. If an option that requires a reboot is selected, the controller will need to be rebooted at the end of this wizard after the configuration is written to the controller.</span></p></body></html> +<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;">Some input options require the OpenPilot controller to be rebooted before the changes can take place. If an option that requires a reboot is selected, you will be instructed to do so on the next page of this wizard.</span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui index a7340144f..46a0402cc 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/rebootpage.ui @@ -50,7 +50,7 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> -<p align="center" 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; color:#000000;">The configuration created by the wizard contains settings that require a reboot of your controller. Please power cycle the controller before continuing. To power cycle the controller remove all batteries and the usb cable for at least 30 seconds. </span></p></body></html> +<p align="center" 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; color:#000000;">The configuration created by the wizard contains settings that require a reboot of your controller. Please power cycle the controller before continuing. To power cycle the controller remove all batteries and the USB cable for at least 30 seconds. </span></p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp index 6d0a5946e..709810bce 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.cpp @@ -320,7 +320,7 @@ void VehicleConfigurationHelper::applyStabilizationConfiguration() addModifiedObject(stabSettings, tr("Writing stabilization settings")); } -void VehicleConfigurationHelper::applyMixerConfiguration(mixerSettings mixer) +void VehicleConfigurationHelper::applyMixerConfiguration(mixerChannelSettings channels[]) { // Set all mixer data MixerSettings* mSettings = MixerSettings::GetInstance(m_uavoManager); @@ -332,15 +332,15 @@ void VehicleConfigurationHelper::applyMixerConfiguration(mixerSettings mixer) for(int i = 0; i < 10; i++) { UAVObjectField *field = mSettings->getField(mixerTypePattern.arg(i + 1)); Q_ASSERT(field); - field->setValue(field->getOptions().at(mixer.channels[i].type)); + field->setValue(field->getOptions().at(channels[i].type)); field = mSettings->getField(mixerVectorPattern.arg(i + 1)); Q_ASSERT(field); - field->setValue((mixer.channels[i].throttle1 * 127) / 100, 0); - field->setValue((mixer.channels[i].throttle2 * 127) / 100, 1); - field->setValue((mixer.channels[i].roll * 127) / 100, 2); - field->setValue((mixer.channels[i].pitch * 127) / 100, 3); - field->setValue((mixer.channels[i].yaw *127) / 100, 4); + field->setValue((channels[i].throttle1 * 127) / 100, 0); + field->setValue((channels[i].throttle2 * 127) / 100, 1); + field->setValue((channels[i].roll * 127) / 100, 2); + field->setValue((channels[i].pitch * 127) / 100, 3); + field->setValue((channels[i].yaw *127) / 100, 4); } // Apply updates @@ -585,43 +585,43 @@ void VehicleConfigurationHelper::setupTriCopter() // 2. Setup GUI data // 3. Apply changes - mixerSettings mixer; + mixerChannelSettings channels[10]; GUIConfigDataUnion guiSettings = getGUIConfigData(); - mixer.channels[0].type = MIXER_TYPE_MOTOR; - mixer.channels[0].throttle1 = 100; - mixer.channels[0].throttle2 = 0; - mixer.channels[0].roll = 100; - mixer.channels[0].pitch = 50; - mixer.channels[0].yaw = 0; + channels[0].type = MIXER_TYPE_MOTOR; + channels[0].throttle1 = 100; + channels[0].throttle2 = 0; + channels[0].roll = 100; + channels[0].pitch = 50; + channels[0].yaw = 0; - mixer.channels[1].type = MIXER_TYPE_MOTOR; - mixer.channels[1].throttle1 = 100; - mixer.channels[1].throttle2 = 0; - mixer.channels[1].roll = -100; - mixer.channels[1].pitch = 50; - mixer.channels[1].yaw = 0; + channels[1].type = MIXER_TYPE_MOTOR; + channels[1].throttle1 = 100; + channels[1].throttle2 = 0; + channels[1].roll = -100; + channels[1].pitch = 50; + channels[1].yaw = 0; - mixer.channels[2].type = MIXER_TYPE_MOTOR; - mixer.channels[2].throttle1 = 100; - mixer.channels[2].throttle2 = 0; - mixer.channels[2].roll = 0; - mixer.channels[2].pitch = -100; - mixer.channels[2].yaw = 0; + channels[2].type = MIXER_TYPE_MOTOR; + channels[2].throttle1 = 100; + channels[2].throttle2 = 0; + channels[2].roll = 0; + channels[2].pitch = -100; + channels[2].yaw = 0; - mixer.channels[3].type = MIXER_TYPE_SERVO; - mixer.channels[3].throttle1 = 0; - mixer.channels[3].throttle2 = 0; - mixer.channels[3].roll = 0; - mixer.channels[3].pitch = 0; - mixer.channels[3].yaw = 100; + 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.multi.VTOLMotorNW = 1; guiSettings.multi.VTOLMotorNE = 2; guiSettings.multi.VTOLMotorS = 3; guiSettings.multi.TRIYaw = 4; - applyMixerConfiguration(mixer); + applyMixerConfiguration(channels); applyMultiGUISettings(SystemSettings::AIRFRAMETYPE_TRI, guiSettings); } @@ -642,7 +642,7 @@ GUIConfigDataUnion VehicleConfigurationHelper::getGUIConfigData() void VehicleConfigurationHelper::setupQuadCopter() { - mixerSettings mixer; + mixerChannelSettings channels[10]; GUIConfigDataUnion guiSettings = getGUIConfigData(); SystemSettings::AirframeTypeOptions frame; @@ -650,33 +650,33 @@ void VehicleConfigurationHelper::setupQuadCopter() { case VehicleConfigurationSource::MULTI_ROTOR_QUAD_PLUS: { frame = SystemSettings::AIRFRAMETYPE_QUADP; - mixer.channels[0].type = MIXER_TYPE_MOTOR; - mixer.channels[0].throttle1 = 100; - mixer.channels[0].throttle2 = 0; - mixer.channels[0].roll = 0; - mixer.channels[0].pitch = 100; - mixer.channels[0].yaw = -50; + channels[0].type = MIXER_TYPE_MOTOR; + channels[0].throttle1 = 100; + channels[0].throttle2 = 0; + channels[0].roll = 0; + channels[0].pitch = 100; + channels[0].yaw = -50; - mixer.channels[1].type = MIXER_TYPE_MOTOR; - mixer.channels[1].throttle1 = 100; - mixer.channels[1].throttle2 = 0; - mixer.channels[1].roll = -100; - mixer.channels[1].pitch = 0; - mixer.channels[1].yaw = 50; + channels[1].type = MIXER_TYPE_MOTOR; + channels[1].throttle1 = 100; + channels[1].throttle2 = 0; + channels[1].roll = -100; + channels[1].pitch = 0; + channels[1].yaw = 50; - mixer.channels[2].type = MIXER_TYPE_MOTOR; - mixer.channels[2].throttle1 = 100; - mixer.channels[2].throttle2 = 0; - mixer.channels[2].roll = 0; - mixer.channels[2].pitch = -100; - mixer.channels[2].yaw = -50; + channels[2].type = MIXER_TYPE_MOTOR; + channels[2].throttle1 = 100; + channels[2].throttle2 = 0; + channels[2].roll = 0; + channels[2].pitch = -100; + channels[2].yaw = -50; - mixer.channels[3].type = MIXER_TYPE_MOTOR; - mixer.channels[3].throttle1 = 100; - mixer.channels[3].throttle2 = 0; - mixer.channels[3].roll = 100; - mixer.channels[3].pitch = 0; - mixer.channels[3].yaw = 50; + channels[3].type = MIXER_TYPE_MOTOR; + channels[3].throttle1 = 100; + channels[3].throttle2 = 0; + channels[3].roll = 100; + channels[3].pitch = 0; + channels[3].yaw = 50; guiSettings.multi.VTOLMotorN = 1; guiSettings.multi.VTOLMotorE = 2; @@ -687,33 +687,33 @@ void VehicleConfigurationHelper::setupQuadCopter() } case VehicleConfigurationSource::MULTI_ROTOR_QUAD_X: { frame = SystemSettings::AIRFRAMETYPE_QUADX; - mixer.channels[0].type = MIXER_TYPE_MOTOR; - mixer.channels[0].throttle1 = 100; - mixer.channels[0].throttle2 = 0; - mixer.channels[0].roll = 50; - mixer.channels[0].pitch = 50; - mixer.channels[0].yaw = -50; + channels[0].type = MIXER_TYPE_MOTOR; + channels[0].throttle1 = 100; + channels[0].throttle2 = 0; + channels[0].roll = 50; + channels[0].pitch = 50; + channels[0].yaw = -50; - mixer.channels[1].type = MIXER_TYPE_MOTOR; - mixer.channels[1].throttle1 = 100; - mixer.channels[1].throttle2 = 0; - mixer.channels[1].roll = -50; - mixer.channels[1].pitch = 50; - mixer.channels[1].yaw = 50; + channels[1].type = MIXER_TYPE_MOTOR; + channels[1].throttle1 = 100; + channels[1].throttle2 = 0; + channels[1].roll = -50; + channels[1].pitch = 50; + channels[1].yaw = 50; - mixer.channels[2].type = MIXER_TYPE_MOTOR; - mixer.channels[2].throttle1 = 100; - mixer.channels[2].throttle2 = 0; - mixer.channels[2].roll = -50; - mixer.channels[2].pitch = -50; - mixer.channels[2].yaw = -50; + channels[2].type = MIXER_TYPE_MOTOR; + channels[2].throttle1 = 100; + channels[2].throttle2 = 0; + channels[2].roll = -50; + channels[2].pitch = -50; + channels[2].yaw = -50; - mixer.channels[3].type = MIXER_TYPE_MOTOR; - mixer.channels[3].throttle1 = 100; - mixer.channels[3].throttle2 = 0; - mixer.channels[3].roll = 50; - mixer.channels[3].pitch = -50; - mixer.channels[3].yaw = 50; + channels[3].type = MIXER_TYPE_MOTOR; + channels[3].throttle1 = 100; + channels[3].throttle2 = 0; + channels[3].roll = 50; + channels[3].pitch = -50; + channels[3].yaw = 50; guiSettings.multi.VTOLMotorNW = 1; guiSettings.multi.VTOLMotorNE = 2; @@ -725,13 +725,13 @@ void VehicleConfigurationHelper::setupQuadCopter() default: break; } - applyMixerConfiguration(mixer); + applyMixerConfiguration(channels); applyMultiGUISettings(frame, guiSettings); } void VehicleConfigurationHelper::setupHexaCopter() { - mixerSettings mixer; + mixerChannelSettings channels[10]; GUIConfigDataUnion guiSettings = getGUIConfigData(); SystemSettings::AirframeTypeOptions frame; @@ -740,47 +740,47 @@ void VehicleConfigurationHelper::setupHexaCopter() case VehicleConfigurationSource::MULTI_ROTOR_HEXA: { frame = SystemSettings::AIRFRAMETYPE_HEXA; - mixer.channels[0].type = MIXER_TYPE_MOTOR; - mixer.channels[0].throttle1 = 100; - mixer.channels[0].throttle2 = 0; - mixer.channels[0].roll = 0; - mixer.channels[0].pitch = 33; - mixer.channels[0].yaw = -33; + channels[0].type = MIXER_TYPE_MOTOR; + channels[0].throttle1 = 100; + channels[0].throttle2 = 0; + channels[0].roll = 0; + channels[0].pitch = 33; + channels[0].yaw = -33; - mixer.channels[1].type = MIXER_TYPE_MOTOR; - mixer.channels[1].throttle1 = 100; - mixer.channels[1].throttle2 = 0; - mixer.channels[1].roll = -50; - mixer.channels[1].pitch = 33; - mixer.channels[1].yaw = 33; + channels[1].type = MIXER_TYPE_MOTOR; + channels[1].throttle1 = 100; + channels[1].throttle2 = 0; + channels[1].roll = -50; + channels[1].pitch = 33; + channels[1].yaw = 33; - mixer.channels[2].type = MIXER_TYPE_MOTOR; - mixer.channels[2].throttle1 = 100; - mixer.channels[2].throttle2 = 0; - mixer.channels[2].roll = -50; - mixer.channels[2].pitch = -33; - mixer.channels[2].yaw = -33; + channels[2].type = MIXER_TYPE_MOTOR; + channels[2].throttle1 = 100; + channels[2].throttle2 = 0; + channels[2].roll = -50; + channels[2].pitch = -33; + channels[2].yaw = -33; - mixer.channels[3].type = MIXER_TYPE_MOTOR; - mixer.channels[3].throttle1 = 100; - mixer.channels[3].throttle2 = 0; - mixer.channels[3].roll = 0; - mixer.channels[3].pitch = -33; - mixer.channels[3].yaw = 33; + channels[3].type = MIXER_TYPE_MOTOR; + channels[3].throttle1 = 100; + channels[3].throttle2 = 0; + channels[3].roll = 0; + channels[3].pitch = -33; + channels[3].yaw = 33; - mixer.channels[4].type = MIXER_TYPE_MOTOR; - mixer.channels[4].throttle1 = 100; - mixer.channels[4].throttle2 = 0; - mixer.channels[4].roll = 50; - mixer.channels[4].pitch = -33; - mixer.channels[4].yaw = -33; + channels[4].type = MIXER_TYPE_MOTOR; + channels[4].throttle1 = 100; + channels[4].throttle2 = 0; + channels[4].roll = 50; + channels[4].pitch = -33; + channels[4].yaw = -33; - mixer.channels[5].type = MIXER_TYPE_MOTOR; - mixer.channels[5].throttle1 = 100; - mixer.channels[5].throttle2 = 0; - mixer.channels[5].roll = 50; - mixer.channels[5].pitch = 33; - mixer.channels[5].yaw = 33; + channels[5].type = MIXER_TYPE_MOTOR; + channels[5].throttle1 = 100; + channels[5].throttle2 = 0; + channels[5].roll = 50; + channels[5].pitch = 33; + channels[5].yaw = 33; guiSettings.multi.VTOLMotorN = 1; guiSettings.multi.VTOLMotorNE = 2; @@ -794,47 +794,47 @@ void VehicleConfigurationHelper::setupHexaCopter() case VehicleConfigurationSource::MULTI_ROTOR_HEXA_COAX_Y: { frame = SystemSettings::AIRFRAMETYPE_HEXACOAX; - mixer.channels[0].type = MIXER_TYPE_MOTOR; - mixer.channels[0].throttle1 = 100; - mixer.channels[0].throttle2 = 0; - mixer.channels[0].roll = 100; - mixer.channels[0].pitch = 25; - mixer.channels[0].yaw = -66; + channels[0].type = MIXER_TYPE_MOTOR; + channels[0].throttle1 = 100; + channels[0].throttle2 = 0; + channels[0].roll = 100; + channels[0].pitch = 25; + channels[0].yaw = -66; - mixer.channels[1].type = MIXER_TYPE_MOTOR; - mixer.channels[1].throttle1 = 100; - mixer.channels[1].throttle2 = 0; - mixer.channels[1].roll = 100; - mixer.channels[1].pitch = 25; - mixer.channels[1].yaw = 66; + channels[1].type = MIXER_TYPE_MOTOR; + channels[1].throttle1 = 100; + channels[1].throttle2 = 0; + channels[1].roll = 100; + channels[1].pitch = 25; + channels[1].yaw = 66; - mixer.channels[2].type = MIXER_TYPE_MOTOR; - mixer.channels[2].throttle1 = 100; - mixer.channels[2].throttle2 = 0; - mixer.channels[2].roll = -100; - mixer.channels[2].pitch = 25; - mixer.channels[2].yaw = -66; + channels[2].type = MIXER_TYPE_MOTOR; + channels[2].throttle1 = 100; + channels[2].throttle2 = 0; + channels[2].roll = -100; + channels[2].pitch = 25; + channels[2].yaw = -66; - mixer.channels[3].type = MIXER_TYPE_MOTOR; - mixer.channels[3].throttle1 = 100; - mixer.channels[3].throttle2 = 0; - mixer.channels[3].roll = -100; - mixer.channels[3].pitch = 25; - mixer.channels[3].yaw = 66; + channels[3].type = MIXER_TYPE_MOTOR; + channels[3].throttle1 = 100; + channels[3].throttle2 = 0; + channels[3].roll = -100; + channels[3].pitch = 25; + channels[3].yaw = 66; - mixer.channels[4].type = MIXER_TYPE_MOTOR; - mixer.channels[4].throttle1 = 100; - mixer.channels[4].throttle2 = 0; - mixer.channels[4].roll = 0; - mixer.channels[4].pitch = -50; - mixer.channels[4].yaw = -66; + channels[4].type = MIXER_TYPE_MOTOR; + channels[4].throttle1 = 100; + channels[4].throttle2 = 0; + channels[4].roll = 0; + channels[4].pitch = -50; + channels[4].yaw = -66; - mixer.channels[5].type = MIXER_TYPE_MOTOR; - mixer.channels[5].throttle1 = 100; - mixer.channels[5].throttle2 = 0; - mixer.channels[5].roll = 0; - mixer.channels[5].pitch = -50; - mixer.channels[5].yaw = 66; + channels[5].type = MIXER_TYPE_MOTOR; + channels[5].throttle1 = 100; + channels[5].throttle2 = 0; + channels[5].roll = 0; + channels[5].pitch = -50; + channels[5].yaw = 66; guiSettings.multi.VTOLMotorNW = 1; guiSettings.multi.VTOLMotorW = 2; @@ -848,47 +848,47 @@ void VehicleConfigurationHelper::setupHexaCopter() case VehicleConfigurationSource::MULTI_ROTOR_HEXA_H: { frame = SystemSettings::AIRFRAMETYPE_HEXAX; - mixer.channels[0].type = MIXER_TYPE_MOTOR; - mixer.channels[0].throttle1 = 100; - mixer.channels[0].throttle2 = 0; - mixer.channels[0].roll = -33; - mixer.channels[0].pitch = 50; - mixer.channels[0].yaw = -33; + channels[0].type = MIXER_TYPE_MOTOR; + channels[0].throttle1 = 100; + channels[0].throttle2 = 0; + channels[0].roll = -33; + channels[0].pitch = 50; + channels[0].yaw = -33; - mixer.channels[1].type = MIXER_TYPE_MOTOR; - mixer.channels[1].throttle1 = 100; - mixer.channels[1].throttle2 = 0; - mixer.channels[1].roll = -33; - mixer.channels[1].pitch = 0; - mixer.channels[1].yaw = 33; + channels[1].type = MIXER_TYPE_MOTOR; + channels[1].throttle1 = 100; + channels[1].throttle2 = 0; + channels[1].roll = -33; + channels[1].pitch = 0; + channels[1].yaw = 33; - mixer.channels[2].type = MIXER_TYPE_MOTOR; - mixer.channels[2].throttle1 = 100; - mixer.channels[2].throttle2 = 0; - mixer.channels[2].roll = -33; - mixer.channels[2].pitch = -50; - mixer.channels[2].yaw = -33; + channels[2].type = MIXER_TYPE_MOTOR; + channels[2].throttle1 = 100; + channels[2].throttle2 = 0; + channels[2].roll = -33; + channels[2].pitch = -50; + channels[2].yaw = -33; - mixer.channels[3].type = MIXER_TYPE_MOTOR; - mixer.channels[3].throttle1 = 100; - mixer.channels[3].throttle2 = 0; - mixer.channels[3].roll = -33; - mixer.channels[3].pitch = -50; - mixer.channels[3].yaw = 33; + channels[3].type = MIXER_TYPE_MOTOR; + channels[3].throttle1 = 100; + channels[3].throttle2 = 0; + channels[3].roll = -33; + channels[3].pitch = -50; + channels[3].yaw = 33; - mixer.channels[4].type = MIXER_TYPE_MOTOR; - mixer.channels[4].throttle1 = 100; - mixer.channels[4].throttle2 = 0; - mixer.channels[4].roll = 33; - mixer.channels[4].pitch = 0; - mixer.channels[4].yaw = -33; + channels[4].type = MIXER_TYPE_MOTOR; + channels[4].throttle1 = 100; + channels[4].throttle2 = 0; + channels[4].roll = 33; + channels[4].pitch = 0; + channels[4].yaw = -33; - mixer.channels[5].type = MIXER_TYPE_MOTOR; - mixer.channels[5].throttle1 = 100; - mixer.channels[5].throttle2 = 0; - mixer.channels[5].roll = 33; - mixer.channels[5].pitch = 50; - mixer.channels[5].yaw = -33; + channels[5].type = MIXER_TYPE_MOTOR; + channels[5].throttle1 = 100; + channels[5].throttle2 = 0; + channels[5].roll = 33; + channels[5].pitch = 50; + channels[5].yaw = -33; guiSettings.multi.VTOLMotorNE = 1; guiSettings.multi.VTOLMotorE = 2; @@ -902,13 +902,13 @@ void VehicleConfigurationHelper::setupHexaCopter() default: break; } - applyMixerConfiguration(mixer); + applyMixerConfiguration(channels); applyMultiGUISettings(frame, guiSettings); } void VehicleConfigurationHelper::setupOctoCopter() { - mixerSettings mixer; + mixerChannelSettings channels[10]; GUIConfigDataUnion guiSettings = getGUIConfigData(); SystemSettings::AirframeTypeOptions frame; @@ -917,61 +917,61 @@ void VehicleConfigurationHelper::setupOctoCopter() case VehicleConfigurationSource::MULTI_ROTOR_OCTO: { frame = SystemSettings::AIRFRAMETYPE_OCTO; - mixer.channels[0].type = MIXER_TYPE_MOTOR; - mixer.channels[0].throttle1 = 100; - mixer.channels[0].throttle2 = 0; - mixer.channels[0].roll = 0; - mixer.channels[0].pitch = 33; - mixer.channels[0].yaw = -25; + channels[0].type = MIXER_TYPE_MOTOR; + channels[0].throttle1 = 100; + channels[0].throttle2 = 0; + channels[0].roll = 0; + channels[0].pitch = 33; + channels[0].yaw = -25; - mixer.channels[1].type = MIXER_TYPE_MOTOR; - mixer.channels[1].throttle1 = 100; - mixer.channels[1].throttle2 = 0; - mixer.channels[1].roll = -33; - mixer.channels[1].pitch = 33; - mixer.channels[1].yaw = 25; + channels[1].type = MIXER_TYPE_MOTOR; + channels[1].throttle1 = 100; + channels[1].throttle2 = 0; + channels[1].roll = -33; + channels[1].pitch = 33; + channels[1].yaw = 25; - mixer.channels[2].type = MIXER_TYPE_MOTOR; - mixer.channels[2].throttle1 = 100; - mixer.channels[2].throttle2 = 0; - mixer.channels[2].roll = -33; - mixer.channels[2].pitch = 0; - mixer.channels[2].yaw = -25; + channels[2].type = MIXER_TYPE_MOTOR; + channels[2].throttle1 = 100; + channels[2].throttle2 = 0; + channels[2].roll = -33; + channels[2].pitch = 0; + channels[2].yaw = -25; - mixer.channels[3].type = MIXER_TYPE_MOTOR; - mixer.channels[3].throttle1 = 100; - mixer.channels[3].throttle2 = 0; - mixer.channels[3].roll = -33; - mixer.channels[3].pitch = -33; - mixer.channels[3].yaw = 25; + channels[3].type = MIXER_TYPE_MOTOR; + channels[3].throttle1 = 100; + channels[3].throttle2 = 0; + channels[3].roll = -33; + channels[3].pitch = -33; + channels[3].yaw = 25; - mixer.channels[4].type = MIXER_TYPE_MOTOR; - mixer.channels[4].throttle1 = 100; - mixer.channels[4].throttle2 = 0; - mixer.channels[4].roll = 0; - mixer.channels[4].pitch = -33; - mixer.channels[4].yaw = -25; + channels[4].type = MIXER_TYPE_MOTOR; + channels[4].throttle1 = 100; + channels[4].throttle2 = 0; + channels[4].roll = 0; + channels[4].pitch = -33; + channels[4].yaw = -25; - mixer.channels[5].type = MIXER_TYPE_MOTOR; - mixer.channels[5].throttle1 = 100; - mixer.channels[5].throttle2 = 0; - mixer.channels[5].roll = 33; - mixer.channels[5].pitch = -33; - mixer.channels[5].yaw = 25; + channels[5].type = MIXER_TYPE_MOTOR; + channels[5].throttle1 = 100; + channels[5].throttle2 = 0; + channels[5].roll = 33; + channels[5].pitch = -33; + channels[5].yaw = 25; - mixer.channels[6].type = MIXER_TYPE_MOTOR; - mixer.channels[6].throttle1 = 100; - mixer.channels[6].throttle2 = 0; - mixer.channels[6].roll = 33; - mixer.channels[6].pitch = 0; - mixer.channels[6].yaw = -25; + channels[6].type = MIXER_TYPE_MOTOR; + channels[6].throttle1 = 100; + channels[6].throttle2 = 0; + channels[6].roll = 33; + channels[6].pitch = 0; + channels[6].yaw = -25; - mixer.channels[7].type = MIXER_TYPE_MOTOR; - mixer.channels[7].throttle1 = 100; - mixer.channels[7].throttle2 = 0; - mixer.channels[7].roll = 33; - mixer.channels[7].pitch = 33; - mixer.channels[7].yaw = 25; + channels[7].type = MIXER_TYPE_MOTOR; + channels[7].throttle1 = 100; + channels[7].throttle2 = 0; + channels[7].roll = 33; + channels[7].pitch = 33; + channels[7].yaw = 25; guiSettings.multi.VTOLMotorN = 1; guiSettings.multi.VTOLMotorNE = 2; @@ -987,61 +987,61 @@ void VehicleConfigurationHelper::setupOctoCopter() case VehicleConfigurationSource::MULTI_ROTOR_OCTO_COAX_X: { frame = SystemSettings::AIRFRAMETYPE_OCTOCOAXX; - mixer.channels[0].type = MIXER_TYPE_MOTOR; - mixer.channels[0].throttle1 = 100; - mixer.channels[0].throttle2 = 0; - mixer.channels[0].roll = 50; - mixer.channels[0].pitch = 50; - mixer.channels[0].yaw = -50; + channels[0].type = MIXER_TYPE_MOTOR; + channels[0].throttle1 = 100; + channels[0].throttle2 = 0; + channels[0].roll = 50; + channels[0].pitch = 50; + channels[0].yaw = -50; - mixer.channels[1].type = MIXER_TYPE_MOTOR; - mixer.channels[1].throttle1 = 100; - mixer.channels[1].throttle2 = 0; - mixer.channels[1].roll = 50; - mixer.channels[1].pitch = 50; - mixer.channels[1].yaw = 50; + channels[1].type = MIXER_TYPE_MOTOR; + channels[1].throttle1 = 100; + channels[1].throttle2 = 0; + channels[1].roll = 50; + channels[1].pitch = 50; + channels[1].yaw = 50; - mixer.channels[2].type = MIXER_TYPE_MOTOR; - mixer.channels[2].throttle1 = 100; - mixer.channels[2].throttle2 = 0; - mixer.channels[2].roll = -50; - mixer.channels[2].pitch = 50; - mixer.channels[2].yaw = -50; + channels[2].type = MIXER_TYPE_MOTOR; + channels[2].throttle1 = 100; + channels[2].throttle2 = 0; + channels[2].roll = -50; + channels[2].pitch = 50; + channels[2].yaw = -50; - mixer.channels[3].type = MIXER_TYPE_MOTOR; - mixer.channels[3].throttle1 = 100; - mixer.channels[3].throttle2 = 0; - mixer.channels[3].roll = -50; - mixer.channels[3].pitch = 50; - mixer.channels[3].yaw = 50; + channels[3].type = MIXER_TYPE_MOTOR; + channels[3].throttle1 = 100; + channels[3].throttle2 = 0; + channels[3].roll = -50; + channels[3].pitch = 50; + channels[3].yaw = 50; - mixer.channels[4].type = MIXER_TYPE_MOTOR; - mixer.channels[4].throttle1 = 100; - mixer.channels[4].throttle2 = 0; - mixer.channels[4].roll = -50; - mixer.channels[4].pitch = -50; - mixer.channels[4].yaw = -50; + channels[4].type = MIXER_TYPE_MOTOR; + channels[4].throttle1 = 100; + channels[4].throttle2 = 0; + channels[4].roll = -50; + channels[4].pitch = -50; + channels[4].yaw = -50; - mixer.channels[5].type = MIXER_TYPE_MOTOR; - mixer.channels[5].throttle1 = 100; - mixer.channels[5].throttle2 = 0; - mixer.channels[5].roll = -50; - mixer.channels[5].pitch = -50; - mixer.channels[5].yaw = 50; + channels[5].type = MIXER_TYPE_MOTOR; + channels[5].throttle1 = 100; + channels[5].throttle2 = 0; + channels[5].roll = -50; + channels[5].pitch = -50; + channels[5].yaw = 50; - mixer.channels[6].type = MIXER_TYPE_MOTOR; - mixer.channels[6].throttle1 = 100; - mixer.channels[6].throttle2 = 0; - mixer.channels[6].roll = 50; - mixer.channels[6].pitch = -50; - mixer.channels[6].yaw = -50; + channels[6].type = MIXER_TYPE_MOTOR; + channels[6].throttle1 = 100; + channels[6].throttle2 = 0; + channels[6].roll = 50; + channels[6].pitch = -50; + channels[6].yaw = -50; - mixer.channels[7].type = MIXER_TYPE_MOTOR; - mixer.channels[7].throttle1 = 100; - mixer.channels[7].throttle2 = 0; - mixer.channels[7].roll = 50; - mixer.channels[7].pitch = -50; - mixer.channels[7].yaw = 50; + channels[7].type = MIXER_TYPE_MOTOR; + channels[7].throttle1 = 100; + channels[7].throttle2 = 0; + channels[7].roll = 50; + channels[7].pitch = -50; + channels[7].yaw = 50; guiSettings.multi.VTOLMotorNW = 1; guiSettings.multi.VTOLMotorN = 2; @@ -1057,61 +1057,61 @@ void VehicleConfigurationHelper::setupOctoCopter() case VehicleConfigurationSource::MULTI_ROTOR_OCTO_COAX_PLUS: { frame = SystemSettings::AIRFRAMETYPE_OCTOCOAXP; - mixer.channels[0].type = MIXER_TYPE_MOTOR; - mixer.channels[0].throttle1 = 100; - mixer.channels[0].throttle2 = 0; - mixer.channels[0].roll = 0; - mixer.channels[0].pitch = 100; - mixer.channels[0].yaw = -50; + channels[0].type = MIXER_TYPE_MOTOR; + channels[0].throttle1 = 100; + channels[0].throttle2 = 0; + channels[0].roll = 0; + channels[0].pitch = 100; + channels[0].yaw = -50; - mixer.channels[1].type = MIXER_TYPE_MOTOR; - mixer.channels[1].throttle1 = 100; - mixer.channels[1].throttle2 = 0; - mixer.channels[1].roll = 0; - mixer.channels[1].pitch = 100; - mixer.channels[1].yaw = 50; + channels[1].type = MIXER_TYPE_MOTOR; + channels[1].throttle1 = 100; + channels[1].throttle2 = 0; + channels[1].roll = 0; + channels[1].pitch = 100; + channels[1].yaw = 50; - mixer.channels[2].type = MIXER_TYPE_MOTOR; - mixer.channels[2].throttle1 = 100; - mixer.channels[2].throttle2 = 0; - mixer.channels[2].roll = -100; - mixer.channels[2].pitch = 0; - mixer.channels[2].yaw = -50; + channels[2].type = MIXER_TYPE_MOTOR; + channels[2].throttle1 = 100; + channels[2].throttle2 = 0; + channels[2].roll = -100; + channels[2].pitch = 0; + channels[2].yaw = -50; - mixer.channels[3].type = MIXER_TYPE_MOTOR; - mixer.channels[3].throttle1 = 100; - mixer.channels[3].throttle2 = 0; - mixer.channels[3].roll = -100; - mixer.channels[3].pitch = 0; - mixer.channels[3].yaw = 50; + channels[3].type = MIXER_TYPE_MOTOR; + channels[3].throttle1 = 100; + channels[3].throttle2 = 0; + channels[3].roll = -100; + channels[3].pitch = 0; + channels[3].yaw = 50; - mixer.channels[4].type = MIXER_TYPE_MOTOR; - mixer.channels[4].throttle1 = 100; - mixer.channels[4].throttle2 = 0; - mixer.channels[4].roll = 0; - mixer.channels[4].pitch = -100; - mixer.channels[4].yaw = -50; + channels[4].type = MIXER_TYPE_MOTOR; + channels[4].throttle1 = 100; + channels[4].throttle2 = 0; + channels[4].roll = 0; + channels[4].pitch = -100; + channels[4].yaw = -50; - mixer.channels[5].type = MIXER_TYPE_MOTOR; - mixer.channels[5].throttle1 = 100; - mixer.channels[5].throttle2 = 0; - mixer.channels[5].roll = 0; - mixer.channels[5].pitch = -100; - mixer.channels[5].yaw = 50; + channels[5].type = MIXER_TYPE_MOTOR; + channels[5].throttle1 = 100; + channels[5].throttle2 = 0; + channels[5].roll = 0; + channels[5].pitch = -100; + channels[5].yaw = 50; - mixer.channels[6].type = MIXER_TYPE_MOTOR; - mixer.channels[6].throttle1 = 100; - mixer.channels[6].throttle2 = 0; - mixer.channels[6].roll = 100; - mixer.channels[6].pitch = 0; - mixer.channels[6].yaw = -50; + channels[6].type = MIXER_TYPE_MOTOR; + channels[6].throttle1 = 100; + channels[6].throttle2 = 0; + channels[6].roll = 100; + channels[6].pitch = 0; + channels[6].yaw = -50; - mixer.channels[7].type = MIXER_TYPE_MOTOR; - mixer.channels[7].throttle1 = 100; - mixer.channels[7].throttle2 = 0; - mixer.channels[7].roll = 100; - mixer.channels[7].pitch = 0; - mixer.channels[7].yaw = 50; + channels[7].type = MIXER_TYPE_MOTOR; + channels[7].throttle1 = 100; + channels[7].throttle2 = 0; + channels[7].roll = 100; + channels[7].pitch = 0; + channels[7].yaw = 50; guiSettings.multi.VTOLMotorN = 1; guiSettings.multi.VTOLMotorNE = 2; @@ -1126,61 +1126,61 @@ void VehicleConfigurationHelper::setupOctoCopter() } case VehicleConfigurationSource::MULTI_ROTOR_OCTO_V: { frame = SystemSettings::AIRFRAMETYPE_OCTOV; - mixer.channels[0].type = MIXER_TYPE_MOTOR; - mixer.channels[0].throttle1 = 100; - mixer.channels[0].throttle2 = 0; - mixer.channels[0].roll = -25; - mixer.channels[0].pitch = 8; - mixer.channels[0].yaw = -25; + channels[0].type = MIXER_TYPE_MOTOR; + channels[0].throttle1 = 100; + channels[0].throttle2 = 0; + channels[0].roll = -25; + channels[0].pitch = 8; + channels[0].yaw = -25; - mixer.channels[1].type = MIXER_TYPE_MOTOR; - mixer.channels[1].throttle1 = 100; - mixer.channels[1].throttle2 = 0; - mixer.channels[1].roll = -25; - mixer.channels[1].pitch = 25; - mixer.channels[1].yaw = 25; + channels[1].type = MIXER_TYPE_MOTOR; + channels[1].throttle1 = 100; + channels[1].throttle2 = 0; + channels[1].roll = -25; + channels[1].pitch = 25; + channels[1].yaw = 25; - mixer.channels[2].type = MIXER_TYPE_MOTOR; - mixer.channels[2].throttle1 = 100; - mixer.channels[2].throttle2 = 0; - mixer.channels[2].roll = -25; - mixer.channels[2].pitch = -25; - mixer.channels[2].yaw = -25; + channels[2].type = MIXER_TYPE_MOTOR; + channels[2].throttle1 = 100; + channels[2].throttle2 = 0; + channels[2].roll = -25; + channels[2].pitch = -25; + channels[2].yaw = -25; - mixer.channels[3].type = MIXER_TYPE_MOTOR; - mixer.channels[3].throttle1 = 100; - mixer.channels[3].throttle2 = 0; - mixer.channels[3].roll = -25; - mixer.channels[3].pitch = -8; - mixer.channels[3].yaw = 25; + channels[3].type = MIXER_TYPE_MOTOR; + channels[3].throttle1 = 100; + channels[3].throttle2 = 0; + channels[3].roll = -25; + channels[3].pitch = -8; + channels[3].yaw = 25; - mixer.channels[4].type = MIXER_TYPE_MOTOR; - mixer.channels[4].throttle1 = 100; - mixer.channels[4].throttle2 = 0; - mixer.channels[4].roll = 25; - mixer.channels[4].pitch = -8; - mixer.channels[4].yaw = -25; + channels[4].type = MIXER_TYPE_MOTOR; + channels[4].throttle1 = 100; + channels[4].throttle2 = 0; + channels[4].roll = 25; + channels[4].pitch = -8; + channels[4].yaw = -25; - mixer.channels[5].type = MIXER_TYPE_MOTOR; - mixer.channels[5].throttle1 = 100; - mixer.channels[5].throttle2 = 0; - mixer.channels[5].roll = 25; - mixer.channels[5].pitch = -25; - mixer.channels[5].yaw = 25; + channels[5].type = MIXER_TYPE_MOTOR; + channels[5].throttle1 = 100; + channels[5].throttle2 = 0; + channels[5].roll = 25; + channels[5].pitch = -25; + channels[5].yaw = 25; - mixer.channels[6].type = MIXER_TYPE_MOTOR; - mixer.channels[6].throttle1 = 100; - mixer.channels[6].throttle2 = 0; - mixer.channels[6].roll = 25; - mixer.channels[6].pitch = 25; - mixer.channels[6].yaw = -25; + channels[6].type = MIXER_TYPE_MOTOR; + channels[6].throttle1 = 100; + channels[6].throttle2 = 0; + channels[6].roll = 25; + channels[6].pitch = 25; + channels[6].yaw = -25; - mixer.channels[7].type = MIXER_TYPE_MOTOR; - mixer.channels[7].throttle1 = 100; - mixer.channels[7].throttle2 = 0; - mixer.channels[7].roll = 25; - mixer.channels[7].pitch = 8; - mixer.channels[7].yaw = 25; + channels[7].type = MIXER_TYPE_MOTOR; + channels[7].throttle1 = 100; + channels[7].throttle2 = 0; + channels[7].roll = 25; + channels[7].pitch = 8; + channels[7].yaw = 25; guiSettings.multi.VTOLMotorN = 1; guiSettings.multi.VTOLMotorNE = 2; @@ -1197,6 +1197,6 @@ void VehicleConfigurationHelper::setupOctoCopter() break; } - applyMixerConfiguration(mixer); + applyMixerConfiguration(channels); applyMultiGUISettings(frame, guiSettings); } diff --git a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h index 430594d7a..44f2125b1 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/vehicleconfigurationhelper.h @@ -50,10 +50,6 @@ struct mixerChannelSettings { : type(t), throttle1(th1), throttle2(th2), roll(r), pitch(p), yaw(y) {} }; -struct mixerSettings { - mixerChannelSettings channels[10]; -}; - class VehicleConfigurationHelper : public QObject { Q_OBJECT @@ -88,7 +84,7 @@ private: void applyStabilizationConfiguration(); void applyManualControlDefaults(); - void applyMixerConfiguration(mixerSettings mixer); + void applyMixerConfiguration(mixerChannelSettings channels[]); GUIConfigDataUnion getGUIConfigData(); void applyMultiGUISettings(SystemSettings::AirframeTypeOptions airframe, GUIConfigDataUnion guiConfig); diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp index 314914667..06efb17b1 100755 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp @@ -71,8 +71,6 @@ UploaderGadgetWidget::UploaderGadgetWidget(QWidget *parent) : QWidget(parent) onAutopilotConnect(); versionMatchCheck(); } - - } @@ -687,7 +685,8 @@ void UploaderGadgetWidget::versionMatchCheck() "GCS version: %1 Firmware version: %2.")).arg(gcsVersion).arg(fwVersion); msg->showMessage(warning); } - } +} + void UploaderGadgetWidget::openHelp() { From a47687cff8f89da04317f1900451330ccc5f7d5f Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Tue, 2 Oct 2012 23:17:56 +0200 Subject: [PATCH 56/56] OP-39 Added correct dependencies to SetupWizard plugin specification. Renamed FlashPage to FlashDance, eeh, no SavePage :) Removed unnecessary dependency in setupwizard.pro Fixed a bug with the Next button on the first page. Fixed a bug with the cancel button on the last page. --- .../src/plugins/config/Config.pluginspec | 2 +- ground/openpilotgcs/src/plugins/plugins.pro | 1 - .../setupwizard/SetupWizard.pluginspec | 2 ++ .../pages/{flashpage.cpp => savepage.cpp} | 24 +++++++++---------- .../pages/{flashpage.h => savepage.h} | 20 ++++++++-------- .../pages/{flashpage.ui => savepage.ui} | 4 ++-- .../src/plugins/setupwizard/setupwizard.cpp | 18 +++++++++----- .../src/plugins/setupwizard/setupwizard.h | 4 +++- .../src/plugins/setupwizard/setupwizard.pro | 12 +++++----- 9 files changed, 48 insertions(+), 39 deletions(-) rename ground/openpilotgcs/src/plugins/setupwizard/pages/{flashpage.cpp => savepage.cpp} (86%) rename ground/openpilotgcs/src/plugins/setupwizard/pages/{flashpage.h => savepage.h} (82%) rename ground/openpilotgcs/src/plugins/setupwizard/pages/{flashpage.ui => savepage.ui} (98%) diff --git a/ground/openpilotgcs/src/plugins/config/Config.pluginspec b/ground/openpilotgcs/src/plugins/config/Config.pluginspec index 1ba1c8f76..f9ce7a7e5 100644 --- a/ground/openpilotgcs/src/plugins/config/Config.pluginspec +++ b/ground/openpilotgcs/src/plugins/config/Config.pluginspec @@ -1,4 +1,4 @@ - + The OpenPilot Project (C) 2010 OpenPilot Project GNU Public License (GPL) Version 3 diff --git a/ground/openpilotgcs/src/plugins/plugins.pro b/ground/openpilotgcs/src/plugins/plugins.pro index 48e41c770..a1653cf53 100644 --- a/ground/openpilotgcs/src/plugins/plugins.pro +++ b/ground/openpilotgcs/src/plugins/plugins.pro @@ -228,7 +228,6 @@ plugin_setupwizard.subdir = setupwizard plugin_setupwizard.depends = plugin_coreplugin plugin_setupwizard.depends += plugin_uavobjects plugin_setupwizard.depends += plugin_config -plugin_setupwizard.depends += plugin_uavsettingsimportexport SUBDIRS += plugin_setupwizard # Junsi Powerlog plugin diff --git a/ground/openpilotgcs/src/plugins/setupwizard/SetupWizard.pluginspec b/ground/openpilotgcs/src/plugins/setupwizard/SetupWizard.pluginspec index 4425b290e..8aa610ec8 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/SetupWizard.pluginspec +++ b/ground/openpilotgcs/src/plugins/setupwizard/SetupWizard.pluginspec @@ -6,5 +6,7 @@ http://www.openpilot.org + + diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp b/ground/openpilotgcs/src/plugins/setupwizard/pages/savepage.cpp similarity index 86% rename from ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp rename to ground/openpilotgcs/src/plugins/setupwizard/pages/savepage.cpp index 5a5900ac7..f3e03e0fb 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/savepage.cpp @@ -1,11 +1,11 @@ /** ****************************************************************************** * - * @file flashpage.cpp + * @file savepage.cpp * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. * @addtogroup * @{ - * @addtogroup FlashPage + * @addtogroup SavePage * @{ * @brief *****************************************************************************/ @@ -26,35 +26,35 @@ */ #include -#include "flashpage.h" -#include "ui_flashpage.h" +#include "savepage.h" +#include "ui_savepage.h" #include "setupwizard.h" #include "vehicleconfigurationhelper.h" -FlashPage::FlashPage(SetupWizard *wizard, QWidget *parent) : +SavePage::SavePage(SetupWizard *wizard, QWidget *parent) : AbstractWizardPage(wizard, parent), - ui(new Ui::FlashPage), m_successfulWrite(false) + ui(new Ui::SavePage), m_successfulWrite(false) { ui->setupUi(this); connect(ui->saveButton, SIGNAL(clicked()), this, SLOT(writeToController())); } -FlashPage::~FlashPage() +SavePage::~SavePage() { delete ui; } -bool FlashPage::validatePage() +bool SavePage::validatePage() { return true; } -bool FlashPage::isComplete() const +bool SavePage::isComplete() const { return m_successfulWrite; } -void FlashPage::writeToController() +void SavePage::writeToController() { if(!getWizard()->getConnectionManager()->isConnected()) { QMessageBox msgBox; @@ -79,7 +79,7 @@ void FlashPage::writeToController() emit completeChanged(); } -void FlashPage::enableButtons(bool enable) +void SavePage::enableButtons(bool enable) { ui->saveButton->setEnabled(enable); getWizard()->button(QWizard::NextButton)->setEnabled(enable); @@ -88,7 +88,7 @@ void FlashPage::enableButtons(bool enable) QApplication::processEvents(); } -void FlashPage::saveProgress(int total, int current, QString description) +void SavePage::saveProgress(int total, int current, QString description) { qDebug() << "Progress " << current << "(" << total << ")"; if(ui->saveProgressBar->maximum() != total) { diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h b/ground/openpilotgcs/src/plugins/setupwizard/pages/savepage.h similarity index 82% rename from ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h rename to ground/openpilotgcs/src/plugins/setupwizard/pages/savepage.h index 6602926ea..d8382df93 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/savepage.h @@ -1,11 +1,11 @@ /** ****************************************************************************** * - * @file flashpage.h + * @file savepage.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012. * @addtogroup * @{ - * @addtogroup FlashPage + * @addtogroup SavePage * @{ * @brief *****************************************************************************/ @@ -25,27 +25,27 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef FLASHPAGE_H -#define FLASHPAGE_H +#ifndef SAVEPAGE_H +#define SAVEPAGE_H #include "abstractwizardpage.h" namespace Ui { -class FlashPage; +class SavePage; } -class FlashPage : public AbstractWizardPage +class SavePage : public AbstractWizardPage { Q_OBJECT public: - explicit FlashPage(SetupWizard *wizard, QWidget *parent = 0); - ~FlashPage(); + explicit SavePage(SetupWizard *wizard, QWidget *parent = 0); + ~SavePage(); bool validatePage(); bool isComplete() const; private: - Ui::FlashPage *ui; + Ui::SavePage *ui; bool m_successfulWrite; void enableButtons(bool enable); @@ -54,4 +54,4 @@ private slots: void saveProgress(int total, int current, QString description); }; -#endif // FLASHPAGE_H +#endif // SAVEPAGE_H diff --git a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui b/ground/openpilotgcs/src/plugins/setupwizard/pages/savepage.ui similarity index 98% rename from ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui rename to ground/openpilotgcs/src/plugins/setupwizard/pages/savepage.ui index 0f5f62e9f..d5a5710ed 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/pages/flashpage.ui +++ b/ground/openpilotgcs/src/plugins/setupwizard/pages/savepage.ui @@ -1,7 +1,7 @@ - FlashPage - + SavePage + 0 diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp index f91357b35..fd3b2a083 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.cpp @@ -38,7 +38,7 @@ #include "pages/outputpage.h" #include "pages/levellingpage.h" #include "pages/summarypage.h" -#include "pages/flashpage.h" +#include "pages/savepage.h" #include "pages/notyetimplementedpage.h" #include "pages/rebootpage.h" #include "pages/outputcalibrationpage.h" @@ -111,10 +111,10 @@ int SetupWizard::nextId() const case PAGE_LEVELLING: return PAGE_CALIBRATION; case PAGE_CALIBRATION: - return PAGE_FLASH; + return PAGE_SAVE; case PAGE_SUMMARY: return PAGE_LEVELLING; - case PAGE_FLASH: + case PAGE_SAVE: return PAGE_END; case PAGE_NOTYETIMPLEMENTED: return PAGE_END; @@ -268,7 +268,7 @@ void SetupWizard::createPages() setPage(PAGE_LEVELLING, new LevellingPage(this)); setPage(PAGE_CALIBRATION, new OutputCalibrationPage(this)); setPage(PAGE_SUMMARY, new SummaryPage(this)); - setPage(PAGE_FLASH, new FlashPage(this)); + setPage(PAGE_SAVE, new SavePage(this)); setPage(PAGE_REBOOT, new RebootPage(this)); setPage(PAGE_NOTYETIMPLEMENTED, new NotYetImplementedPage(this)); setPage(PAGE_END, new EndPage(this)); @@ -278,9 +278,9 @@ void SetupWizard::createPages() connect(button(QWizard::CustomButton1), SIGNAL(clicked()), this, SLOT(customBackClicked())); setButtonText(QWizard::CustomButton1, buttonText(QWizard::BackButton)); QList button_layout; - button_layout << QWizard::Stretch << QWizard::CustomButton1 << QWizard::NextButton << QWizard::CancelButton; + button_layout << QWizard::Stretch << QWizard::CustomButton1 << QWizard::NextButton << QWizard::CancelButton << QWizard::FinishButton; setButtonLayout(button_layout); - + connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(pageChanged(int))); } void SetupWizard::customBackClicked() @@ -293,6 +293,12 @@ void SetupWizard::customBackClicked() } } +void SetupWizard::pageChanged(int currId) +{ + button(QWizard::CustomButton1)->setVisible(currId != PAGE_START); + button(QWizard::CancelButton)->setVisible(currId != PAGE_END); +} + bool SetupWizard::saveHardwareSettings() const { VehicleConfigurationHelper helper(const_cast(this)); diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h index 1a8728714..c6cf7e1ae 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.h @@ -78,12 +78,14 @@ public: } return m_connectionManager; } + private slots: void customBackClicked(); + void pageChanged(int currId); private: enum {PAGE_START, PAGE_CONTROLLER, PAGE_VEHICLES, PAGE_MULTI, PAGE_FIXEDWING, PAGE_HELI, PAGE_SURFACE, PAGE_INPUT, PAGE_OUTPUT, PAGE_LEVELLING, PAGE_CALIBRATION, - PAGE_FLASH, PAGE_SUMMARY, PAGE_NOTYETIMPLEMENTED, PAGE_REBOOT, PAGE_END}; + PAGE_SAVE, PAGE_SUMMARY, PAGE_NOTYETIMPLEMENTED, PAGE_REBOOT, PAGE_END}; void createPages(); bool saveHardwareSettings() const; diff --git a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro index e94f4a4a4..6d336a888 100644 --- a/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro +++ b/ground/openpilotgcs/src/plugins/setupwizard/setupwizard.pro @@ -23,7 +23,6 @@ HEADERS += setupwizardplugin.h \ pages/outputpage.h \ pages/inputpage.h \ pages/summarypage.h \ - pages/flashpage.h \ pages/levellingpage.h \ levellingutil.h \ vehicleconfigurationsource.h \ @@ -31,7 +30,8 @@ HEADERS += setupwizardplugin.h \ connectiondiagram.h \ pages/outputcalibrationpage.h \ outputcalibrationutil.h \ - pages/rebootpage.h + pages/rebootpage.h \ + pages/savepage.h SOURCES += setupwizardplugin.cpp \ setupwizard.cpp \ @@ -48,7 +48,6 @@ SOURCES += setupwizardplugin.cpp \ pages/outputpage.cpp \ pages/inputpage.cpp \ pages/summarypage.cpp \ - pages/flashpage.cpp \ pages/levellingpage.cpp \ levellingutil.cpp \ vehicleconfigurationsource.cpp \ @@ -56,7 +55,8 @@ SOURCES += setupwizardplugin.cpp \ connectiondiagram.cpp \ pages/outputcalibrationpage.cpp \ outputcalibrationutil.cpp \ - pages/rebootpage.cpp + pages/rebootpage.cpp \ + pages/savepage.cpp OTHER_FILES += SetupWizard.pluginspec @@ -73,11 +73,11 @@ FORMS += \ pages/outputpage.ui \ pages/inputpage.ui \ pages/summarypage.ui \ - pages/flashpage.ui \ pages/levellingpage.ui \ connectiondiagram.ui \ pages/outputcalibrationpage.ui \ - pages/rebootpage.ui + pages/rebootpage.ui \ + pages/savepage.ui RESOURCES += \ wizardResources.qrc