From 2b541219bf0f53fc02e1eede1aafd65345031961 Mon Sep 17 00:00:00 2001 From: Fredrik Arvidsson Date: Wed, 15 Aug 2012 01:04:54 +0200 Subject: [PATCH] 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