diff --git a/flight/OpenPilot/Modules/Actuator/actuator.c b/flight/OpenPilot/Modules/Actuator/actuator.c
index 35a6ddafa..fa4f73fa5 100644
--- a/flight/OpenPilot/Modules/Actuator/actuator.c
+++ b/flight/OpenPilot/Modules/Actuator/actuator.c
@@ -38,6 +38,7 @@
#include "systemsettings.h"
#include "actuatordesired.h"
#include "actuatorcommand.h"
+#include "manualcontrolcommand.h"
// Private constants
#define MAX_QUEUE_SIZE 2
@@ -63,7 +64,6 @@ static void setFailsafe();
static float bound(float val, float min, float max);
-static uint8_t vtolEnabled = 0;
/**
* @brief Module initialization
* @return 0
@@ -98,8 +98,6 @@ static void actuatorTask(void* parameters)
ActuatorSettingsGet(&settings);
PIOS_Servo_SetHz(settings.ChannelUpdateFreq[0], settings.ChannelUpdateFreq[1]);
- vtolEnabled = 0; // a flag that must be set by moving throttle up and down again
-
// Go to the neutral (failsafe) values until an ActuatorDesired update is received
setFailsafe();
@@ -196,6 +194,7 @@ static void actuatorTask(void* parameters)
*/
static int32_t mixerFixedWing(const ActuatorSettingsData* settings, const ActuatorDesiredData* desired, ActuatorCommandData* cmd)
{
+
// Check settings
if ( settings->FixedWingPitch1 == ACTUATORSETTINGS_FIXEDWINGPITCH1_NONE ||
settings->FixedWingRoll1 == ACTUATORSETTINGS_FIXEDWINGROLL1_NONE ||
@@ -204,6 +203,9 @@ static int32_t mixerFixedWing(const ActuatorSettingsData* settings, const Actuat
return -1;
}
+ ManualControlCommandData manualControl;
+ ManualControlCommandGet(&manualControl);
+
// Set pitch servo command
cmd->Channel[ settings->FixedWingPitch1 ] = scaleChannel(desired->Pitch, settings->ChannelMax[ settings->FixedWingPitch1 ],
settings->ChannelMin[ settings->FixedWingPitch1 ],
@@ -235,9 +237,12 @@ static int32_t mixerFixedWing(const ActuatorSettingsData* settings, const Actuat
}
// Set throttle servo command
- cmd->Channel[ settings->FixedWingThrottle ] = scaleChannel(desired->Throttle, settings->ChannelMax[ settings->FixedWingThrottle ],
+ if(manualControl.Armed == MANUALCONTROLCOMMAND_ARMED_TRUE)
+ cmd->Channel[ settings->FixedWingThrottle ] = scaleChannel(desired->Throttle, settings->ChannelMax[ settings->FixedWingThrottle ],
settings->ChannelMin[ settings->FixedWingThrottle ],
settings->ChannelNeutral[ settings->FixedWingThrottle ]);
+ else
+ cmd->Channel[ settings->FixedWingThrottle ] = -1;
// Done
return 0;
@@ -257,21 +262,27 @@ static int32_t mixerFixedWingElevon(const ActuatorSettingsData* settings, const
return -1;
}
+ ManualControlCommandData manualControl;
+ ManualControlCommandGet(&manualControl);
+
// Set first elevon servo command
cmd->Channel[ settings->FixedWingRoll1 ] = scaleChannel(desired->Pitch + desired->Roll, settings->ChannelMax[ settings->FixedWingRoll1 ],
settings->ChannelMin[ settings->FixedWingRoll1 ],
settings->ChannelNeutral[ settings->FixedWingRoll1 ]);
- // Set second elevon servo command
- cmd->Channel[ settings->FixedWingRoll2 ] = scaleChannel(desired->Pitch - desired->Roll, settings->ChannelMax[ settings->FixedWingRoll2 ],
+ // Set second elevon servo command
+ cmd->Channel[ settings->FixedWingRoll2 ] = scaleChannel(desired->Pitch - desired->Roll, settings->ChannelMax[ settings->FixedWingRoll2 ],
settings->ChannelMin[ settings->FixedWingRoll2 ],
settings->ChannelNeutral[ settings->FixedWingRoll2 ]);
// Set throttle servo command
- cmd->Channel[ settings->FixedWingThrottle ] = scaleChannel(desired->Throttle, settings->ChannelMax[ settings->FixedWingThrottle ],
- settings->ChannelMin[ settings->FixedWingThrottle ],
- settings->ChannelNeutral[ settings->FixedWingThrottle ]);
-
+ if(manualControl.Armed == MANUALCONTROLCOMMAND_ARMED_TRUE)
+ cmd->Channel[ settings->FixedWingThrottle ] = scaleChannel(desired->Throttle, settings->ChannelMax[ settings->FixedWingThrottle ],
+ settings->ChannelMin[ settings->FixedWingThrottle ],
+ settings->ChannelNeutral[ settings->FixedWingThrottle ]);
+ else
+ cmd->Channel[ settings->FixedWingThrottle ] = -1;
+
// Done
return 0;
}
@@ -293,20 +304,18 @@ static int32_t mixerVTOL(const ActuatorSettingsData* settings, const ActuatorDes
VTOLStatusData vtolStatus;
VTOLSettingsGet(&vtolSettings);
VTOLStatusGet(&vtolStatus);
-
- // Simple logic to require throttle past .5 and then brought back before enabling motors.
- // This possibly should be used for other mixers.
- if ((vtolEnabled == 0) && (desired->Throttle > .5))
- vtolEnabled = 1;
- if ((vtolEnabled == 1) && (desired->Throttle <= 0))
- vtolEnabled = 2;
+
+ ManualControlCommandData manualControl;
+ ManualControlCommandGet(&manualControl);
const int vtolMin = -1;
- int vtolMax = 1;
- if(desired->Throttle < 0 || vtolEnabled < 2)
- vtolMax = -1;
+ int vtolMax = -1;
+
+ if((manualControl.Armed == MANUALCONTROLCOMMAND_ARMED_TRUE) &&
+ (desired->Throttle >= 0))
+ vtolMax = 1;
else
- vtolMax = 1;
+ vtolMax = -1;
if(((settings->VTOLMotorN != ACTUATORSETTINGS_VTOLMOTORN_NONE) +
(settings->VTOLMotorNE != ACTUATORSETTINGS_VTOLMOTORS_NONE) +
@@ -320,51 +329,51 @@ static int32_t mixerVTOL(const ActuatorSettingsData* settings, const ActuatorDes
}
if(settings->VTOLMotorN != ACTUATORSETTINGS_VTOLMOTORN_NONE) {
- vtolStatus.MotorN = bound(desired->Throttle * vtolSettings.MotorN[VTOLSETTINGS_MOTORN_THROTTLE] +
+ vtolStatus.MotorN = desired->Throttle * vtolSettings.MotorN[VTOLSETTINGS_MOTORN_THROTTLE] +
desired->Pitch * vtolSettings.MotorN[VTOLSETTINGS_MOTORN_PITCH] +
desired->Roll * vtolSettings.MotorN[VTOLSETTINGS_MOTORN_ROLL] +
- desired->Yaw * vtolSettings.MotorN[VTOLSETTINGS_MOTORN_YAW],vtolMin,vtolMax);
- cmd->Channel[settings->VTOLMotorN] = scaleChannel(vtolStatus.MotorN,
+ desired->Yaw * vtolSettings.MotorN[VTOLSETTINGS_MOTORN_YAW];
+ cmd->Channel[settings->VTOLMotorN] = scaleChannel(bound(vtolStatus.MotorN, vtolMin, vtolMax),
settings->ChannelMax[settings->VTOLMotorN],
settings->ChannelMin[settings->VTOLMotorN],
settings->ChannelNeutral[settings->VTOLMotorN]);
}
if(settings->VTOLMotorNE != ACTUATORSETTINGS_VTOLMOTORNE_NONE) {
- vtolStatus.MotorNE = bound(desired->Throttle * vtolSettings.MotorNE[VTOLSETTINGS_MOTORNE_THROTTLE] +
+ vtolStatus.MotorNE = desired->Throttle * vtolSettings.MotorNE[VTOLSETTINGS_MOTORNE_THROTTLE] +
desired->Pitch * vtolSettings.MotorNE[VTOLSETTINGS_MOTORNE_PITCH] +
desired->Roll * vtolSettings.MotorNE[VTOLSETTINGS_MOTORNE_ROLL] +
- desired->Yaw * vtolSettings.MotorNE[VTOLSETTINGS_MOTORNE_YAW],vtolMin,vtolMax);
- cmd->Channel[settings->VTOLMotorNE] = scaleChannel(vtolStatus.MotorNE,
+ desired->Yaw * vtolSettings.MotorNE[VTOLSETTINGS_MOTORNE_YAW];
+ cmd->Channel[settings->VTOLMotorNE] = scaleChannel(bound(vtolStatus.MotorNE, vtolMin, vtolMax),
settings->ChannelMax[settings->VTOLMotorNE],
settings->ChannelMin[settings->VTOLMotorNE],
settings->ChannelNeutral[settings->VTOLMotorNE]);
}
if(settings->VTOLMotorE != ACTUATORSETTINGS_VTOLMOTORE_NONE) {
- vtolStatus.MotorE = bound(desired->Throttle * vtolSettings.MotorE[VTOLSETTINGS_MOTORE_THROTTLE] +
+ vtolStatus.MotorE = desired->Throttle * vtolSettings.MotorE[VTOLSETTINGS_MOTORE_THROTTLE] +
desired->Pitch * vtolSettings.MotorE[VTOLSETTINGS_MOTORE_PITCH] +
desired->Roll * vtolSettings.MotorE[VTOLSETTINGS_MOTORE_ROLL] +
- desired->Yaw * vtolSettings.MotorE[VTOLSETTINGS_MOTORE_YAW],vtolMin,vtolMax);
- cmd->Channel[settings->VTOLMotorE] = scaleChannel(vtolStatus.MotorE,
+ desired->Yaw * vtolSettings.MotorE[VTOLSETTINGS_MOTORE_YAW];
+ cmd->Channel[settings->VTOLMotorE] = scaleChannel(bound(vtolStatus.MotorE, vtolMin, vtolMax),
settings->ChannelMax[settings->VTOLMotorE],
settings->ChannelMin[settings->VTOLMotorE],
settings->ChannelNeutral[settings->VTOLMotorE]);
}
if(settings->VTOLMotorSE != ACTUATORSETTINGS_VTOLMOTORSE_NONE) {
- vtolStatus.MotorSE = bound(desired->Throttle * vtolSettings.MotorSE[VTOLSETTINGS_MOTORSE_THROTTLE] +
+ vtolStatus.MotorSE = desired->Throttle * vtolSettings.MotorSE[VTOLSETTINGS_MOTORSE_THROTTLE] +
desired->Pitch * vtolSettings.MotorSE[VTOLSETTINGS_MOTORSE_PITCH] +
desired->Roll * vtolSettings.MotorSE[VTOLSETTINGS_MOTORSE_ROLL] +
- desired->Yaw * vtolSettings.MotorSE[VTOLSETTINGS_MOTORSE_YAW],vtolMin,vtolMax);
- cmd->Channel[settings->VTOLMotorSE] = scaleChannel(vtolStatus.MotorSE,
+ desired->Yaw * vtolSettings.MotorSE[VTOLSETTINGS_MOTORSE_YAW];
+ cmd->Channel[settings->VTOLMotorSE] = scaleChannel(bound(vtolStatus.MotorSE, vtolMin, vtolMax),
settings->ChannelMax[settings->VTOLMotorSE],
settings->ChannelMin[settings->VTOLMotorSE],
settings->ChannelNeutral[settings->VTOLMotorSE]);
}
if(settings->VTOLMotorS != ACTUATORSETTINGS_VTOLMOTORS_NONE) {
- vtolStatus.MotorS = bound(desired->Throttle * vtolSettings.MotorS[VTOLSETTINGS_MOTORS_THROTTLE] +
+ vtolStatus.MotorS = desired->Throttle * vtolSettings.MotorS[VTOLSETTINGS_MOTORS_THROTTLE] +
desired->Pitch * vtolSettings.MotorS[VTOLSETTINGS_MOTORS_PITCH] +
desired->Roll * vtolSettings.MotorS[VTOLSETTINGS_MOTORS_ROLL] +
- desired->Yaw * vtolSettings.MotorS[VTOLSETTINGS_MOTORS_YAW],vtolMin,vtolMax);
- cmd->Channel[settings->VTOLMotorS] = scaleChannel(vtolStatus.MotorS,
+ desired->Yaw * vtolSettings.MotorS[VTOLSETTINGS_MOTORS_YAW];
+ cmd->Channel[settings->VTOLMotorS] = scaleChannel(bound(vtolStatus.MotorS, vtolMin, vtolMax),
settings->ChannelMax[settings->VTOLMotorS],
settings->ChannelMin[settings->VTOLMotorS],
settings->ChannelNeutral[settings->VTOLMotorS]);
@@ -380,21 +389,21 @@ static int32_t mixerVTOL(const ActuatorSettingsData* settings, const ActuatorDes
settings->ChannelNeutral[settings->VTOLMotorSW]);
}
if(settings->VTOLMotorW != ACTUATORSETTINGS_VTOLMOTORW_NONE) {
- vtolStatus.MotorW = bound(desired->Throttle * vtolSettings.MotorW[VTOLSETTINGS_MOTORW_THROTTLE] +
+ vtolStatus.MotorW = desired->Throttle * vtolSettings.MotorW[VTOLSETTINGS_MOTORW_THROTTLE] +
desired->Pitch * vtolSettings.MotorW[VTOLSETTINGS_MOTORW_PITCH] +
desired->Roll * vtolSettings.MotorW[VTOLSETTINGS_MOTORW_ROLL] +
- desired->Yaw * vtolSettings.MotorW[VTOLSETTINGS_MOTORW_YAW],vtolMin,vtolMax);
- cmd->Channel[settings->VTOLMotorW] = scaleChannel(vtolStatus.MotorW,
+ desired->Yaw * vtolSettings.MotorW[VTOLSETTINGS_MOTORW_YAW];
+ cmd->Channel[settings->VTOLMotorW] = scaleChannel(bound(vtolStatus.MotorW, vtolMin, vtolMax),
settings->ChannelMax[settings->VTOLMotorW],
settings->ChannelMin[settings->VTOLMotorW],
settings->ChannelNeutral[settings->VTOLMotorW]);
}
if(settings->VTOLMotorNW != ACTUATORSETTINGS_VTOLMOTORNW_NONE) {
- vtolStatus.MotorNW = bound(desired->Throttle * vtolSettings.MotorNW[VTOLSETTINGS_MOTORNW_THROTTLE] +
+ vtolStatus.MotorNW = desired->Throttle * vtolSettings.MotorNW[VTOLSETTINGS_MOTORNW_THROTTLE] +
desired->Pitch * vtolSettings.MotorNW[VTOLSETTINGS_MOTORNW_PITCH] +
desired->Roll * vtolSettings.MotorNW[VTOLSETTINGS_MOTORNW_ROLL] +
- desired->Yaw * vtolSettings.MotorNW[VTOLSETTINGS_MOTORNW_YAW],vtolMin,vtolMax);
- cmd->Channel[settings->VTOLMotorNW] = scaleChannel(vtolStatus.MotorNW,
+ desired->Yaw * vtolSettings.MotorNW[VTOLSETTINGS_MOTORNW_YAW];
+ cmd->Channel[settings->VTOLMotorNW] = scaleChannel(bound(vtolStatus.MotorNW, vtolMin, vtolMax),
settings->ChannelMax[settings->VTOLMotorNW],
settings->ChannelMin[settings->VTOLMotorNW],
settings->ChannelNeutral[settings->VTOLMotorNW]);
diff --git a/flight/OpenPilot/Modules/ManualControl/manualcontrol.c b/flight/OpenPilot/Modules/ManualControl/manualcontrol.c
index 9936caf23..94934abfe 100644
--- a/flight/OpenPilot/Modules/ManualControl/manualcontrol.c
+++ b/flight/OpenPilot/Modules/ManualControl/manualcontrol.c
@@ -81,12 +81,18 @@ static void manualControlTask(void* parameters)
ActuatorDesiredData actuator;
AttitudeDesiredData attitude;
portTickType lastSysTime;
+ portTickType armedDisarmStart = 0;
float flightMode;
uint8_t disconnected_count = 0;
uint8_t connected_count = 0;
enum {CONNECTED, DISCONNECTED} connection_state = DISCONNECTED;
+ // Make sure unarmed on power up
+ ManualControlCommandGet(&cmd);
+ cmd.Armed = MANUALCONTROLCOMMAND_ARMED_FALSE;
+ ManualControlCommandSet(&cmd);
+
// Main task loop
lastSysTime = xTaskGetTickCount();
while (1)
@@ -228,6 +234,22 @@ static void manualControlTask(void* parameters)
AlarmsClear(SYSTEMALARMS_ALARM_MANUALCONTROL);
ManualControlCommandSet(&cmd);
}
+
+ /* Look for arm or disarm signal */
+ if ((cmd.Throttle <= 0.05) && (cmd.Roll <= -0.95)) {
+ if((armedDisarmStart == 0) || (lastSysTime < armedDisarmStart)) // store when started, deal with rollover
+ armedDisarmStart = lastSysTime;
+ else if ((lastSysTime - armedDisarmStart) > (1000 * portTICK_RATE_MS))
+ cmd.Armed = MANUALCONTROLCOMMAND_ARMED_TRUE;
+ }else if ((cmd.Throttle <= 0.05) && (cmd.Roll >= 0.95)) {
+ if((armedDisarmStart == 0) || (lastSysTime < armedDisarmStart)) // store when started, deal with rollover
+ armedDisarmStart = lastSysTime;
+ else if ((lastSysTime - armedDisarmStart) > (1000 * portTICK_RATE_MS))
+ cmd.Armed = MANUALCONTROLCOMMAND_ARMED_FALSE;
+ } else {
+ armedDisarmStart = 0;
+ }
+
// Depending on the mode update the Stabilization or Actuator objects
if ( cmd.FlightMode == MANUALCONTROLCOMMAND_FLIGHTMODE_MANUAL )
@@ -255,11 +277,11 @@ static void manualControlTask(void* parameters)
{
attitude.Yaw = (cmd.Yaw*180.0);
}
- if(cmd.Throttle < 0)
- attitude.Throttle = -1;
- else
- attitude.Throttle = cmd.Throttle*stabSettings.ThrottleMax;
}
+ if(cmd.Throttle < 0)
+ attitude.Throttle = -1;
+ else
+ attitude.Throttle = cmd.Throttle*stabSettings.ThrottleMax;
AttitudeDesiredSet(&attitude);
}
diff --git a/flight/OpenPilot/Modules/Stabilization/simple/Stabilization/stabilization.c b/flight/OpenPilot/Modules/Stabilization/simple/Stabilization/stabilization.c
index 89e492778..eb9310eac 100644
--- a/flight/OpenPilot/Modules/Stabilization/simple/Stabilization/stabilization.c
+++ b/flight/OpenPilot/Modules/Stabilization/simple/Stabilization/stabilization.c
@@ -152,7 +152,7 @@ static void stabilizationTask(void* parameters)
}
// Setup throttle
- actuatorDesired.Throttle = bound(attitudeDesired.Throttle, 0.0, stabSettings.ThrottleMax);
+ actuatorDesired.Throttle = bound(attitudeDesired.Throttle, stabSettings.ThrottleMin, stabSettings.ThrottleMax);
// Write actuator desired (if not in manual mode)
if ( manualControl.FlightMode != MANUALCONTROLCOMMAND_FLIGHTMODE_MANUAL )
diff --git a/flight/OpenPilot/UAVObjects/inc/manualcontrolcommand.h b/flight/OpenPilot/UAVObjects/inc/manualcontrolcommand.h
index 6a02aca55..d37bf30af 100644
--- a/flight/OpenPilot/UAVObjects/inc/manualcontrolcommand.h
+++ b/flight/OpenPilot/UAVObjects/inc/manualcontrolcommand.h
@@ -41,7 +41,7 @@
#define MANUALCONTROLCOMMAND_H
// Object constants
-#define MANUALCONTROLCOMMAND_OBJID 1289277596U
+#define MANUALCONTROLCOMMAND_OBJID 9594768U
#define MANUALCONTROLCOMMAND_NAME "ManualControlCommand"
#define MANUALCONTROLCOMMAND_METANAME "ManualControlCommandMeta"
#define MANUALCONTROLCOMMAND_ISSINGLEINST 1
@@ -72,6 +72,7 @@
// Object data
typedef struct {
uint8_t Connected;
+ uint8_t Armed;
float Roll;
float Pitch;
float Yaw;
@@ -88,6 +89,9 @@ typedef struct {
// Field Connected information
/* Enumeration options for field Connected */
typedef enum { MANUALCONTROLCOMMAND_CONNECTED_FALSE=0, MANUALCONTROLCOMMAND_CONNECTED_TRUE=1 } ManualControlCommandConnectedOptions;
+// Field Armed information
+/* Enumeration options for field Armed */
+typedef enum { MANUALCONTROLCOMMAND_ARMED_FALSE=0, MANUALCONTROLCOMMAND_ARMED_TRUE=1 } ManualControlCommandArmedOptions;
// Field Roll information
// Field Pitch information
// Field Yaw information
diff --git a/flight/OpenPilot/UAVObjects/inc/stabilizationsettings.h b/flight/OpenPilot/UAVObjects/inc/stabilizationsettings.h
index 1851eb507..5e4685acc 100644
--- a/flight/OpenPilot/UAVObjects/inc/stabilizationsettings.h
+++ b/flight/OpenPilot/UAVObjects/inc/stabilizationsettings.h
@@ -41,7 +41,7 @@
#define STABILIZATIONSETTINGS_H
// Object constants
-#define STABILIZATIONSETTINGS_OBJID 1244337598U
+#define STABILIZATIONSETTINGS_OBJID 117768092U
#define STABILIZATIONSETTINGS_NAME "StabilizationSettings"
#define STABILIZATIONSETTINGS_METANAME "StabilizationSettingsMeta"
#define STABILIZATIONSETTINGS_ISSINGLEINST 1
@@ -71,12 +71,13 @@
// Object data
typedef struct {
- uint16_t UpdatePeriod;
- float RollMax;
- float PitchMax;
- float YawMax;
+ uint8_t UpdatePeriod;
+ uint8_t RollMax;
+ uint8_t PitchMax;
+ uint8_t YawMax;
uint8_t YawMode;
float ThrottleMax;
+ float ThrottleMin;
float RollIntegralLimit;
float PitchIntegralLimit;
float YawIntegralLimit;
@@ -101,6 +102,7 @@ typedef struct {
/* Enumeration options for field YawMode */
typedef enum { STABILIZATIONSETTINGS_YAWMODE_RATE=0, STABILIZATIONSETTINGS_YAWMODE_HEADING=1 } StabilizationSettingsYawModeOptions;
// Field ThrottleMax information
+// Field ThrottleMin information
// Field RollIntegralLimit information
// Field PitchIntegralLimit information
// Field YawIntegralLimit information
diff --git a/flight/OpenPilot/UAVObjects/stabilizationsettings.c b/flight/OpenPilot/UAVObjects/stabilizationsettings.c
index 5dc3f5272..02c5e9f7c 100644
--- a/flight/OpenPilot/UAVObjects/stabilizationsettings.c
+++ b/flight/OpenPilot/UAVObjects/stabilizationsettings.c
@@ -86,6 +86,7 @@ static void setDefaults(UAVObjHandle obj, uint16_t instId)
data.YawMax = 35;
data.YawMode = 0;
data.ThrottleMax = 1;
+ data.ThrottleMin = -1;
data.RollIntegralLimit = 0.5;
data.PitchIntegralLimit = 0.5;
data.YawIntegralLimit = 0.5;
diff --git a/ground/src/plugins/gcscontrol/gcscontrol.ui b/ground/src/plugins/gcscontrol/gcscontrol.ui
index 579d65815..13c99fbca 100644
--- a/ground/src/plugins/gcscontrol/gcscontrol.ui
+++ b/ground/src/plugins/gcscontrol/gcscontrol.ui
@@ -7,7 +7,7 @@
0
0
653
- 290
+ 295
@@ -31,6 +31,13 @@
+ -
+
+
+ Armed
+
+
+
-
diff --git a/ground/src/plugins/gcscontrol/gcscontrolgadgetwidget.cpp b/ground/src/plugins/gcscontrol/gcscontrolgadgetwidget.cpp
index 3df807922..7026f82a0 100644
--- a/ground/src/plugins/gcscontrol/gcscontrolgadgetwidget.cpp
+++ b/ground/src/plugins/gcscontrol/gcscontrolgadgetwidget.cpp
@@ -52,6 +52,10 @@ GCSControlGadgetWidget::GCSControlGadgetWidget(QWidget *parent) : QLabel(parent)
// Set up slots and signals
connect(m_gcscontrol->checkBoxGcsControl, SIGNAL(stateChanged(int)), this, SLOT(gcsControlToggle(int)));
connect(m_gcscontrol->comboBoxFlightMode, SIGNAL(currentIndexChanged(int)), this, SLOT(flightModeChanged(int)));
+ //connect(m_gcscontrol->checkBoxArmed, SIGNAL(stateChanged(int)), this, SLOT(gcsArmedToggle(int)));
+
+ // Connect object updated event from UAVObject to also update check boxes
+ connect(getMCC(), SIGNAL(objectUpdated(UAVObject*)), this, SLOT(mccChanged(UAVObject*)));
}
@@ -71,6 +75,11 @@ ManualControlCommand* GCSControlGadgetWidget::getMCC()
return obj;
}
+void GCSControlGadgetWidget::mccChanged(UAVObject* obj)
+{
+ m_gcscontrol->checkBoxArmed->setChecked(obj->getField("Armed")->getValue().toString() == "True");
+}
+
/*!
\brief Called when the gcs control is toggled and enabled or disables flight write access to manual control command
*/
diff --git a/ground/src/plugins/gcscontrol/gcscontrolgadgetwidget.h b/ground/src/plugins/gcscontrol/gcscontrolgadgetwidget.h
index 802811567..b2a16fb4c 100644
--- a/ground/src/plugins/gcscontrol/gcscontrolgadgetwidget.h
+++ b/ground/src/plugins/gcscontrol/gcscontrolgadgetwidget.h
@@ -45,6 +45,9 @@ private slots:
void gcsControlToggle(int state);
void flightModeChanged(int state);
+protected slots:
+ void mccChanged(UAVObject*);
+
private:
Ui_GCSControl *m_gcscontrol;
ManualControlCommand* getMCC();
diff --git a/ground/src/plugins/uavobjects/manualcontrolcommand.cpp b/ground/src/plugins/uavobjects/manualcontrolcommand.cpp
index f572feb81..fc4554495 100644
--- a/ground/src/plugins/uavobjects/manualcontrolcommand.cpp
+++ b/ground/src/plugins/uavobjects/manualcontrolcommand.cpp
@@ -48,6 +48,12 @@ ManualControlCommand::ManualControlCommand(): UAVDataObject(OBJID, ISSINGLEINST,
ConnectedEnumOptions.append("False");
ConnectedEnumOptions.append("True");
fields.append( new UAVObjectField(QString("Connected"), QString(""), UAVObjectField::ENUM, ConnectedElemNames, ConnectedEnumOptions) );
+ QStringList ArmedElemNames;
+ ArmedElemNames.append("0");
+ QStringList ArmedEnumOptions;
+ ArmedEnumOptions.append("False");
+ ArmedEnumOptions.append("True");
+ fields.append( new UAVObjectField(QString("Armed"), QString(""), UAVObjectField::ENUM, ArmedElemNames, ArmedEnumOptions) );
QStringList RollElemNames;
RollElemNames.append("0");
fields.append( new UAVObjectField(QString("Roll"), QString("%"), UAVObjectField::FLOAT32, RollElemNames, QStringList()) );
diff --git a/ground/src/plugins/uavobjects/manualcontrolcommand.h b/ground/src/plugins/uavobjects/manualcontrolcommand.h
index 7b209827a..3dbe3b504 100644
--- a/ground/src/plugins/uavobjects/manualcontrolcommand.h
+++ b/ground/src/plugins/uavobjects/manualcontrolcommand.h
@@ -44,6 +44,7 @@ public:
// Field structure
typedef struct {
quint8 Connected;
+ quint8 Armed;
float Roll;
float Pitch;
float Yaw;
@@ -60,6 +61,9 @@ public:
// Field Connected information
/* Enumeration options for field Connected */
typedef enum { CONNECTED_FALSE=0, CONNECTED_TRUE=1 } ConnectedOptions;
+ // Field Armed information
+ /* Enumeration options for field Armed */
+ typedef enum { ARMED_FALSE=0, ARMED_TRUE=1 } ArmedOptions;
// Field Roll information
// Field Pitch information
// Field Yaw information
@@ -76,7 +80,7 @@ public:
// Constants
- static const quint32 OBJID = 1289277596U;
+ static const quint32 OBJID = 9594768U;
static const QString NAME;
static const bool ISSINGLEINST = 1;
static const bool ISSETTINGS = 0;
diff --git a/ground/src/plugins/uavobjects/manualcontrolcommand.py b/ground/src/plugins/uavobjects/manualcontrolcommand.py
index e8600d719..066b9d43e 100644
--- a/ground/src/plugins/uavobjects/manualcontrolcommand.py
+++ b/ground/src/plugins/uavobjects/manualcontrolcommand.py
@@ -49,6 +49,18 @@ _fields = [ \
'1' : 'True',
}
),
+ uavobject.UAVObjectField(
+ 'Armed',
+ 'b',
+ 1,
+ [
+ '0',
+ ],
+ {
+ '0' : 'False',
+ '1' : 'True',
+ }
+ ),
uavobject.UAVObjectField(
'Roll',
'f',
@@ -154,7 +166,7 @@ _fields = [ \
class ManualControlCommand(uavobject.UAVObject):
## Object constants
- OBJID = 1289277596
+ OBJID = 9594768
NAME = "ManualControlCommand"
METANAME = "ManualControlCommandMeta"
ISSINGLEINST = 1
diff --git a/ground/src/plugins/uavobjects/stabilizationsettings.cpp b/ground/src/plugins/uavobjects/stabilizationsettings.cpp
index 0be4b5aa0..611a8e9d4 100644
--- a/ground/src/plugins/uavobjects/stabilizationsettings.cpp
+++ b/ground/src/plugins/uavobjects/stabilizationsettings.cpp
@@ -44,16 +44,16 @@ StabilizationSettings::StabilizationSettings(): UAVDataObject(OBJID, ISSINGLEINS
QList fields;
QStringList UpdatePeriodElemNames;
UpdatePeriodElemNames.append("0");
- fields.append( new UAVObjectField(QString("UpdatePeriod"), QString("ms"), UAVObjectField::UINT16, UpdatePeriodElemNames, QStringList()) );
+ fields.append( new UAVObjectField(QString("UpdatePeriod"), QString("ms"), UAVObjectField::UINT8, UpdatePeriodElemNames, QStringList()) );
QStringList RollMaxElemNames;
RollMaxElemNames.append("0");
- fields.append( new UAVObjectField(QString("RollMax"), QString("degrees"), UAVObjectField::FLOAT32, RollMaxElemNames, QStringList()) );
+ fields.append( new UAVObjectField(QString("RollMax"), QString("degrees"), UAVObjectField::UINT8, RollMaxElemNames, QStringList()) );
QStringList PitchMaxElemNames;
PitchMaxElemNames.append("0");
- fields.append( new UAVObjectField(QString("PitchMax"), QString("degrees"), UAVObjectField::FLOAT32, PitchMaxElemNames, QStringList()) );
+ fields.append( new UAVObjectField(QString("PitchMax"), QString("degrees"), UAVObjectField::UINT8, PitchMaxElemNames, QStringList()) );
QStringList YawMaxElemNames;
YawMaxElemNames.append("0");
- fields.append( new UAVObjectField(QString("YawMax"), QString("degrees"), UAVObjectField::FLOAT32, YawMaxElemNames, QStringList()) );
+ fields.append( new UAVObjectField(QString("YawMax"), QString("degrees"), UAVObjectField::UINT8, YawMaxElemNames, QStringList()) );
QStringList YawModeElemNames;
YawModeElemNames.append("0");
QStringList YawModeEnumOptions;
@@ -62,7 +62,10 @@ StabilizationSettings::StabilizationSettings(): UAVDataObject(OBJID, ISSINGLEINS
fields.append( new UAVObjectField(QString("YawMode"), QString("degrees"), UAVObjectField::ENUM, YawModeElemNames, YawModeEnumOptions) );
QStringList ThrottleMaxElemNames;
ThrottleMaxElemNames.append("0");
- fields.append( new UAVObjectField(QString("ThrottleMax"), QString("%"), UAVObjectField::FLOAT32, ThrottleMaxElemNames, QStringList()) );
+ fields.append( new UAVObjectField(QString("ThrottleMax"), QString("frac"), UAVObjectField::FLOAT32, ThrottleMaxElemNames, QStringList()) );
+ QStringList ThrottleMinElemNames;
+ ThrottleMinElemNames.append("0");
+ fields.append( new UAVObjectField(QString("ThrottleMin"), QString("frac"), UAVObjectField::FLOAT32, ThrottleMinElemNames, QStringList()) );
QStringList RollIntegralLimitElemNames;
RollIntegralLimitElemNames.append("0");
fields.append( new UAVObjectField(QString("RollIntegralLimit"), QString(""), UAVObjectField::FLOAT32, RollIntegralLimitElemNames, QStringList()) );
@@ -138,6 +141,7 @@ void StabilizationSettings::setDefaultFieldValues()
data.YawMax = 35;
data.YawMode = 0;
data.ThrottleMax = 1;
+ data.ThrottleMin = -1;
data.RollIntegralLimit = 0.5;
data.PitchIntegralLimit = 0.5;
data.YawIntegralLimit = 0.5;
diff --git a/ground/src/plugins/uavobjects/stabilizationsettings.h b/ground/src/plugins/uavobjects/stabilizationsettings.h
index cd014ecad..de2a95eac 100644
--- a/ground/src/plugins/uavobjects/stabilizationsettings.h
+++ b/ground/src/plugins/uavobjects/stabilizationsettings.h
@@ -43,12 +43,13 @@ class UAVOBJECTS_EXPORT StabilizationSettings: public UAVDataObject
public:
// Field structure
typedef struct {
- quint16 UpdatePeriod;
- float RollMax;
- float PitchMax;
- float YawMax;
+ quint8 UpdatePeriod;
+ quint8 RollMax;
+ quint8 PitchMax;
+ quint8 YawMax;
quint8 YawMode;
float ThrottleMax;
+ float ThrottleMin;
float RollIntegralLimit;
float PitchIntegralLimit;
float YawIntegralLimit;
@@ -73,6 +74,7 @@ public:
/* Enumeration options for field YawMode */
typedef enum { YAWMODE_RATE=0, YAWMODE_HEADING=1 } YawModeOptions;
// Field ThrottleMax information
+ // Field ThrottleMin information
// Field RollIntegralLimit information
// Field PitchIntegralLimit information
// Field YawIntegralLimit information
@@ -88,7 +90,7 @@ public:
// Constants
- static const quint32 OBJID = 1244337598U;
+ static const quint32 OBJID = 117768092U;
static const QString NAME;
static const bool ISSINGLEINST = 1;
static const bool ISSETTINGS = 1;
diff --git a/ground/src/plugins/uavobjects/stabilizationsettings.py b/ground/src/plugins/uavobjects/stabilizationsettings.py
index 413c05b6b..d09fc0c98 100644
--- a/ground/src/plugins/uavobjects/stabilizationsettings.py
+++ b/ground/src/plugins/uavobjects/stabilizationsettings.py
@@ -39,7 +39,7 @@ from collections import namedtuple
_fields = [ \
uavobject.UAVObjectField(
'UpdatePeriod',
- 'H',
+ 'B',
1,
[
'0',
@@ -49,7 +49,7 @@ _fields = [ \
),
uavobject.UAVObjectField(
'RollMax',
- 'f',
+ 'B',
1,
[
'0',
@@ -59,7 +59,7 @@ _fields = [ \
),
uavobject.UAVObjectField(
'PitchMax',
- 'f',
+ 'B',
1,
[
'0',
@@ -69,7 +69,7 @@ _fields = [ \
),
uavobject.UAVObjectField(
'YawMax',
- 'f',
+ 'B',
1,
[
'0',
@@ -99,6 +99,16 @@ _fields = [ \
{
}
),
+ uavobject.UAVObjectField(
+ 'ThrottleMin',
+ 'f',
+ 1,
+ [
+ '0',
+ ],
+ {
+ }
+ ),
uavobject.UAVObjectField(
'RollIntegralLimit',
'f',
@@ -224,7 +234,7 @@ _fields = [ \
class StabilizationSettings(uavobject.UAVObject):
## Object constants
- OBJID = 1244337598
+ OBJID = 117768092
NAME = "StabilizationSettings"
METANAME = "StabilizationSettingsMeta"
ISSINGLEINST = 1
diff --git a/ground/src/shared/uavobjectdefinition/manualcontrolcommand.xml b/ground/src/shared/uavobjectdefinition/manualcontrolcommand.xml
index fd7a66af3..f93c18d06 100644
--- a/ground/src/shared/uavobjectdefinition/manualcontrolcommand.xml
+++ b/ground/src/shared/uavobjectdefinition/manualcontrolcommand.xml
@@ -2,6 +2,7 @@