@ -15,15 +15,21 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
				@@ -15,15 +15,21 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
					 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Start_Take_Off  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  ( Input  =>  Input_State ,  Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  Missio n_State=  INIT ;  
			
		
	
		
			
				
					     Pre     =>  O n_State=  INIT ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Start_Landing  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  ( Input  =>  Input_State ,  Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  Mission_State  =  FLIGHT ;  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Operating_Point  return  Operating_Point_Type  with  
			
		
	
		
			
				
					     Global  =>  Input_State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Operating_Mode  return  Navigation_Option_Type  with  
			
		
	
		
			
				
					     Global  =>  Input_State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Mission_Range  return  Current_Range_Type  with  
			
		
	
		
			
				
					     Global  =>  Input_State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Emergency_Landing  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  Input_State ;  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -34,6 +40,9 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
				@@ -34,6 +40,9 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
					 
			
		
	
		
			
				
					   function  Operating_Point_Changed  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  Input_State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Operating_Mode_Changed  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  Input_State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -  Estimated  Values  - -  
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -44,16 +53,19 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
				@@ -44,16 +53,19 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
					 
			
		
	
		
			
				
					   - -  States  - -  
			
		
	
		
			
				
					   - - - - - - - - - - - -  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Mission_State  return  Mission_State_Type  with  
			
		
	
		
			
				
					   function  On_State  return  On_State_Type  with  
			
		
	
		
			
				
					     Global  =>  Private _ State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Running_State  return  Running_State_Type  with  
			
		
	
		
			
				
					     Global  =>  Private _ State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Engine_State  return  Engine_State_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input  =>  Mutual_Exclusion_State ,  Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  Mission_State  in  FLIGHT  |  LAND ING;  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNN ING;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Aborted_With_Propulsion_Available  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  Private _ State ,  
			
		
	
		
			
				
					     Pre     =>  Missio n_State=  ABORTED ;  
			
		
	
		
			
				
					     Pre     =>  O n_State=  ABORTED ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -  Properties  - -  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -63,7 +75,7 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
				@@ -63,7 +75,7 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
					 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Flight_Phase  return  Flight_Phase_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input  =>  Trajectory_State ,  Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  Mission_State  =  FLIGHT ;  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  In_Safety_Envelope  return  Boolean  is  
			
		
	
		
			
				
					     ( case  Flight_Phase  is  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -77,32 +89,48 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
				@@ -77,32 +89,48 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
					 
			
		
	
		
			
				
					         when  DESCENT  =>  
			
		
	
		
			
				
					            Q_Dot  in  MMS . F_PT . F_FC . Data . Qdot_MinDs  . .  MMS . F_PT . F_FC . Data . Qdot_MaxDs  
			
		
	
		
			
				
					              and  Q  <  MMS . F_PT . F_FC . Data . Q_MaxDs )  
			
		
	
		
			
				
					   with  Pre  =>  Mission_State  =  FLIGHT ;  
			
		
	
		
			
				
					   with  Pre  =>  On_State  =  RUNNING ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Selected_Option  return  Navigation_Option_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Operating_Mode_State ,  
			
		
	
		
			
				
					                Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Already_Running  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  Private _ State ,  
			
		
	
		
			
				
					     Pre     =>  Mission_State  in  FLIGHT  |  LANDING ;  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNN ING;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Time_Since_In_Safety_Escape  return  Time_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Private _ State ,  
			
		
	
		
			
				
					                Proof_In  =>  ( Input_State ,  Trajectory_State ) ) ,  
			
		
	
		
			
				
					     Pre     =>  ( Mission_State  =  FLIGHT  and then  not  In_Safety_Envelope )  
			
		
	
		
			
				
					     or else  Mission_State  =  ABORTED ;  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Safety_Escape_State ,  
			
		
	
		
			
				
					                Proof_In  =>  ( Input_State ,  Trajectory_State ,  Private _ State ) ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING  and then  not  In_Safety_Envelope ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Fast_Evolving_Safety_Escape  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Private _ State ,  
			
		
	
		
			
				
					                Proof_In  =>  ( Input_State ,  Trajectory_State ) ) ,  
			
		
	
		
			
				
					     Pre     =>  Mission_State  =  FLIGHT and then  not  In_Safety_Envelope ;  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING and then  not  In_Safety_Envelope ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Time_Since_Stopped  return  Time_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input  =>  Mutual_Exclusion_State ,  Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  Mission_State  in  FLIGHT  |  LAND ING;  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNN ING;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Propulsion_Torque  return  Torque_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input  =>  Propulsion_State ,  Proof_In  =>  Private _ State ) ;  
			
		
	
		
			
				
					     Global  =>  Propulsion_State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Braking_Torque  return  Torque_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input  =>  Braking_State ,  Proof_In  =>  Private _ State ) ;  
			
		
	
		
			
				
					     Global  =>  Braking_State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Current_Speed  return  Current_Speed_Type  with  
			
		
	
		
			
				
					     Global  =>  AV_State_Vector_State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Current_Altitude  return  Current_Altitude_Type  with  
			
		
	
		
			
				
					     Global  =>  AV_State_Vector_State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Current_Range  return  Current_Range_Type  with  
			
		
	
		
			
				
					     Global  =>  AV_State_Vector_State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Estimated_Total_Mass  return  Estimated_Total_Mass_Type  with  
			
		
	
		
			
				
					     Global  =>  AV_State_Vector_State ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -  Behavioural  Specification  of  F_FC  - -  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -112,7 +140,9 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
				@@ -112,7 +140,9 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
					 
			
		
	
		
			
				
					   - -   Read  values  of  inputs  once  and  for  all  and  update  the  current  state  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     Post    =>  Operating_Point_Changed  =  
			
		
	
		
			
				
					       ( Operating_Point ' Old  / =  Operating_Point ) ;  
			
		
	
		
			
				
					       ( Operating_Point ' Old  / =  Operating_Point )  
			
		
	
		
			
				
					     and then  Operating_Mode_Changed  =  
			
		
	
		
			
				
					       ( Operating_Mode ' Old  / =  Operating_Mode ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   procedure  Write_Outputs  with  
			
		
	
		
			
				
					   - -   Compute  values  of  outputs  from  the  current  state  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -126,89 +156,153 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
				@@ -126,89 +156,153 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
					 
			
		
	
		
			
				
					                           Braking_State ) ,  
			
		
	
		
			
				
					                Output  =>  Output_State ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -  Safety  Objectives  - -  
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -   See  7.7 . 3.2 . E  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   procedure  Check_Safety_Escape  with  
			
		
	
		
			
				
					     Global  =>  ( Input   =>  ( Input_State ,  Trajectory_State ) ,  
			
		
	
		
			
				
					                In_Out  =>  Safety_Escape_State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  in  RUNNING ,  
			
		
	
		
			
				
					     Post    =>  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					       - -   Time_Since_In_Safety_Escape  is  the  number  of  seconds  since  the  first  
			
		
	
		
			
				
					       - -   occurrence  of  safety  escapes .  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					       ( if  not  In_Safety_Envelope  then  
			
		
	
		
			
				
					          ( if  In_Safety_Envelope ' Old  then  Time_Since_In_Safety_Escape  =  0  
			
		
	
		
			
				
					           else  Time_Since_In_Safety_Escape  >  Time_Since_In_Safety_Escape ' Old ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -  Choice  of  Operating  Mode  in  Energy  Mode  - -  
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -   See  6.7 . 4  ( Propulsion  Control )  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   procedure  Choose_Operating_Mode  with  
			
		
	
		
			
				
					   - -   Two  systems  of  two  equations  in  ( pdotA ,  qA ) ,  ( pdotS ,  qS )  are  to  be  solved .  
			
		
	
		
			
				
					   - -   First :  
			
		
	
		
			
				
					   - -   g / L =  ( pdotA )  * *  2  *  cos ( qA )  
			
		
	
		
			
				
					   - -   Operating_Point . Altitude  =  L  *  ( 1  -  cos ( qA ) )  
			
		
	
		
			
				
					   - -   Second   :  
			
		
	
		
			
				
					   - -   g / L  =  ( pdotS )  * *  2  *  cos ( qS )  
			
		
	
		
			
				
					   - -   Operating_Point . Speed  =  pdotS  *  L  *  sin ( qS )  
			
		
	
		
			
				
					   - -   If  pdotA  <  pdotS ,  option  ALTITUDE  is  selected  otherwise  SPEED  is  
			
		
	
		
			
				
					   - -   selected .  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     Global  =>  ( Input   =>  Input_State ,  
			
		
	
		
			
				
					                In_Out  =>  Operating_Mode_State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING ,  
			
		
	
		
			
				
					     Post    =>  Selected_Option  in  SPEED  |  ALTITUDE  
			
		
	
		
			
				
					     and then  
			
		
	
		
			
				
					       ( if  Already_Running  
			
		
	
		
			
				
					        and then  not  Operating_Mode_Changed  
			
		
	
		
			
				
					        and then  not  Operating_Point_Changed  
			
		
	
		
			
				
					        then  Selected_Option  =  Selected_Option ' Old )  
			
		
	
		
			
				
					     and then  
			
		
	
		
			
				
					       ( if  Operating_Mode  in  SPEED  |  ALTITUDE  then  
			
		
	
		
			
				
					          Selected_Option  =  Operating_Mode ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -  AV ' s  State  Vector  - -  
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   procedure  AV_State_Vector  with  
			
		
	
		
			
				
					     Global  =>  ( Input   =>  Input_State ,  
			
		
	
		
			
				
					                In_Out  =>  AV_State_Vector_State ) ;  
			
		
	
		
			
				
					   - -   The  AV ' s  state  vector  is  defined  by :  
			
		
	
		
			
				
					   - -   Current_Speed  =  L  *  sin ( Q )  *  P_Dot  
			
		
	
		
			
				
					   - -   Current_Altitude  =  L  *  ( 1  -  cos ( Q ) )  
			
		
	
		
			
				
					   - -   Current_Range  =  Integral  of  Current_Speed  over  time  
			
		
	
		
			
				
					   - -   Estimated_Total_Mass  =  M0  +  Payload_Mass  +  Micing ,  where  Micing  is  an  
			
		
	
		
			
				
					   - -   unknown  perturbation  to  be  estimated .  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -  Update  the  State  Automaton  - -  
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -   Same  states  as  F_MM  except  On / Off  is  not  considered  here  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   procedure  Update_State  with  
			
		
	
		
			
				
					     Global          =>  ( Input   =>  ( Input_State ,  Trajectory_State ) ,  
			
		
	
		
			
				
					                        In_Out  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Contract_Cases  =>  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					       - -   ? ? ?  All  these  are  guesses . . .  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					       ( ( Mission_State  in  INIT  . .  LANDING )  
			
		
	
		
			
				
					       ( ( On_State  in  INIT  . .  RUNNING )  
			
		
	
		
			
				
					        and then  Emergency_Landing  
			
		
	
		
			
				
					        =>  
			
		
	
		
			
				
					          Mission_State  =  ABORTED  
			
		
	
		
			
				
					          On_State  =  ABORTED  
			
		
	
		
			
				
					        and then  not  Aborted_With_Propulsion_Available ,  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        Mission_State  =  INIT  
			
		
	
		
			
				
					        O n_State=  INIT  
			
		
	
		
			
				
					        and then  not  Emergency_Landing  
			
		
	
		
			
				
					        and then  Start_Take_Off  
			
		
	
		
			
				
					        =>  
			
		
	
		
			
				
					          Mission_State  =  FLIGHT ,  
			
		
	
		
			
				
					          On_State  =  RUNNING ,  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        Mission_State  =  INIT  
			
		
	
		
			
				
					        O n_State=  INIT  
			
		
	
		
			
				
					        and then  not  Emergency_Landing  
			
		
	
		
			
				
					        and then  not  Start_Take_Off  
			
		
	
		
			
				
					        =>  
			
		
	
		
			
				
					          Mission_State  =  INIT ,  
			
		
	
		
			
				
					          O n_State=  INIT ,  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        Mission_State  =  FLIGHT  
			
		
	
		
			
				
					        On_State  =  RUNNING  
			
		
	
		
			
				
					        and then  not  Emergency_Landing  
			
		
	
		
			
				
					        and then  Start_Landing  
			
		
	
		
			
				
					        and then  
			
		
	
		
			
				
					          ( if  Running_State  =  LANDING  then  
			
		
	
		
			
				
					              not  ( P_Dot  =  0.0  and then  Q_Dot  =  0.0 ) )  
			
		
	
		
			
				
					        and then  not  In_Safety_Envelope  
			
		
	
		
			
				
					        and then  Time_Since_In_Safety_Escape  >  MMS . F_PT . F_FC . Data . Escape_Time  
			
		
	
		
			
				
					        =>  
			
		
	
		
			
				
					          Mission_State  =  LANDING ,  
			
		
	
		
			
				
					          On_State  =  ABORTED  
			
		
	
		
			
				
					        and then  Aborted_With_Propulsion_Available ,  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        Mission_State  =  FLIGHT  
			
		
	
		
			
				
					        On_State  =  RUNNING  
			
		
	
		
			
				
					        and then  not  Emergency_Landing  
			
		
	
		
			
				
					        and then  not  Start_Landing  
			
		
	
		
			
				
					        and then  
			
		
	
		
			
				
					          ( if  Running_State  =  LANDING  then  
			
		
	
		
			
				
					              not  ( P_Dot  =  0.0  and then  Q_Dot  =  0.0 ) )  
			
		
	
		
			
				
					        and then  
			
		
	
		
			
				
					          ( if  not  In_Safety_Envelope  then  
			
		
	
		
			
				
					               Time_Since_In_Safety_Escape  < =  MMS . F_PT . F_FC . Data . Escape_Time )  
			
		
	
		
			
				
					        =>  
			
		
	
		
			
				
					          ( if  Time_Since_In_Safety_Escape  >  MMS . F_PT . F_FC . Data . Escape_Time  then  
			
		
	
		
			
				
					               Mission_State  =  ABORTED  
			
		
	
		
			
				
					             and then  Aborted_With_Propulsion_Available  
			
		
	
		
			
				
					           else  Mission_State  =  FLIGHT ) ,  
			
		
	
		
			
				
					          On_State  =  RUNNING ,  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        Mission_State  =  LANDING  
			
		
	
		
			
				
					        On_State  =  RUNNING  
			
		
	
		
			
				
					        and then  not  Emergency_Landing  
			
		
	
		
			
				
					        and then  Running_State  =  LANDING  
			
		
	
		
			
				
					        and then  P_Dot  =  0.0  and then  Q_Dot  =  0.0  
			
		
	
		
			
				
					        =>  
			
		
	
		
			
				
					          ( if  P_Dot  =  0.0  and then  Q_Dot  =  0.0  then  
			
		
	
		
			
				
					               Mission_State  =  COMPLETE  
			
		
	
		
			
				
					           else  Mission_State  =  LANDING ) ,  
			
		
	
		
			
				
					          On_State  =  COMPLETE ,  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        ( Mission_State  in  COMPLETE  |  ABORTED )  
			
		
	
		
			
				
					        ( On_State  in  COMPLETE  |  ABORTED )  
			
		
	
		
			
				
					        =>  
			
		
	
		
			
				
					          Mission_State  =  Mission_State ' Old ) ,  
			
		
	
		
			
				
					          On_State  =  O n_State' Old ) ,  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     Post            =>  
			
		
	
		
			
				
					       ( if  Mission_State  in  FLIGHT  |  LANDING  then  
			
		
	
		
			
				
					       ( if  On_State  =  RUNN INGthen  
			
		
	
		
			
				
					          Engine_State  =  Engine_State ' Old   - -  ? ? ?  Needed  due  to  current  limitation  in  proof  tool  
			
		
	
		
			
				
					        and then  Already_Running  =  ( Mission_State ' Old  in  FLIGHT  |  LANDING ) )  
			
		
	
		
			
				
					        and then  Already_Running  =  ( On_State ' Old  =  RUNNING ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					       - -   Time_Since_In_Safety_Escape  is  the  number  of  seconds  since  the  first  
			
		
	
		
			
				
					       - -   occurrence  of  safety  escapes .  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     and then  
			
		
	
		
			
				
					       ( if  not  In_Safety_Envelope  then  
			
		
	
		
			
				
					          ( if  In_Safety_Envelope ' Old  then  Time_Since_In_Safety_Escape  =  0  
			
		
	
		
			
				
					           else  Time_Since_In_Safety_Escape  >  Time_Since_In_Safety_Escape ' Old ) ) ;  
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -  Propulsion  /  Braking  Mutual  Exclusion  - -  
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Go_To_Braking  return  Boolean  is  
			
		
	
		
			
				
					     ( Mission_State  =  LANDING  
			
		
	
		
			
				
					      or else  
			
		
	
		
			
				
					        ( not  In_Safety_Envelope  
			
		
	
		
			
				
					         and then  
			
		
	
		
			
				
					           ( Time_Since_In_Safety_Escape  >  MMS . F_PT . F_FC . Data . Hazard_Duration  
			
		
	
		
			
				
					            or else  Fast_Evolving_Safety_Escape ) ) )  
			
		
	
		
			
				
					     ( not  In_Safety_Envelope  
			
		
	
		
			
				
					      and then  
			
		
	
		
			
				
					        ( Time_Since_In_Safety_Escape  >  MMS . F_PT . F_FC . Data . Hazard_Duration  
			
		
	
		
			
				
					         or else  Fast_Evolving_Safety_Escape ) )  
			
		
	
		
			
				
					   with  
			
		
	
		
			
				
					     Pre     =>  Mission_State  in  FLIGHT  |  LAND ING;  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Go_To_Propulsion  return  Boolean  is  
			
		
	
		
			
				
					     ( Mission_State  =  FLIGHT  and then  In_Safety_Envelope )  
			
		
	
		
			
				
					     ( In_Safety_Envelope )  
			
		
	
		
			
				
					   with  
			
		
	
		
			
				
					     Pre     =>  Mission_State  in  FLIGHT  |  LAND ING;  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNN ING;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   procedure  Propulsion_Braking_Mutual_Exclusion  with  
			
		
	
		
			
				
					     Global  =>  ( Input   =>  ( Input_State ,  Trajectory_State ,  Private _ State ) ,  
			
		
	
		
			
				
					                In_Out  =>  Mutual_Exclusion_State ) ,  
			
		
	
		
			
				
					     Pre     =>  Mission_State  in  FLIGHT  |  LAND ING,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNN ING,  
			
		
	
		
			
				
					     Contract_Cases  =>  
			
		
	
		
			
				
					       ( not  Already_Running  
			
		
	
		
			
				
					        =>  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -272,17 +366,114 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
				@@ -272,17 +366,114 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
					 
			
		
	
		
			
				
					           else  Engine_State  =  WAITING_BRAK  
			
		
	
		
			
				
					             and then  Time_Since_Stopped  >  Time_Since_Stopped ' Old ) ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					   - -  Reference  Trajectory  Computation  - -  
			
		
	
		
			
				
					   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Set_Point_Altitude  return  Current_Altitude_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Trajectory_State ,  
			
		
	
		
			
				
					                Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Intermediate_Set_Point_Altitude  return  Current_Altitude_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Trajectory_State ,  
			
		
	
		
			
				
					                Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Close_To_Set_Point_Altitude  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Trajectory_State ,  
			
		
	
		
			
				
					                Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING ;  
			
		
	
		
			
				
					   - -   True  if  we  are  close  enough  to  the  set  point .  Used  to  avoid  Zeno  effect .  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Intermediate_Set_Point_Altitude_Reached  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Trajectory_State ,  
			
		
	
		
			
				
					                Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING  and then  Already_Running ;  
			
		
	
		
			
				
					   - -   True  if  we  have  reached  the  previous  intermediate  set  point .  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Set_Point_Speed  return  Current_Speed_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Trajectory_State ,  
			
		
	
		
			
				
					                Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Intermediate_Set_Point_Speed  return  Current_Speed_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Trajectory_State ,  
			
		
	
		
			
				
					                Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Close_To_Set_Point_Speed  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Trajectory_State ,  
			
		
	
		
			
				
					                Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING ;  
			
		
	
		
			
				
					   - -   True  if  we  are  close  enough  to  the  set  point .  Used  to  avoid  Zeno  effect .  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Intermediate_Set_Point_Speed_Reached  return  Boolean  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Trajectory_State ,  
			
		
	
		
			
				
					                Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING  and then  Already_Running ;  
			
		
	
		
			
				
					   - -   True  if  we  have  reached  the  previous  intermediate  set  point .  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   function  Set_Point_Distance  return  Current_Range_Type  with  
			
		
	
		
			
				
					     Global  =>  ( Input     =>  Trajectory_State ,  
			
		
	
		
			
				
					                Proof_In  =>  Private _ State ) ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING  and then  Running_State  =  LANDING ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   procedure  Reference_Trajectory_Computation  with  
			
		
	
		
			
				
					     - -   Computed  at  each  cycle .  Slower  rates  are  possible  but  not  too  slow .  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     Global  =>  ( Input   =>  ( Input_State ,  Private _ State ) ,  
			
		
	
		
			
				
					                In_Out  =>  Trajectory_State ) ,  
			
		
	
		
			
				
					     Pre     =>  Mission_State  in  FLIGHT  . .  LANDING ,  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNN ING,  
			
		
	
		
			
				
					     Post    =>  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					       - -   Changes  in  the  operating  point  provoque  termination  of  the  current  
			
		
	
		
			
				
					       - -   cruise  phase  and  activate  a  transient  climb  or  descent  phase  to  
			
		
	
		
			
				
					       - -   capture  the  new  operating  point  ( see  6.6 . 4  4.  Cruise ) .  
			
		
	
		
			
				
					       - -   For  landing ,  a  distance  objective  is  added  to  the  zero - altitude  
			
		
	
		
			
				
					       - -   objective .  Landing  must  occur  at  range  completion .  
			
		
	
		
			
				
					       - -   ? ? ?  How  is  it  used  by  the  PID ?  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					       ( if  Running_State  =  FLIGHT  then  
			
		
	
		
			
				
					          Set_Point_Altitude  =  Operating_Point . Altitude  
			
		
	
		
			
				
					          and then  Set_Point_Speed  =  Operating_Point . Speed  
			
		
	
		
			
				
					        else  
			
		
	
		
			
				
					          Set_Point_Altitude  =  0  
			
		
	
		
			
				
					          and then  Set_Point_Speed  =  0  
			
		
	
		
			
				
					          and then  Set_Point_Distance  =  Mission_Range )  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     - -   Instead  of  giving  the  true  set - point  to  propulsion  control ,  it  gives  
			
		
	
		
			
				
					     - -   half  of  the  change  amplitude .  When  current  intermediate  set - point  is  
			
		
	
		
			
				
					     - -   reached ,  a  new  one  is  computed  ( zeno  like  aspects  to  be  addressed  for  
			
		
	
		
			
				
					     - -   convergence .  
			
		
	
		
			
				
					     - -   Module  is  reset  by  any  operating  point  change .  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					       ( if  Mission_State  =  FLIGHT  and then  Operating_Point_Changed  then  
			
		
	
		
			
				
					     and then  
			
		
	
		
			
				
					       ( if  not  Already_Running  
			
		
	
		
			
				
					        or else  ( Running_State  =  FLIGHT  and then  Operating_Point_Changed )  
			
		
	
		
			
				
					        or else  ( Intermediate_Set_Point_Speed_Reached  
			
		
	
		
			
				
					                 and then  not  Close_To_Set_Point_Speed )  then  
			
		
	
		
			
				
					          Intermediate_Set_Point_Speed  =  
			
		
	
		
			
				
					                ( Set_Point_Speed  +  Current_Speed )  /  2  
			
		
	
		
			
				
					        elsif  Close_To_Set_Point_Speed  then  
			
		
	
		
			
				
					          Intermediate_Set_Point_Speed  =  Set_Point_Speed  
			
		
	
		
			
				
					        else  Intermediate_Set_Point_Speed  =  Intermediate_Set_Point_Speed ' Old )  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     and then  
			
		
	
		
			
				
					       ( if  not  Already_Running  
			
		
	
		
			
				
					        or else  ( Running_State  =  FLIGHT  and then  Operating_Point_Changed )  
			
		
	
		
			
				
					        or else  ( Intermediate_Set_Point_Altitude_Reached  
			
		
	
		
			
				
					                 and then  not  Close_To_Set_Point_Altitude )  then  
			
		
	
		
			
				
					          Intermediate_Set_Point_Altitude  =  
			
		
	
		
			
				
					                ( Set_Point_Altitude  +  Current_Altitude )  /  2  
			
		
	
		
			
				
					        elsif  Close_To_Set_Point_Altitude  then  
			
		
	
		
			
				
					          Intermediate_Set_Point_Altitude  =  Set_Point_Altitude  
			
		
	
		
			
				
					        else  Intermediate_Set_Point_Altitude  =  Intermediate_Set_Point_Altitude ' Old )  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    - -   Changes  in  the  operating  point  provoque  termination  of  the  current  
			
		
	
		
			
				
					    - -   cruise  phase  and  activate  a  transient  climb  or  descent  phase  to  
			
		
	
		
			
				
					    - -   capture  the  new  operating  point  ( see  6.6 . 4  4.  Cruise ) .  
			
		
	
		
			
				
					    - -   ? ? ?  How  is  the  current  Flight_Phase  computed  ?  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					     and then  
			
		
	
		
			
				
					       ( if  Running_State  =  FLIGHT  and then  Operating_Point_Changed  then  
			
		
	
		
			
				
					          Flight_Phase  in  CLIMB  |  DESCENT ) ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   procedure  Gain_Scheduling  with  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -291,7 +482,7 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
				@@ -291,7 +482,7 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
					 
			
		
	
		
			
				
					                           Private _ State ,  
			
		
	
		
			
				
					                           Mutual_Exclusion_State ) ,  
			
		
	
		
			
				
					                In_Out  =>  Gain_Scheduling_State ) ,  
			
		
	
		
			
				
					     Pre     =>  Mission_State  in  FLIGHT  . .  LAND ING;  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNN ING;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   procedure  Propulsion_Control  with  
			
		
	
		
			
				
					     Global  =>  ( Input   =>  ( Input_State ,  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -300,7 +491,8 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
				@@ -300,7 +491,8 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
					 
			
		
	
		
			
				
					                           Gain_Scheduling_State ,  
			
		
	
		
			
				
					                           Mutual_Exclusion_State ) ,  
			
		
	
		
			
				
					                In_Out  =>  Propulsion_State ) ,  
			
		
	
		
			
				
					     Pre     =>  Mission_State  =  FLIGHT  and then  Engine_State  =  PROPULSION ;  
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNNING  
			
		
	
		
			
				
					     and then  Engine_State  =  PROPULSION ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					   procedure  Braking_Control  with  
			
		
	
		
			
				
					     Global  =>  ( Input   =>  ( Input_State ,  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -309,7 +501,7 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
				@@ -309,7 +501,7 @@ package MMS.F_PT.F_FC.Behavior with SPARK_Mode is
					 
			
		
	
		
			
				
					                           Gain_Scheduling_State ,  
			
		
	
		
			
				
					                           Mutual_Exclusion_State ) ,  
			
		
	
		
			
				
					                In_Out  =>  Braking_State ) ,  
			
		
	
		
			
				
					     Pre     =>  Mission_State  in  FLIGHT  . .  LAND ING 
			
		
	
		
			
				
					     Pre     =>  On_State  =  RUNN ING 
			
		
	
		
			
				
					     and then  Engine_State  =  BRAKING ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					end  MMS.F_PT.F_FC.Behavior ;