diff --git a/ground/openpilotgcs/src/plugins/config/airframe_ground.ui b/ground/openpilotgcs/src/plugins/config/airframe_ground.ui
index 1dcd01408..45ad93ab6 100644
--- a/ground/openpilotgcs/src/plugins/config/airframe_ground.ui
+++ b/ground/openpilotgcs/src/plugins/config/airframe_ground.ui
@@ -476,6 +476,9 @@ margin:1px;
Qt::Vertical
+
+ QSizePolicy::MinimumExpanding
+
20
diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configgroundvehiclewidget.cpp b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configgroundvehiclewidget.cpp
index f73f9b9b0..6323d2183 100644
--- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configgroundvehiclewidget.cpp
+++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configgroundvehiclewidget.cpp
@@ -113,6 +113,15 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
m_aircraft->differentialSteeringSlider1->setEnabled(false);
m_aircraft->differentialSteeringSlider2->setEnabled(false);
+ m_aircraft->gvThrottleCurve1GroupBox->setEnabled(true);
+ m_aircraft->gvThrottleCurve2GroupBox->setEnabled(true);
+
+ // Default Curve range -1 -> +1, allow forward/reverse (Car and Tank)
+ m_aircraft->groundVehicleThrottle1->setMixerType(MixerCurve::MIXERCURVE_PITCH);
+ m_aircraft->groundVehicleThrottle2->setMixerType(MixerCurve::MIXERCURVE_PITCH);
+
+ initMixerCurves(frameType);
+
if (frameType == "GroundVehicleDifferential" || frameType == "Differential (tank)") {
// Tank
m_vehicleImg->setElementId("tank");
@@ -136,10 +145,14 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
m_aircraft->gvThrottleCurve1GroupBox->setTitle("Left throttle curve");
m_aircraft->gvThrottleCurve2GroupBox->setTitle("Right throttle curve");
- // If new setup, set sliders to defaults
- if (frameTypeSaved->getValue().toString() != "GroundVehicleDifferential") {
- m_aircraft->differentialSteeringSlider1->setValue(50);
- m_aircraft->differentialSteeringSlider2->setValue(50);
+ // If new setup, set sliders to defaults and set curves values
+ // Allow forward/reverse 0.8 / -0.8 for Throttle, keep some room
+ // to allow rotate at full throttle and heading stabilization
+ if (frameTypeSaved->getValue().toString() != "GroundVehicleDifferential") {
+ m_aircraft->differentialSteeringSlider1->setValue(100);
+ m_aircraft->differentialSteeringSlider2->setValue(100);
+ m_aircraft->groundVehicleThrottle1->initLinearCurve(5, 0.8, -0.8);
+ m_aircraft->groundVehicleThrottle2->initLinearCurve(5, 0.8, -0.8);
}
} else if (frameType == "GroundVehicleMotorcycle" || frameType == "Motorcycle") {
// Motorcycle
@@ -147,8 +160,8 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
setComboCurrentIndex(m_aircraft->groundVehicleType, m_aircraft->groundVehicleType->findText("Motorcycle"));
m_aircraft->gvMotor1ChannelBox->setEnabled(false);
m_aircraft->gvMotor2ChannelBox->setEnabled(true);
+ m_aircraft->gvThrottleCurve1GroupBox->setEnabled(false);
- m_aircraft->gvMotor1Label->setText("Front motor");
m_aircraft->gvMotor2Label->setText("Rear motor");
m_aircraft->gvSteering1ChannelBox->setEnabled(true);
@@ -157,8 +170,17 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
m_aircraft->gvSteering1Label->setText("Front steering");
m_aircraft->gvSteering2Label->setText("Balancing");
- m_aircraft->gvThrottleCurve1GroupBox->setTitle("Front throttle curve");
m_aircraft->gvThrottleCurve2GroupBox->setTitle("Rear throttle curve");
+
+ // Curve range 0 -> +1 (no reverse)
+ m_aircraft->groundVehicleThrottle2->setMixerType(MixerCurve::MIXERCURVE_THROTTLE);
+ m_aircraft->groundVehicleThrottle1->setMixerType(MixerCurve::MIXERCURVE_THROTTLE);
+
+ // If new setup, set curves values
+ if (frameTypeSaved->getValue().toString() != "GroundVehicleMotorCycle") {
+ m_aircraft->groundVehicleThrottle2->initLinearCurve(5, 1.0);
+ m_aircraft->groundVehicleThrottle1->initLinearCurve(5, 1.0);
+ }
} else {
// Car
m_vehicleImg->setElementId("car");
@@ -178,6 +200,12 @@ void ConfigGroundVehicleWidget::setupUI(QString frameType)
m_aircraft->gvThrottleCurve1GroupBox->setTitle("Front throttle curve");
m_aircraft->gvThrottleCurve2GroupBox->setTitle("Rear throttle curve");
+
+ // If new setup, set curves values
+ if (frameTypeSaved->getValue().toString() != "GroundVehicleCar") {
+ m_aircraft->groundVehicleThrottle1->initLinearCurve(5, 1.0, -1.0);
+ m_aircraft->groundVehicleThrottle2->initLinearCurve(5, 1.0, -1.0);
+ }
}
QGraphicsScene *scene = new QGraphicsScene();
@@ -224,29 +252,11 @@ void ConfigGroundVehicleWidget::refreshWidgetsValues(QString frameType)
{
setupUI(frameType);
+ initMixerCurves(frameType);
+
UAVDataObject *mixer = dynamic_cast(getObjectManager()->getObject(QString("MixerSettings")));
Q_ASSERT(mixer);
- QList curveValues;
- getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, &curveValues);
-
- // is at least one of the curve values != 0?
- if (isValidThrottleCurve(&curveValues)) {
- // yes, use the curve we just read from mixersettings
- m_aircraft->groundVehicleThrottle1->initCurve(&curveValues);
- } else {
- // no, init a straight curve
- m_aircraft->groundVehicleThrottle1->initLinearCurve(curveValues.count(), 1.0);
- }
-
- // Setup all Throttle2 curves for all types of airframes
- getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE2, &curveValues);
-
- if (isValidThrottleCurve(&curveValues)) {
- m_aircraft->groundVehicleThrottle2->initCurve(&curveValues);
- } else {
- m_aircraft->groundVehicleThrottle2->initLinearCurve(curveValues.count(), 1.0);
- }
GUIConfigDataUnion config = getConfigData();
// THIS SECTION STILL NEEDS WORK. FOR THE MOMENT, USE THE FIXED-WING ONBOARD SETTING IN ORDER TO MINIMIZE CHANCES OF BOLLOXING REAL CODE
@@ -269,7 +279,51 @@ void ConfigGroundVehicleWidget::refreshWidgetsValues(QString frameType)
m_aircraft->differentialSteeringSlider2->setValue(
-getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_YAW) / 1.27);
}
- }
+ }
+}
+
+/**
+ Virtual function to update curve values from board
+ */
+void ConfigGroundVehicleWidget::initMixerCurves(QString frameType)
+{
+ UAVDataObject *mixer = dynamic_cast(getObjectManager()->getObject(QString("MixerSettings")));
+
+ Q_ASSERT(mixer);
+
+ QList curveValues;
+ getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE1, &curveValues);
+
+ // is at least one of the curve values != 0?
+ if (isValidThrottleCurve(&curveValues)) {
+ // yes, use the curve we just read from mixersettings
+ m_aircraft->groundVehicleThrottle1->initCurve(&curveValues);
+ } else {
+ // no, init a straight curve
+ if (frameType == "GroundVehicleDifferential") {
+ m_aircraft->groundVehicleThrottle1->initLinearCurve(curveValues.count(), 0.8, -0.8);
+ } else if (frameType == "GroundVehicleCar") {
+ m_aircraft->groundVehicleThrottle1->initLinearCurve(curveValues.count(), 1.0, -1.0);
+ } else {
+ m_aircraft->groundVehicleThrottle1->initLinearCurve(curveValues.count(), 1.0);
+ }
+ }
+
+ // Setup all Throttle2 curves for all types of airframes
+ getThrottleCurve(mixer, VehicleConfig::MIXER_THROTTLECURVE2, &curveValues);
+
+ if (isValidThrottleCurve(&curveValues)) {
+ m_aircraft->groundVehicleThrottle2->initCurve(&curveValues);
+ } else {
+ // no, init a straight curve
+ if (frameType == "GroundVehicleDifferential") {
+ m_aircraft->groundVehicleThrottle2->initLinearCurve(curveValues.count(), 0.8, -0.8);
+ } else if (frameType == "GroundVehicleCar") {
+ m_aircraft->groundVehicleThrottle2->initLinearCurve(curveValues.count(), 1.0, -1.0);
+ } else {
+ m_aircraft->groundVehicleThrottle2->initLinearCurve(curveValues.count(), 1.0);
+ }
+ }
}
/**
@@ -311,7 +365,6 @@ QString ConfigGroundVehicleWidget::updateConfigObjectsFromWidgets()
*/
bool ConfigGroundVehicleWidget::setupGroundVehicleMotorcycle(QString airframeType)
{
-
// Check coherence:
// Show any config errors in GUI
if (throwConfigError(airframeType)) {
diff --git a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configgroundvehiclewidget.h b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configgroundvehiclewidget.h
index b8520f402..ff2b6c796 100644
--- a/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configgroundvehiclewidget.h
+++ b/ground/openpilotgcs/src/plugins/config/cfg_vehicletypes/configgroundvehiclewidget.h
@@ -50,6 +50,7 @@ public:
~ConfigGroundVehicleWidget();
virtual void refreshWidgetsValues(QString frameType);
+ virtual void initMixerCurves(QString frameType);
virtual QString updateConfigObjectsFromWidgets();
protected: