diff --git a/flight/Modules/ManualControl/manualcontrol.c b/flight/Modules/ManualControl/manualcontrol.c index 6f8f270cc..82f8d1c1f 100644 --- a/flight/Modules/ManualControl/manualcontrol.c +++ b/flight/Modules/ManualControl/manualcontrol.c @@ -83,8 +83,8 @@ static uint32_t timeDifferenceMs(portTickType start_time, portTickType end_time) ) #define assumptions2 ( \ - ((int)MANUALCONTROLSETTINGS_POS1FLIGHTMODE_MANUAL == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_MANUAL) && \ - ((int)MANUALCONTROLSETTINGS_POS1FLIGHTMODE_STABILIZED == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_STABILIZED) && \ + ((int)MANUALCONTROLSETTINGS_POS1FLIGHTMODE_MANUAL == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_MANUAL) && \ + ((int)MANUALCONTROLSETTINGS_POS1FLIGHTMODE_STABILIZED == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_STABILIZED) && \ ((int)MANUALCONTROLSETTINGS_POS1FLIGHTMODE_AUTO == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_AUTO) \ ) @@ -95,8 +95,8 @@ static uint32_t timeDifferenceMs(portTickType start_time, portTickType end_time) ) #define assumptions4 ( \ - ((int)MANUALCONTROLSETTINGS_POS2FLIGHTMODE_MANUAL == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_MANUAL) && \ - ((int)MANUALCONTROLSETTINGS_POS2FLIGHTMODE_STABILIZED == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_STABILIZED) && \ + ((int)MANUALCONTROLSETTINGS_POS2FLIGHTMODE_MANUAL == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_MANUAL) && \ + ((int)MANUALCONTROLSETTINGS_POS2FLIGHTMODE_STABILIZED == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_STABILIZED) && \ ((int)MANUALCONTROLSETTINGS_POS2FLIGHTMODE_AUTO == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_AUTO) \ ) @@ -107,14 +107,39 @@ static uint32_t timeDifferenceMs(portTickType start_time, portTickType end_time) ) #define assumptions6 ( \ - ((int)MANUALCONTROLSETTINGS_POS3FLIGHTMODE_MANUAL == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_MANUAL) && \ - ((int)MANUALCONTROLSETTINGS_POS3FLIGHTMODE_STABILIZED == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_STABILIZED) && \ + ((int)MANUALCONTROLSETTINGS_POS3FLIGHTMODE_MANUAL == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_MANUAL) && \ + ((int)MANUALCONTROLSETTINGS_POS3FLIGHTMODE_STABILIZED == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_STABILIZED) && \ ((int)MANUALCONTROLSETTINGS_POS3FLIGHTMODE_AUTO == (int)MANUALCONTROLCOMMAND_FLIGHTMODE_AUTO) \ ) +#define ARMING_CHANNEL_ROLL 0 +#define ARMING_CHANNEL_PITCH 1 +#define ARMING_CHANNEL_YAW 2 -#define assumptions (assumptions1 && assumptions2 && assumptions3 && assumptions4 && assumptions5 && assumptions6) +#define assumptions7 ( \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)/2 == ARMING_CHANNEL_ROLL) && \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_ROLLRIGHT -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)/2 == ARMING_CHANNEL_ROLL) && \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_PITCHFORWARD -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)/2 == ARMING_CHANNEL_PITCH) && \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_PITCHAFT -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)/2 == ARMING_CHANNEL_PITCH) && \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_YAWLEFT -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)/2 == ARMING_CHANNEL_YAW) && \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_YAWRIGHT -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)/2 == ARMING_CHANNEL_YAW) \ + ) + +#define assumptions8 ( \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)%2 == 0) && \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_ROLLRIGHT -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)%2 != 0) && \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_PITCHFORWARD -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)%2 == 0) && \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_PITCHAFT -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)%2 != 0) && \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_YAWLEFT -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)%2 == 0) && \ + ( ((int)MANUALCONTROLSETTINGS_ARMING_YAWRIGHT -(int)MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)%2 != 0) \ + ) + + + + + +#define assumptions (assumptions1 && assumptions2 && assumptions3 && assumptions4 && assumptions5 && assumptions6 && assumptions7 && assumptions8) /** * Module initialization @@ -299,105 +324,129 @@ static void manualControlTask(void *parameters) ManualControlCommandSet(&cmd); } + // // Arming and Disarming mechanism - if (cmd.Throttle < 0) { - // Throttle is low, in this condition the arming state could change + // + // Look for state changes and write in newArmState + uint8_t newCmdArmed = cmd.Armed; // By default, keep the arming state the same - uint8_t newCmdArmed = cmd.Armed; - static portTickType armedDisarmStart; - - // Look for state changes and write in newArmState - if (settings.Arming == MANUALCONTROLSETTINGS_ARMING_NONE) { - // No channel assigned to arming -> arm immediately when throttle is low - newCmdArmed = MANUALCONTROLCOMMAND_ARMED_TRUE; - } else { - float armStickLevel; - uint8_t channel = settings.Arming/2; // 0=Channel1, 1=Channel1_Rev, 2=Channel2, .... - bool reverse = (settings.Arming%2)==1; - bool manualArm = false; - bool manualDisarm = false; - - if (connection_state == CONNECTED) { - // Should use RC input only if RX is connected - armStickLevel = scaledChannel[channel]; - if (reverse) - armStickLevel =-armStickLevel; - - if (armStickLevel <= -0.90) - manualArm = true; - else if (armStickLevel >= +0.90) - manualDisarm = true; - } - - switch(armState) { - case ARM_STATE_DISARMED: - newCmdArmed = MANUALCONTROLCOMMAND_ARMED_FALSE; - if (manualArm) { - armedDisarmStart = lastSysTime; - armState = ARM_STATE_ARMING_MANUAL; - } - break; - - case ARM_STATE_ARMING_MANUAL: - if (manualArm) { - if (timeDifferenceMs(armedDisarmStart, lastSysTime) > ARMED_TIME_MS) - armState = ARM_STATE_ARMED; - } - else - armState = ARM_STATE_DISARMED; - break; - - case ARM_STATE_ARMED: - // When we get here, the throttle is low, - // we go immediately to disarming due to timeout, also when the disarming mechanism is not enabled - armedDisarmStart = lastSysTime; - armState = ARM_STATE_DISARMING_TIMEOUT; - newCmdArmed = MANUALCONTROLCOMMAND_ARMED_TRUE; - break; - - case ARM_STATE_DISARMING_TIMEOUT: - // We get here when armed while throttle low, even when the arming timeout is not enabled - if (settings.ArmedTimeout != 0) - if (timeDifferenceMs(armedDisarmStart, lastSysTime) > settings.ArmedTimeout) - armState = ARM_STATE_DISARMED; - // Switch to disarming due to manual control when needed - if (manualDisarm) { - armedDisarmStart = lastSysTime; - armState = ARM_STATE_DISARMING_MANUAL; - } - break; - - case ARM_STATE_DISARMING_MANUAL: - if (manualDisarm) { - if (timeDifferenceMs(armedDisarmStart, lastSysTime) > ARMED_TIME_MS) - armState = ARM_STATE_DISARMED; - } - else - armState = ARM_STATE_ARMED; - break; - } - } - // Update cmd object when needed - if (newCmdArmed != cmd.Armed) { - cmd.Armed = newCmdArmed; - ManualControlCommandSet(&cmd); - } + if (settings.Arming == MANUALCONTROLSETTINGS_ARMING_ALWAYSDISARMED) { + // In this configuration we always disarm + newCmdArmed = MANUALCONTROLCOMMAND_ARMED_FALSE; } else { - // The throttle is not low, in case we where arming or disarming, abort - switch(armState) { - case ARM_STATE_DISARMING_MANUAL: - case ARM_STATE_DISARMING_TIMEOUT: - armState = ARM_STATE_ARMED; - break; - case ARM_STATE_ARMING_MANUAL: - armState = ARM_STATE_DISARMED; - break; - default: - // Nothing needs to be done in the other states - break; + // In all other cases, we will not change the arm state when disconnected + if (connection_state == CONNECTED) + { + if (settings.Arming == MANUALCONTROLSETTINGS_ARMING_ALWAYSARMED) { + // In this configuration, we go into armed state as soon as the throttle is low, never disarm + if (cmd.Throttle < 0) { + newCmdArmed = MANUALCONTROLCOMMAND_ARMED_TRUE; + } + } else { + // When the configuration is not "Always armed" and no "Always disarmed", + // the state will not be changed when the throttle is not low + if (cmd.Throttle < 0) { + static portTickType armedDisarmStart; + float armingInputLevel = 0; + + // Calc channel see assumptions7 + switch ( (settings.Arming-MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)/2 ) { + case ARMING_CHANNEL_ROLL: armingInputLevel = cmd.Roll; break; + case ARMING_CHANNEL_PITCH: armingInputLevel = cmd.Pitch; break; + case ARMING_CHANNEL_YAW: armingInputLevel = cmd.Yaw; break; + } + + bool manualArm = false; + bool manualDisarm = false; + + if (connection_state == CONNECTED) { + // Should use RC input only if RX is connected + if (armingInputLevel <= -0.90) + manualArm = true; + else if (armingInputLevel >= +0.90) + manualDisarm = true; + } + + // Swap arm-disarming see assumptions8 + if ((settings.Arming-MANUALCONTROLSETTINGS_ARMING_ROLLLEFT)%2) { + bool temp = manualArm; + manualArm = manualDisarm; + manualDisarm = temp; + } + + switch(armState) { + case ARM_STATE_DISARMED: + newCmdArmed = MANUALCONTROLCOMMAND_ARMED_FALSE; + if (manualArm) { + armedDisarmStart = lastSysTime; + armState = ARM_STATE_ARMING_MANUAL; + } + break; + + case ARM_STATE_ARMING_MANUAL: + if (manualArm) { + if (timeDifferenceMs(armedDisarmStart, lastSysTime) > ARMED_TIME_MS) + armState = ARM_STATE_ARMED; + } + else + armState = ARM_STATE_DISARMED; + break; + + case ARM_STATE_ARMED: + // When we get here, the throttle is low, + // we go immediately to disarming due to timeout, also when the disarming mechanism is not enabled + armedDisarmStart = lastSysTime; + armState = ARM_STATE_DISARMING_TIMEOUT; + newCmdArmed = MANUALCONTROLCOMMAND_ARMED_TRUE; + break; + + case ARM_STATE_DISARMING_TIMEOUT: + // We get here when armed while throttle low, even when the arming timeout is not enabled + if (settings.ArmedTimeout != 0) + if (timeDifferenceMs(armedDisarmStart, lastSysTime) > settings.ArmedTimeout) + armState = ARM_STATE_DISARMED; + // Switch to disarming due to manual control when needed + if (manualDisarm) { + armedDisarmStart = lastSysTime; + armState = ARM_STATE_DISARMING_MANUAL; + } + break; + + case ARM_STATE_DISARMING_MANUAL: + if (manualDisarm) { + if (timeDifferenceMs(armedDisarmStart, lastSysTime) > ARMED_TIME_MS) + armState = ARM_STATE_DISARMED; + } + else + armState = ARM_STATE_ARMED; + break; + } // End Switch + } else { + // The throttle is not low, in case we where arming or disarming, abort + switch(armState) { + case ARM_STATE_DISARMING_MANUAL: + case ARM_STATE_DISARMING_TIMEOUT: + armState = ARM_STATE_ARMED; + break; + case ARM_STATE_ARMING_MANUAL: + armState = ARM_STATE_DISARMED; + break; + default: + // Nothing needs to be done in the other states + break; + } + } + } } } + // Update cmd object when needed + if (newCmdArmed != cmd.Armed) { + cmd.Armed = newCmdArmed; + ManualControlCommandSet(&cmd); + } + // // End of arming/disarming + // @@ -453,7 +502,16 @@ static uint32_t timeDifferenceMs(portTickType start_time, portTickType end_time) return ((((portTICK_RATE_MS) -1) - start_time) + end_time) * portTICK_RATE_MS; } - +// +//static void armingMechanism(uint8_t* armingState, const ManualControlSettingsData* settings, const ManualControlCommandData* cmd) +//{ +// if (settings->Arming == MANUALCONTROLSETTINGS_ARMING_ALWAYSDISARMED) { +// *armingState = MANUALCONTROLCOMMAND_ARMED_FALSE; +// return; +// } +// +// +//} /** * @} * @} diff --git a/shared/uavobjectdefinition/manualcontrolsettings.xml b/shared/uavobjectdefinition/manualcontrolsettings.xml index a8212a041..a7dfffc84 100644 --- a/shared/uavobjectdefinition/manualcontrolsettings.xml +++ b/shared/uavobjectdefinition/manualcontrolsettings.xml @@ -10,7 +10,7 @@ - +