diff --git a/Tools/autotest/helicopter.py b/Tools/autotest/helicopter.py index 9f3f57cc4d..c02608dbb2 100644 --- a/Tools/autotest/helicopter.py +++ b/Tools/autotest/helicopter.py @@ -708,6 +708,48 @@ class AutoTestHelicopter(AutoTestCopter): self.change_mode('LOITER') self.fly_mission_points(self.scurve_nasty_up_mission()) + def MountFailsafeAction(self): + """Fly Mount Failsafe action""" + self.context_push() + + self.progress("Setting up servo mount") + roll_servo = 12 + pitch_servo = 11 + yaw_servo = 10 + open_servo = 9 + roll_limit = 50 + self.set_parameters({ + "MNT1_TYPE": 1, + "SERVO%u_MIN" % roll_servo: 1000, + "SERVO%u_MAX" % roll_servo: 2000, + "SERVO%u_FUNCTION" % yaw_servo: 6, # yaw + "SERVO%u_FUNCTION" % pitch_servo: 7, # roll + "SERVO%u_FUNCTION" % roll_servo: 8, # pitch + "SERVO%u_FUNCTION" % open_servo: 9, # mount open + "MNT1_OPTIONS": 2, # retract + "MNT1_DEFLT_MODE": 3, # RC targettting + "MNT1_ROLL_MIN": -roll_limit, + "MNT1_ROLL_MAX": roll_limit, + }) + + self.reboot_sitl() + + retract_roll = 25.0 + self.set_parameter("MNT1_NEUTRAL_X", retract_roll) + self.progress("Killing RC") + self.set_parameter("SIM_RC_FAIL", 2) + self.delay_sim_time(10) + want_servo_channel_value = int(1500 + 500*retract_roll/roll_limit) + self.wait_servo_channel_value(roll_servo, want_servo_channel_value, epsilon=1) + + self.progress("Resurrecting RC") + self.set_parameter("SIM_RC_FAIL", 0) + self.wait_servo_channel_value(roll_servo, 1500) + + self.context_pop() + + self.reboot_sitl() + def set_rc_default(self): super(AutoTestHelicopter, self).set_rc_default() self.progress("Lowering rotor speed") @@ -1122,6 +1164,7 @@ class AutoTestHelicopter(AutoTestCopter): self.NastyMission, self.PIDNotches, self.AutoTune, + self.MountFailsafeAction, ]) return ret diff --git a/Tools/autotest/vehicle_test_suite.py b/Tools/autotest/vehicle_test_suite.py index 3cab908b59..5885c21267 100644 --- a/Tools/autotest/vehicle_test_suite.py +++ b/Tools/autotest/vehicle_test_suite.py @@ -7939,7 +7939,7 @@ class TestSuite(ABC): (str(m), channel_field)) return m_value - def wait_servo_channel_value(self, channel, value, timeout=2, comparator=operator.eq): + def wait_servo_channel_value(self, channel, value, epsilon=0, timeout=2, comparator=operator.eq): """wait for channel value comparison (default condition is equality)""" channel_field = "servo%u_raw" % channel opstring = ("%s" % comparator)[-3:-1] @@ -7957,8 +7957,11 @@ class TestSuite(ABC): if m_value is None: raise ValueError("message (%s) has no field %s" % (str(m), channel_field)) - self.progress("want SERVO_OUTPUT_RAW.%s=%u %s %u" % + self.progress("SERVO_OUTPUT_RAW.%s got=%u %s want=%u" % (channel_field, m_value, opstring, value)) + if comparator == operator.eq: + if abs(m_value - value) <= epsilon: + return m_value if comparator(m_value, value): return m_value