Esempio n. 1
0
/**
 * If an autonomous mode is available, make sure all the configurations are
 * valid for it
 */
static int32_t check_safe_autonomous()
{
	// The current filter combinations are safe for navigation
	//   Attitude   |  Navigation
	//     Comp     |     Raw          (not recommended)
	//     Comp     |     INS          (recommmended)
	//    Anything  |     None         (unsafe)
	//   INSOutdoor |     INS
	//   INSIndoor  |     INS          (unsafe)


#if !defined(SMALLF1)
	StateEstimationData stateEstimation;
	StateEstimationGet(&stateEstimation);

	if (stateEstimation.AttitudeFilter == STATEESTIMATION_ATTITUDEFILTER_INSINDOOR)
		return SYSTEMALARMS_CONFIGERROR_NAVFILTER;

	// Anything not allowed is invalid, safe default
	if (stateEstimation.NavigationFilter != STATEESTIMATION_NAVIGATIONFILTER_INS &&
		stateEstimation.NavigationFilter != STATEESTIMATION_NAVIGATIONFILTER_RAW)
		return SYSTEMALARMS_CONFIGERROR_NAVFILTER;
#endif

	return SYSTEMALARMS_CONFIGERROR_NONE;
}
//! Check if RTH is possible and safe
static bool check_rth_preconditions_met()
{
	// If transmitter throttle was low before failsafe kicked in
	// RTH is not safe, because pilot probably just forgot to disarm
	// before powering transmitter off
	if (throttle_low_before_engage)
		return false;

	// No RTH when disarmed
	if (!armed_when_enabled)
		return false;

	// Only VTOLs are currently RTH capable
	uint8_t airframe_type;
	SystemSettingsAirframeTypeGet(&airframe_type);
	if (airframe_type != SYSTEMSETTINGS_AIRFRAMETYPE_QUADX &&
			airframe_type != SYSTEMSETTINGS_AIRFRAMETYPE_QUADP &&
			airframe_type != SYSTEMSETTINGS_AIRFRAMETYPE_HEXA &&
			airframe_type != SYSTEMSETTINGS_AIRFRAMETYPE_OCTO &&
			airframe_type != SYSTEMSETTINGS_AIRFRAMETYPE_HEXAX &&
			airframe_type != SYSTEMSETTINGS_AIRFRAMETYPE_OCTOV &&
			airframe_type != SYSTEMSETTINGS_AIRFRAMETYPE_OCTOCOAXP &&
			airframe_type != SYSTEMSETTINGS_AIRFRAMETYPE_HEXACOAX &&
			airframe_type != SYSTEMSETTINGS_AIRFRAMETYPE_TRI &&
			airframe_type != SYSTEMSETTINGS_AIRFRAMETYPE_VTOL)
		return false;


	uint8_t module_admin_state[MODULESETTINGS_ADMINSTATE_NUMELEM];
	ModuleSettingsAdminStateGet(module_admin_state);

	// VTOLPathFollower module must be enabled
	if (module_admin_state[MODULESETTINGS_ADMINSTATE_VTOLPATHFOLLOWER] != MODULESETTINGS_ADMINSTATE_ENABLED)
		return false;

	// GPS module must be enabled
	if (module_admin_state[MODULESETTINGS_ADMINSTATE_GPS] != MODULESETTINGS_ADMINSTATE_ENABLED)
		return false;

	// check path follower alarm
	if (AlarmsGet(SYSTEMALARMS_ALARM_PATHFOLLOWER) >= SYSTEMALARMS_ALARM_WARNING)
		return false;

	// attitude filter must be set to complementary or INSOutdoor and navigation filter must be INS
	StateEstimationData stateEstimation;
	StateEstimationGet(&stateEstimation);
	if (stateEstimation.AttitudeFilter == STATEESTIMATION_ATTITUDEFILTER_INSINDOOR ||
	               stateEstimation.NavigationFilter != STATEESTIMATION_NAVIGATIONFILTER_INS)
		return false;

	return true;
}