diff --git a/flight/modules/TxPID/txpid.c b/flight/modules/TxPID/txpid.c index b7c3baaae..1f2e862af 100644 --- a/flight/modules/TxPID/txpid.c +++ b/flight/modules/TxPID/txpid.c @@ -253,6 +253,16 @@ static void updatePIDs(UAVObjEvent *ev) case TXPIDSETTINGS_PIDS_ROLLRATEKP: needsUpdateBank |= update(&bank.RollRatePID.Kp, value); break; + case TXPIDSETTINGS_PIDS_ROLLRATEPID: + needsUpdateBank |= update(&bank.RollRatePID.Kp, value); + needsUpdateBank |= update(&bank.RollRatePID.Ki, value * inst.PitchRollRateFactors.I); + needsUpdateBank |= update(&bank.RollRatePID.Kd, value * inst.PitchRollRateFactors.D); + break; + case TXPIDSETTINGS_PIDS_PITCHRATEPID: + needsUpdateBank |= update(&bank.PitchRatePID.Kp, value); + needsUpdateBank |= update(&bank.PitchRatePID.Ki, value * inst.PitchRollRateFactors.I); + needsUpdateBank |= update(&bank.PitchRatePID.Kd, value * inst.PitchRollRateFactors.D); + break; case TXPIDSETTINGS_PIDS_ROLLRATEKI: needsUpdateBank |= update(&bank.RollRatePID.Ki, value); break; @@ -394,13 +404,13 @@ static void updatePIDs(UAVObjEvent *ev) needsUpdateBank |= update(&bank.AcroInsanityFactor.Pitch, value); break; case TXPIDSETTINGS_PIDS_ACCELTAU: - needsUpdateAtt |= update(&att.AccelTau, value); + needsUpdateAtt |= update(&att.AccelTau, value); break; case TXPIDSETTINGS_PIDS_ACCELKP: - needsUpdateAtt |= update(&att.AccelKp, value); + needsUpdateAtt |= update(&att.AccelKp, value); break; case TXPIDSETTINGS_PIDS_ACCELKI: - needsUpdateAtt |= update(&att.AccelKi, value); + needsUpdateAtt |= update(&att.AccelKi, value); break; #ifdef REVOLUTION @@ -436,6 +446,12 @@ static void updatePIDs(UAVObjEvent *ev) AltitudeHoldSettingsSet(&altitude); } #endif + if (inst.RatePIDRecalculateYaw != TXPIDSETTINGS_RATEPIDRECALCULATEYAW_FALSE) { + float newKp = (bank.RollRatePID.Kp + bank.PitchRatePID.Kp) * .5f * inst.YawRateFactors.P; + needsUpdateBank |= update(&bank.YawRatePID.Kp, newKp); + needsUpdateBank |= update(&bank.YawRatePID.Ki, newKp * inst.YawRateFactors.I); + needsUpdateBank |= update(&bank.YawRatePID.Kd, newKp * inst.YawRateFactors.D); + } if (needsUpdateBank) { switch (inst.BankNumber) { case 0: diff --git a/ground/gcs/src/plugins/config/configtxpidwidget.cpp b/ground/gcs/src/plugins/config/configtxpidwidget.cpp index d66deb77d..ea1ce68b0 100644 --- a/ground/gcs/src/plugins/config/configtxpidwidget.cpp +++ b/ground/gcs/src/plugins/config/configtxpidwidget.cpp @@ -89,8 +89,10 @@ ConfigTxPIDWidget::ConfigTxPIDWidget(QWidget *parent) : ConfigTaskWidget(parent) addWidgetBinding("TxPIDSettings", "UpdateMode", m_txpid->UpdateMode); - addWidget(m_txpid->TxPIDEnable); + connect(this, SIGNAL(widgetContentsChanged(QWidget *)), this, SLOT(processLinkedWidgets(QWidget *))); + addWidget(m_txpid->TxPIDEnable); + addWidget(m_txpid->enableAutoCalcYaw); enableControls(false); populateWidgets(); refreshWidgetsValues(); @@ -161,6 +163,18 @@ static bool isExpoOption(int pidOption) } } +static bool isFullPIDOption(int pidOption) +{ + switch (pidOption) { + case TxPIDSettings::PIDS_ROLLRATEPID: + case TxPIDSettings::PIDS_PITCHRATEPID: + return true; + + default: + return false; + } +} + static bool isAcroPlusFactorOption(int pidOption) { switch (pidOption) { @@ -182,9 +196,11 @@ static float defaultValueForPidOption(const StabilizationSettingsBankX *bank, in return 0.0f; case TxPIDSettings::PIDS_ROLLRATEKP: + case TxPIDSettings::PIDS_ROLLRATEPID: return bank->getRollRatePID_Kp(); case TxPIDSettings::PIDS_PITCHRATEKP: + case TxPIDSettings::PIDS_PITCHRATEPID: return bank->getPitchRatePID_Kp(); case TxPIDSettings::PIDS_ROLLPITCHRATEKP: @@ -300,11 +316,14 @@ static float defaultValueForPidOption(const StabilizationSettingsBankX *bank, in case TxPIDSettings::PIDS_YAWEXPO: return bank->getStickExpo_Yaw(); + case TxPIDSettings::PIDS_ACROROLLFACTOR: case TxPIDSettings::PIDS_ACROROLLPITCHFACTOR: return bank->getAcroInsanityFactor_Roll(); + case TxPIDSettings::PIDS_ACROPITCHFACTOR: return bank->getAcroInsanityFactor_Pitch(); + case -1: // The PID Option field was uninitialized. return 0.0f; @@ -445,3 +464,23 @@ void ConfigTxPIDWidget::saveSettings() UAVObject *obj = HwSettings::GetInstance(getObjectManager()); saveObjectToSD(obj); } + +void ConfigTxPIDWidget::processLinkedWidgets(QWidget *widget) +{ + Q_UNUSED(widget); + bool fullPidEnabled = + isFullPIDOption(m_txpid->PID1->currentIndex()) || + isFullPIDOption(m_txpid->PID2->currentIndex()) || + isFullPIDOption(m_txpid->PID3->currentIndex()); + bool calcYawEnabled = fullPidEnabled && m_txpid->enableAutoCalcYaw->isChecked(); + + m_txpid->fullPID_Y_P_FactorSlider->setEnabled(calcYawEnabled); + m_txpid->fullPID_Y_P_FactorSpinBox->setEnabled(calcYawEnabled); + m_txpid->fullPID_Y_I_FactorSpinBox->setEnabled(calcYawEnabled); + m_txpid->fullPID_Y_D_FactorSpinBox->setEnabled(calcYawEnabled); + m_txpid->enableAutoCalcYaw->setEnabled(fullPidEnabled); + m_txpid->fullPID_RP_I_FactorSlider->setEnabled(fullPidEnabled); + m_txpid->fullPID_RP_I_FactorSpinBox->setEnabled(fullPidEnabled); + m_txpid->fullPID_RP_D_FactorSpinBox->setEnabled(fullPidEnabled); + m_txpid->groupBox_FullPids->setEnabled(fullPidEnabled); +} diff --git a/ground/gcs/src/plugins/config/configtxpidwidget.h b/ground/gcs/src/plugins/config/configtxpidwidget.h index afb148119..2073fd438 100644 --- a/ground/gcs/src/plugins/config/configtxpidwidget.h +++ b/ground/gcs/src/plugins/config/configtxpidwidget.h @@ -38,8 +38,8 @@ public: ~ConfigTxPIDWidget(); private: Ui_TxPIDWidget *m_txpid; - private slots: + void processLinkedWidgets(QWidget *widget); void updateSpinBoxProperties(int selectedPidOption); float getDefaultValueForPidOption(int pidOption); void refreshValues(); diff --git a/ground/gcs/src/plugins/config/txpid.ui b/ground/gcs/src/plugins/config/txpid.ui index b7a0887a6..b4d247788 100644 --- a/ground/gcs/src/plugins/config/txpid.ui +++ b/ground/gcs/src/plugins/config/txpid.ui @@ -118,9 +118,9 @@ 0 - 0 - 753 - 475 + -391 + 754 + 783 @@ -196,6 +196,175 @@ Up to 3 separate PID options (or option pairs) can be selected and updated.Module Settings + + + + Qt::StrongFocus + + + Minimum PID value mapped to Accessory channel = 0 or +Throttle channel lesser or equal to Throttle Min value. + + + 6 + + + 0.000100000000000 + + + + + + + Qt::StrongFocus + + + Select PID option or option pair to update. +Set to Disabled if not used. + + + + + + + Qt::StrongFocus + + + Throttle channel lower bound mapped to PID Min value + + + 1.000000000000000 + + + 0.010000000000000 + + + + + + + Qt::StrongFocus + + + Select PID option or option pair to update. +Set to Disabled if not used. + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + Qt::StrongFocus + + + Select input used as a control source for this instance. +It can be one of Accessory channels or Throttle channel. + +If Accessory channel is chosen then its range [0..1] will be mapped +to PID range [Min..Max] defined for this instance. + +If Throttle channel is chosen then Throttle range [Min..Max] will +be mapped to PID range [Min..Max] defined for this instance. If +Throttle is out of bounds then PID Min and Max values will be used +accordingly. + +Note that it is possible to set PID Min > Max. In that case increasing +control input value will decrease the PID option value. This can be +used, for instance, to decrease PID value when increasing Throttle. + + + + + + + + 0 + 0 + + + + + 0 + 16 + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +margin:1px; +font:bold; + + + Control Source + + + Qt::AlignCenter + + + + + + + Qt::StrongFocus + + + Minimum PID value mapped to Accessory channel = 0 or +Throttle channel lesser or equal to Throttle Min value. + + + 6 + + + 0.000100000000000 + + + + + + + + 0 + 0 + + + + + 0 + 16 + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +margin:1px; +font:bold; + + + Min + + + Qt::AlignCenter + + + @@ -225,8 +394,65 @@ font:bold; - - + + + + Update Mode + + + + + + + Qt::StrongFocus + + + Maximum PID value mapped to Accessory channel = 1 or +Throttle channel greater or equal to Throttle Max value. + + + 6 + + + 0.000100000000000 + + + + + + + PID Bank + + + + + + + Qt::StrongFocus + + + Throttle channel upper bound mapped to PID Max value + + + 1.000000000000000 + + + 0.010000000000000 + + + + + + + + + + Instance 3 + + + + + 0 @@ -247,7 +473,167 @@ margin:1px; font:bold; - Control Source + Max + + + Qt::AlignCenter + + + + + + + Instance 2 + + + + + + + Throttle Range + + + + + + + Qt::StrongFocus + + + Minimum PID value mapped to Accessory channel = 0 or +Throttle channel lesser or equal to Throttle Min value. + + + 6 + + + 0.000100000000000 + + + + + + + Qt::StrongFocus + + + Select input used as a control source for this instance. +It can be one of Accessory channels or Throttle channel. + +If Accessory channel is chosen then its range [0..1] will be mapped +to PID range [Min..Max] defined for this instance. + +If Throttle channel is chosen then Throttle range [Min..Max] will +be mapped to PID range [Min..Max] defined for this instance. If +Throttle is out of bounds then PID Min and Max values will be used +accordingly. + +Note that it is possible to set PID Min > Max. In that case increasing +control input value will decrease the PID option value. This can be +used, for instance, to decrease PID value when increasing Throttle. + + + + + + + Instance 1 + + + + + + + Qt::StrongFocus + + + Select PID option or option pair to update. +Set to Disabled if not used. + + + + + + + Qt::StrongFocus + + + Select input used as a control source for this instance. +It can be one of Accessory channels or Throttle channel. + +If Accessory channel is chosen then its range [0..1] will be mapped +to PID range [Min..Max] defined for this instance. + +If Throttle channel is chosen then Throttle range [Min..Max] will +be mapped to PID range [Min..Max] defined for this instance. If +Throttle is out of bounds then PID Min and Max values will be used +accordingly. + +Note that it is possible to set PID Min > Max. In that case increasing +control input value will decrease the PID option value. This can be +used, for instance, to decrease PID value when increasing Throttle. + + + + + + + Qt::StrongFocus + + + Maximum PID value mapped to Accessory channel = 1 or +Throttle channel greater or equal to Throttle Max value. + + + 6 + + + 0.000100000000000 + + + + + + + Qt::StrongFocus + + + PID values update mode, which can be set to: +- Never: this disables PID updates (but module still will be run if enabled), +- When Armed: PID updated only when system is armed, +- Always: PID updated always, regardless of arm state. + +Since the GCS updates GUI PID values in real time on change, it could be +tricky to change other PID values from the GUI if the module is enabled +and constantly updates stabilization settings object. As a workaround, +this option can be used to temporarily disable updates or enable them +only when system is armed without disabling the module. + + + + + + + + 0 + 0 + + + + + 0 + 16 + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +margin:1px; +font:bold; + + + Max Qt::AlignCenter @@ -283,93 +669,6 @@ font:bold; - - - - - 0 - 0 - - - - - 0 - 16 - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -margin:1px; -font:bold; - - - Max - - - Qt::AlignCenter - - - - - - - Instance 1 - - - - - - - Qt::StrongFocus - - - Select PID option or option pair to update. -Set to Disabled if not used. - - - - - - - Qt::StrongFocus - - - Select input used as a control source for this instance. -It can be one of Accessory channels or Throttle channel. - -If Accessory channel is chosen then its range [0..1] will be mapped -to PID range [Min..Max] defined for this instance. - -If Throttle channel is chosen then Throttle range [Min..Max] will -be mapped to PID range [Min..Max] defined for this instance. If -Throttle is out of bounds then PID Min and Max values will be used -accordingly. - -Note that it is possible to set PID Min > Max. In that case increasing -control input value will decrease the PID option value. This can be -used, for instance, to decrease PID value when increasing Throttle. - - - - - - - Qt::StrongFocus - - - Minimum PID value mapped to Accessory channel = 0 or -Throttle channel lesser or equal to Throttle Min value. - - - 6 - - - 0.000100000000000 - - - @@ -387,223 +686,496 @@ Throttle channel greater or equal to Throttle Max value. + + + + + + + true + + + + 0 + 0 + + + + + 0 + 0 + + + + FullPID Settings + + + + + + + 0 + 0 + + + + + 120 + 16 + + + + + 120 + 16777215 + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +margin:1px; +font:bold; + + + Photographer + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 120 + 16 + + + + + 120 + 16777215 + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +margin:1px; +font:bold; + + + FPV Racer + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Reset Roll/Pitch factors to default values + + + false + + + + + + Default + + + + button:default + buttongroup:10 + + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + Roll/Pitch I Factor + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 25 + + + + Roll/Pitch I factor for full PID mode + + + 25 + + + 40 + + + 1 + + + 5 + + + 30 + + + 30 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 5 + + + + objname:TxPIDSettings + fieldname:PitchRollRateFactors + scale:0.1 + element:I + buttongroup:10 + + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + Roll/Pitch D Factor + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 100 + 22 + + + + + 60 + 22 + + + + Roll/Pitch D factor for full PID mode + + + 4 + + + 0.000000000000000 + + + 0.090000000000000 + + + 0.000500000000000 + + + 0.013500000000000 + + + + objname:TxPIDSettings + fieldname:PitchRollRateFactors + scale:1 + element:D + buttongroup:10 + + + + - + + + + 0 + 27 + + + + Calculate Yaw PIDs based on Roll/Pitch PIDs + - Instance 2 + AutoCalc Yaw + + + + objname:TxPIDSettings + fieldname:RatePIDRecalculateYaw + buttongroup:11 + - - - - Qt::StrongFocus + + + + + 0 + 0 + - - Select PID option or option pair to update. -Set to Disabled if not used. + + + 80 + 0 + - - - - - - Qt::StrongFocus - - - Select input used as a control source for this instance. -It can be one of Accessory channels or Throttle channel. - -If Accessory channel is chosen then its range [0..1] will be mapped -to PID range [Min..Max] defined for this instance. - -If Throttle channel is chosen then Throttle range [Min..Max] will -be mapped to PID range [Min..Max] defined for this instance. If -Throttle is out of bounds then PID Min and Max values will be used -accordingly. - -Note that it is possible to set PID Min > Max. In that case increasing -control input value will decrease the PID option value. This can be -used, for instance, to decrease PID value when increasing Throttle. - - - - - - - Qt::StrongFocus - - - Minimum PID value mapped to Accessory channel = 0 or -Throttle channel lesser or equal to Throttle Min value. - - - 6 - - - 0.000100000000000 - - - - - - - Qt::StrongFocus - - - Maximum PID value mapped to Accessory channel = 1 or -Throttle channel greater or equal to Throttle Max value. - - - 6 - - - 0.000100000000000 - - - - - - Instance 3 + Yaw P Factor + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - Qt::StrongFocus + + + + + 0 + 25 + - Select PID option or option pair to update. -Set to Disabled if not used. + Yaw P factor for full PID mode - - - - - - Qt::StrongFocus - - - Select input used as a control source for this instance. -It can be one of Accessory channels or Throttle channel. - -If Accessory channel is chosen then its range [0..1] will be mapped -to PID range [Min..Max] defined for this instance. - -If Throttle channel is chosen then Throttle range [Min..Max] will -be mapped to PID range [Min..Max] defined for this instance. If -Throttle is out of bounds then PID Min and Max values will be used -accordingly. - -Note that it is possible to set PID Min > Max. In that case increasing -control input value will decrease the PID option value. This can be -used, for instance, to decrease PID value when increasing Throttle. - - - - - - - Qt::StrongFocus - - - Minimum PID value mapped to Accessory channel = 0 or -Throttle channel lesser or equal to Throttle Min value. - - - 6 - - - 0.000100000000000 - - - - - - - Qt::StrongFocus - - - Maximum PID value mapped to Accessory channel = 1 or -Throttle channel greater or equal to Throttle Max value. - - - 6 - - - 0.000100000000000 - - - - - - - Update Mode - - - - - - - Qt::StrongFocus - - - PID values update mode which can be set to: -- Never: this disables PID updates (but module still will be run if enabled), -- When Armed: PID updated only when system is armed, -- Always: PID updated always regardless of arm state. - -Since the GCS updates GUI PID values in real time on change, could be -tricky to change other PID values from the GUI if the module is enabled -and constantly updates stabilization settings object. As a workaround, -this option can be used to temporarily disable updates or enable them -only when system is armed without disabling the module. - - - - - - - Throttle Range - - - - - - - Qt::StrongFocus - - - Throttle channel lower bound mapped to PID Min value + + 10 - 1.000000000000000 + 25 - 0.010000000000000 + 1 + + + 5 + + + 25 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 5 + + + + objname:TxPIDSettings + fieldname:YawRateFactors + scale:0.1 + element:P + buttongroup:11 + - - - - Qt::StrongFocus + + + + + 0 + 0 + - - Throttle channel upper bound mapped to PID Max value + + + 80 + 0 + - - 1.000000000000000 + + Yaw I Factor - - 0.010000000000000 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + + + + 100 + 22 + + + + + 60 + 22 + + + + Yaw I factor for full PID mode + + + 0.000000000000000 + + + 10.000000000000000 + + + 0.100000000000000 + + + 1.900000000000000 + + + + objname:TxPIDSettings + fieldname:YawRateFactors + scale:1 + element:I + buttongroup:11 + + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + Yaw D Factor + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 100 + 22 + + + + + 60 + 22 + + + + Yaw D factor for full PID mode + + + 4 + + + 0.000000000000000 + + + 0.100000000000000 + + + 0.000500000000000 + + + 0.008500000000000 + + + + objname:TxPIDSettings + fieldname:YawRateFactors + scale:1 + element:D + buttongroup:11 + + + + + + 0 @@ -612,10 +1184,16 @@ only when system is armed without disabling the module. - 0 + 120 16 + + + 120 + 16777215 + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); @@ -624,15 +1202,138 @@ margin:1px; font:bold; - Min + Soft Qt::AlignCenter - - + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Reset Yaw factors to default values + + + false + + + + + + Default + + + + button:default + buttongroup:11 + + + + + + + + + 60 + 22 + + + + + 60 + 22 + + + + Yaw P factor for full PID mode + + + 1 + + + 0.000000000000000 + + + 10.000000000000000 + + + 0.100000000000000 + + + 2.500000000000000 + + + + objname:TxPIDSettings + fieldname:YawRateFactors + scale:1 + element:P + buttongroup:11 + + + + + + + + + 60 + 22 + + + + + 60 + 22 + + + + Roll/Pitch I factor for full PID mode + + + 1 + + + 0.000000000000000 + + + 10.000000000000000 + + + 4.000000000000000 + + + + objname:TxPIDSettings + fieldname:PitchRollRateFactors + scale:1 + element:I + buttongroup:10 + + + + + + 0 @@ -641,10 +1342,16 @@ font:bold; - 0 + 120 16 + + + 120 + 16777215 + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); @@ -653,39 +1360,13 @@ margin:1px; font:bold; - Max + Aggressive Qt::AlignCenter - - - - Qt::Vertical - - - QSizePolicy::Preferred - - - - 20 - 20 - - - - - - - - PID Bank - - - - - - diff --git a/shared/uavobjectdefinition/txpidsettings.xml b/shared/uavobjectdefinition/txpidsettings.xml index 554598f6b..43adc6574 100644 --- a/shared/uavobjectdefinition/txpidsettings.xml +++ b/shared/uavobjectdefinition/txpidsettings.xml @@ -7,10 +7,11 @@ elementnames="Instance1,Instance2,Instance3" options="Throttle,Accessory0,Accessory1,Accessory2,Accessory3,Accessory4,Accessory5" defaultvalue="Throttle,Accessory0,Accessory1"/> - - + + + + + +