diff --git a/UAV-ControlSystem/inc/drivers/failsafe_toggles.h b/UAV-ControlSystem/inc/drivers/failsafe_toggles.h index 2c6e72f..aa2fe29 100644 --- a/UAV-ControlSystem/inc/drivers/failsafe_toggles.h +++ b/UAV-ControlSystem/inc/drivers/failsafe_toggles.h @@ -28,12 +28,13 @@ #define getFlagMaskValue(x) (1 << x) #define failSafe_vals_offset 0 //offset for the fail safe values in the bitfield -#define boolean_vals_offset 2 //offset for the booleans values in the bitfield +#define boolean_vals_offset 3 //offset for the booleans values in the bitfield /*If a new value is added to the bitfield these IDs must be reviewed and checkd so that they still are correct*/ //failsafe values #define systemFlags_Failsafe_rcChannelInRange_id 0 + failSafe_vals_offset #define systemFlags_Failsafe_noRcReceived_id 1 + failSafe_vals_offset +#define systemFlags_Failsafe_toManyMissedFrames_id 2 + failSafe_vals_offset //other flags #define systemFlags_armed_id 0 + boolean_vals_offset @@ -48,18 +49,19 @@ /*Mask values for each of the flag values*/ //failsafe values -#define systemFlags_Failsafe_rcChannelInRange_mask getFlagMaskValue(systemFlags_Failsafe_rcChannelInRange_id) -#define systemFlags_Failsafe_noRcReceived_mask getFlagMaskValue(systemFlags_Failsafe_noRcReceived_id) +#define systemFlags_Failsafe_rcChannelInRange_mask getFlagMaskValue(systemFlags_Failsafe_rcChannelInRange_id) +#define systemFlags_Failsafe_noRcReceived_mask getFlagMaskValue(systemFlags_Failsafe_noRcReceived_id) +#define systemFlags_Failsafe_toManyMissedFrames_mask getFlagMaskValue(systemFlags_Failsafe_toManyMissedFrames_id) //other flags -#define systemFlags_armed_mask getFlagMaskValue(systemFlags_armed_id) -#define systemFlags_flightmode_acceleromter_mask getFlagMaskValue(systemFlags_flightmode_acceleromter_id) -#define systemFlags_flightmode_barometer_mask getFlagMaskValue(systemFlags_flightmode_barometer_id) -#define systemFlags_flightmode_compass_mask getFlagMaskValue(systemFlags_flightmode_compass_id) -#define systemFlags_flightmode_gps_mask getFlagMaskValue(systemFlags_flightmode_gps_id) -#define systemFlags_mixerfullscale_mask getFlagMaskValue(systemFlags_mixerfullscale_id) -#define systemFlags_mixerlowscale_mask getFlagMaskValue(systemFlags_mixerlowscale_id) -#define systemFlags_flightMode_3_mask getFlagMaskValue(systemFlags_flightMode_3_id) +#define systemFlags_armed_mask getFlagMaskValue(systemFlags_armed_id) +#define systemFlags_flightmode_acceleromter_mask getFlagMaskValue(systemFlags_flightmode_acceleromter_id) +#define systemFlags_flightmode_barometer_mask getFlagMaskValue(systemFlags_flightmode_barometer_id) +#define systemFlags_flightmode_compass_mask getFlagMaskValue(systemFlags_flightmode_compass_id) +#define systemFlags_flightmode_gps_mask getFlagMaskValue(systemFlags_flightmode_gps_id) +#define systemFlags_mixerfullscale_mask getFlagMaskValue(systemFlags_mixerfullscale_id) +#define systemFlags_mixerlowscale_mask getFlagMaskValue(systemFlags_mixerlowscale_id) +#define systemFlags_flightMode_3_mask getFlagMaskValue(systemFlags_flightMode_3_id) diff --git a/UAV-ControlSystem/src/drivers/motormix.c b/UAV-ControlSystem/src/drivers/motormix.c index 1eceb28..6eedd11 100644 --- a/UAV-ControlSystem/src/drivers/motormix.c +++ b/UAV-ControlSystem/src/drivers/motormix.c @@ -254,7 +254,7 @@ void mix() for (int i = 0; i < MOTOR_COUNT; i++) { /* If engines are armed then give the output to the motors */ - if (flags_IsSet_ID(systemFlags_armed_id)) + if (flags_IsSet_ID(systemFlags_armed_id) && !flags_IsSet_ID(systemFlags_Failsafe_noRcReceived_id)) motor_output[i] = constrain(motor_output[i], mixerConfig.minCommand, mixerConfig.maxCommand); /* If not then stop motors */ else diff --git a/UAV-ControlSystem/src/tasks_main.c b/UAV-ControlSystem/src/tasks_main.c index b40d9ac..64b57ad 100644 --- a/UAV-ControlSystem/src/tasks_main.c +++ b/UAV-ControlSystem/src/tasks_main.c @@ -99,6 +99,16 @@ void systemTaskRx(void) // RawRcCommand.Yaw = frame.chan4; // RawRcCommand.Throttle = frame.chan4; + /* -- Check failsafe for RX -- */ + //check no received message + (frame.flag_Failsafe) ? flags_Set_ID(systemFlags_Failsafe_noRcReceived_id) : flags_Clear_ID(systemFlags_Failsafe_noRcReceived_id); + + //check missed frames + static int continuousMissedFrames = 0; + continuousMissedFrames = (frame.flag_FrameLost) ? continuousMissedFrames + 1 : 0; + (continuousMissedFrames > 10) ? flags_Set_ID(systemFlags_Failsafe_toManyMissedFrames_id) : flags_Clear_ID(systemFlags_Failsafe_toManyMissedFrames_id); + + } bool systemTaskRxCheck(uint32_t currentDeltaTime) @@ -111,22 +121,23 @@ bool systemTaskRxCheck(uint32_t currentDeltaTime) bool isReady = sbus_frame_available(); - if (isReady == true) - { - flags_Clear_ID(systemFlags_Failsafe_noRcReceived_id); - lastRecievedCommand = clock_get_us(); - return isReady; - } - else - { - //check for failsafe - if ((clock_get_us() - lastRecievedCommand) > maxReceiveTrigger) - { - flags_Set_ID(systemFlags_Failsafe_noRcReceived_id); - } - - return isReady; - } +// if (isReady == true) +// { +// flags_Clear_ID(systemFlags_Failsafe_noRcReceived_id); +// lastRecievedCommand = clock_get_us(); +// return isReady; +// } +// else +// { +// //check for failsafe +// if ((clock_get_us() - lastRecievedCommand) > maxReceiveTrigger) +// { +// flags_Set_ID(systemFlags_Failsafe_noRcReceived_id); +// } +// +// return isReady; +// } + return isReady; }