def test_determine_pilot_from_hdf_control_column(self): ''' Use Control Column Force (*) to determine the flying pilot ''' import logging determine_pilot = DeterminePilot() # warning method is normally initialised with Node superclass in one of # the DeterminePilot's ancestors determine_pilot.warning = logging.warning determine_pilot.info = logging.info def test_from_file(hdf_path, _slice, phase_name, expected_pilot): (pitch_capt, pitch_fo, roll_capt, roll_fo, cc_capt, cc_fo, phase) = self.get_params(hdf_path, _slice, phase_name) pilot = determine_pilot._determine_pilot( None, pitch_capt, pitch_fo, roll_capt, roll_fo, None, None, phase, None, None) # pitch and roll are not enough to determine the pilot self.assertIsNone(pilot) pilot = determine_pilot._determine_pilot( None, pitch_capt, pitch_fo, roll_capt, roll_fo, cc_capt, cc_fo, phase, None, None) # control column force should allow to determine the pilot self.assertEqual(pilot, expected_pilot) items = [ [ os.path.join(test_data_path, 'identify_pilot_01.hdf5'), 'Captain', 'Captain', slice(686, 751), slice(40773, 40872) ], [ os.path.join(test_data_path, 'identify_pilot_02.hdf5'), 'First Officer', 'First Officer', slice(1015, 1162), slice(41451, 41511) ], ] for fn, to_pilot, ld_pilot, to, ld in items: test_from_file(fn, to, 'Takeoff', to_pilot) test_from_file(fn, ld, 'Landing', ld_pilot)
def test__controls_changed(self): determine_pilot = DeterminePilot() slice_ = slice(0, 3) below_tolerance = np.ma.array([ settings.CONTROLS_IN_USE_TOLERANCE / 4.0, 0, 0, settings.CONTROLS_IN_USE_TOLERANCE / 2.0, 0, 0, ]) above_tolerance = np.ma.array([ settings.CONTROLS_IN_USE_TOLERANCE * 4.0, 0, 0, settings.CONTROLS_IN_USE_TOLERANCE * 2.0, 0, 0, ]) # Both pitch and roll below tolerance: pitch, roll = below_tolerance, below_tolerance change = determine_pilot._controls_changed(slice_, pitch, roll) self.assertFalse(change) # Pitch above tolerance: pitch, roll = above_tolerance, below_tolerance change = determine_pilot._controls_changed(slice_, pitch, roll) self.assertTrue(change) # Roll above tolerance: pitch, roll = below_tolerance, above_tolerance change = determine_pilot._controls_changed(slice_, pitch, roll) self.assertTrue(change) # Both pitch and roll above tolerance: pitch, roll = above_tolerance, above_tolerance change = determine_pilot._controls_changed(slice_, pitch, roll) self.assertTrue(change) # Both pitch and roll above tolerance outside of slice: slice_ = slice(1, 3) pitch, roll = above_tolerance, above_tolerance change = determine_pilot._controls_changed(slice_, pitch, roll) self.assertFalse(change)
def test__autopilot_engaged(self): determine_pilot = DeterminePilot() # No autopilots engaged: pilot = determine_pilot._autopilot_engaged(0, 0) self.assertEqual(pilot, None) # Autopilot 1 engaged: pilot = determine_pilot._autopilot_engaged(1, 0) self.assertEqual(pilot, 'Captain') # Autopilot 2 engaged: pilot = determine_pilot._autopilot_engaged(0, 1) self.assertEqual(pilot, 'First Officer') # Autopilots 1 & 2 engaged: pilot = determine_pilot._autopilot_engaged(1, 1) self.assertEqual(pilot, None)
def test__determine_pilot(self): determine_pilot = DeterminePilot() pitch_capt = Mock() pitch_fo = Mock() roll_capt = Mock() roll_fo = Mock() cc_capt = Mock() cc_fo = Mock() pitch_capt.array = Mock() pitch_fo.array = Mock() roll_capt.array = Mock() roll_fo.array = Mock() cc_capt.array = Mock() cc_fo.array = Mock() ap1 = Mock() ap2 = Mock() phase = Mock() determine_pilot._autopilot_engaged = Mock() determine_pilot._controls_in_use = Mock() determine_pilot._control_column_in_use = Mock() determine_pilot.set_flight_attr = Mock() def reset_all_mocks(): determine_pilot._autopilot_engaged.reset_mock() determine_pilot._controls_in_use.reset_mock() determine_pilot._control_column_in_use.reset_mock() determine_pilot.set_flight_attr.reset_mock() # Controls in use, no phase. reset_all_mocks() pilot = determine_pilot._determine_pilot( None, pitch_capt, pitch_fo, roll_capt, roll_fo, cc_capt, cc_fo, None, None, None) self.assertFalse(determine_pilot._autopilot_engaged.called) self.assertFalse(determine_pilot._controls_in_use.called) self.assertEqual(pilot, None) # Controls in use with phase. Pilot cannot be discerned. reset_all_mocks() determine_pilot._controls_in_use.return_value = None determine_pilot._control_column_in_use.return_value = None pilot = determine_pilot._determine_pilot( None, pitch_capt, pitch_fo, roll_capt, roll_fo, cc_capt, cc_fo, phase, None, None) self.assertFalse(determine_pilot._autopilot_engaged.called) determine_pilot._controls_in_use.assert_called_once_with( pitch_capt.array, pitch_fo.array, roll_capt.array, roll_fo.array, phase) determine_pilot._control_column_in_use.assert_called_once_with( cc_capt.array, cc_fo.array, phase) self.assertEqual(pilot, determine_pilot._controls_in_use.return_value) # Controls in use with phase. Pilot returned reset_all_mocks() determine_pilot._controls_in_use.return_value = 'Captain' pilot = determine_pilot._determine_pilot( None, pitch_capt, pitch_fo, roll_capt, roll_fo, cc_capt, cc_fo, phase, None, None) self.assertFalse(determine_pilot._autopilot_engaged.called) determine_pilot._controls_in_use.assert_called_once_with(pitch_capt.array, pitch_fo.array, roll_capt.array, roll_fo.array, phase) self.assertEqual(pilot, determine_pilot._controls_in_use.return_value) # Only Autopilot. reset_all_mocks() determine_pilot._autopilot_engaged.return_value = 'Captain' pilot = determine_pilot._determine_pilot(None, None, None, None, None, None, None, None, ap1, ap2) determine_pilot._autopilot_engaged.assert_called_once_with(ap1, ap2) self.assertFalse(determine_pilot._controls_in_use.called) self.assertEqual(pilot, determine_pilot._autopilot_engaged.return_value) # Controls in Use overrides Autopilot. reset_all_mocks() determine_pilot._controls_in_use.return_value = 'Captain' determine_pilot._autopilot_engaged.return_value = 'First Officer' pilot = determine_pilot._determine_pilot( None, pitch_capt, pitch_fo, roll_capt, roll_fo, cc_capt, cc_fo, phase, ap1, ap2) self.assertFalse(determine_pilot._autopilot_engaged.called) determine_pilot._controls_in_use.assert_called_once_with( pitch_capt.array, pitch_fo.array, roll_capt.array, roll_fo.array, phase) self.assertEqual(pilot, determine_pilot._controls_in_use.return_value) # Autopilot is used when Controls in Use does not provide an answer. reset_all_mocks() determine_pilot._autopilot_engaged.return_value = 'First Officer' determine_pilot._controls_in_use.return_value = None determine_pilot._control_column_in_use.return_value = None pilot = determine_pilot._determine_pilot( None, pitch_capt, pitch_fo, roll_capt, roll_fo, cc_capt, cc_fo, phase, ap1, ap2) determine_pilot._autopilot_engaged.assert_called_once_with(ap1, ap2) determine_pilot._controls_in_use.assert_called_once_with( pitch_capt.array, pitch_fo.array, roll_capt.array, roll_fo.array, phase) self.assertEqual(pilot, determine_pilot._autopilot_engaged.return_value)