|
|
@ -10,6 +10,9 @@ |
|
|
|
|
|
|
|
|
|
|
|
with Types; use Types; |
|
|
|
with Types; use Types; |
|
|
|
with External; |
|
|
|
with External; |
|
|
|
|
|
|
|
with MMS.F_PT.F_MM.Data; |
|
|
|
|
|
|
|
private with MMS.F_PT.F_MM.State; |
|
|
|
|
|
|
|
with MMS.F_PT.Data; |
|
|
|
|
|
|
|
|
|
|
|
package MMS.F_PT.F_MM.Behavior with SPARK_Mode is |
|
|
|
package MMS.F_PT.F_MM.Behavior with SPARK_Mode is |
|
|
|
pragma Unevaluated_Use_Of_Old (Allow); |
|
|
|
pragma Unevaluated_Use_Of_Old (Allow); |
|
|
@ -18,35 +21,59 @@ package MMS.F_PT.F_MM.Behavior with SPARK_Mode is |
|
|
|
-- Inputs -- |
|
|
|
-- Inputs -- |
|
|
|
------------ |
|
|
|
------------ |
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Mode_From_CP return Navigation_Mode_Type with |
|
|
|
function Power_On return Boolean; |
|
|
|
Global => Private_State; |
|
|
|
|
|
|
|
|
|
|
|
function Payload_Bay_Closed return Boolean with |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then On_State = INIT; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Payload_Mass_Given return Boolean with |
|
|
|
|
|
|
|
Pre => Power_State = ON; |
|
|
|
|
|
|
|
-- ??? Should we assume that Payload_Mass is always given after takeoff? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Payload_Mass return Payload_Mass_Type with |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then Payload_Mass_Given; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Mode_From_CP return Navigation_Mode_Type; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Mode_From_GS_Received return Boolean; |
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Mode_From_GS return Navigation_Mode_Type with |
|
|
|
function Navigation_Mode_From_GS return Navigation_Mode_Type with |
|
|
|
Global => Private_State; |
|
|
|
Pre => Navigation_Mode_From_GS_Received; |
|
|
|
|
|
|
|
|
|
|
|
function Operating_Point_From_GS_Received return Boolean with |
|
|
|
function Operating_Mode_From_CP return Navigation_Option_Type; |
|
|
|
Global => Private_State; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Operating_Point_From_GS return Operating_Point_Type with |
|
|
|
function Operating_Mode_From_GS_Received return Boolean; |
|
|
|
Global => Private_State; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function USB_Key_Present return Boolean with |
|
|
|
function Operating_Mode_From_GS return Navigation_Option_Type with |
|
|
|
Global => Private_State; |
|
|
|
Pre => Operating_Mode_From_GS_Received; |
|
|
|
|
|
|
|
|
|
|
|
function Operating_Point_From_USB_Key return Operating_Point_Type with |
|
|
|
function Navigation_Parameters_From_GS_Received return Boolean; |
|
|
|
Global => Private_State; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Current_Range return Current_Range_Type with |
|
|
|
function Navigation_Parameters_From_GS return Navigation_Parameters_Type with |
|
|
|
Global => Private_State; |
|
|
|
Pre => Navigation_Parameters_From_GS_Received; |
|
|
|
|
|
|
|
|
|
|
|
function Current_Speed return Current_Speed_Type with |
|
|
|
function USB_Key_Present return Boolean; |
|
|
|
Global => Private_State; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Current_Altitude return Current_Altitude_Type with |
|
|
|
function Navigation_Parameters_From_USB_Key return Navigation_Parameters_Type |
|
|
|
Global => Private_State; |
|
|
|
with |
|
|
|
|
|
|
|
Pre => USB_Key_Present; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Mission_Abort_Received return Boolean with |
|
|
|
|
|
|
|
Pre => Power_State = ON; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Start_Or_Go_Received return Boolean with |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then On_State = INIT; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Current_Range return Current_Range_Type; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Current_Speed return Current_Speed_Type; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Current_Altitude return Current_Altitude_Type; |
|
|
|
|
|
|
|
|
|
|
|
function Current_Flight_Phase return Flight_Phase_Type with |
|
|
|
function Current_Flight_Phase return Flight_Phase_Type with |
|
|
|
Global => Private_State, |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
Pre => Power_State = ON |
|
|
|
and then On_State = RUNNING |
|
|
|
and then On_State = RUNNING |
|
|
|
and then Running_State = FLIGHT; |
|
|
|
and then Running_State = FLIGHT; |
|
|
@ -73,39 +100,11 @@ package MMS.F_PT.F_MM.Behavior with SPARK_Mode is |
|
|
|
Pre => Power_State = ON |
|
|
|
Pre => Power_State = ON |
|
|
|
and then On_State = RUNNING; |
|
|
|
and then On_State = RUNNING; |
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Mode return Navigation_Mode_Type |
|
|
|
----------------------------- |
|
|
|
is (if Navigation_Mode_From_CP = A then A |
|
|
|
-- Properties and Entities -- |
|
|
|
else Navigation_Mode_From_GS) |
|
|
|
----------------------------- |
|
|
|
with |
|
|
|
|
|
|
|
Global => Private_State, |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then On_State in INIT | RUNNING; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Operating_Mode return Navigation_Option_Type with |
|
|
|
function Power_Off return Boolean is (not Power_On); |
|
|
|
Global => Private_State, |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then On_State = RUNNING |
|
|
|
|
|
|
|
and then Navigation_Mode = RP; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
----------------------------------------- |
|
|
|
|
|
|
|
-- Guards of the automaton in Figure 3 -- |
|
|
|
|
|
|
|
----------------------------------------- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Power_On return Boolean with |
|
|
|
|
|
|
|
Global => Private_State; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Power_Off return Boolean with |
|
|
|
|
|
|
|
Global => Private_State, |
|
|
|
|
|
|
|
Post => Power_Off'Result = not Power_On; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Mission_Abort_Received return Boolean with |
|
|
|
|
|
|
|
Global => Private_State, |
|
|
|
|
|
|
|
Pre => Power_State = ON; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Start_Or_Go_Received return Boolean with |
|
|
|
|
|
|
|
Global => Private_State, |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then On_State = INIT; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Take_Off_Over return Boolean with |
|
|
|
function Take_Off_Over return Boolean with |
|
|
|
Global => Private_State, |
|
|
|
Global => Private_State, |
|
|
@ -117,68 +116,86 @@ package MMS.F_PT.F_MM.Behavior with SPARK_Mode is |
|
|
|
Global => Private_State, |
|
|
|
Global => Private_State, |
|
|
|
Pre => Power_State = ON |
|
|
|
Pre => Power_State = ON |
|
|
|
and then On_State = RUNNING |
|
|
|
and then On_State = RUNNING |
|
|
|
and then Running_State = FLIGHT |
|
|
|
and then Running_State = FLIGHT; |
|
|
|
and then Current_Flight_Phase = DESCENT; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Landed return Boolean is |
|
|
|
function Landed return Boolean is |
|
|
|
(Current_Speed = 0 and Current_Altitude = 0) |
|
|
|
(Current_Speed = 0 and Current_Altitude = 0) |
|
|
|
with |
|
|
|
with |
|
|
|
Global => Private_State, |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
Pre => Power_State = ON |
|
|
|
and then On_State = RUNNING |
|
|
|
and then On_State = RUNNING |
|
|
|
and then Running_State = LANDING; |
|
|
|
and then Running_State = LANDING; |
|
|
|
|
|
|
|
|
|
|
|
---------------- |
|
|
|
function Mission_Range_From_Navigation_Parameters |
|
|
|
-- Properties -- |
|
|
|
return Current_Range_Type; |
|
|
|
---------------- |
|
|
|
-- with Pre => Mission_Parameters_Defined; |
|
|
|
|
|
|
|
-- Fetch distance from State.Navigation_Parameters and do the appropriate |
|
|
|
|
|
|
|
-- conversion. |
|
|
|
|
|
|
|
|
|
|
|
function Energy_Compatible_With_Mission return Boolean with |
|
|
|
function Operating_Point_From_Navigation_Parameters |
|
|
|
|
|
|
|
return Operating_Point_Type; |
|
|
|
|
|
|
|
-- with Pre => Mission_Parameters_Defined; |
|
|
|
|
|
|
|
-- Fetch altitude and speed from State.Navigation_Parameters and do the |
|
|
|
|
|
|
|
-- appropriate conversions. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Mode return Navigation_Mode_Type with |
|
|
|
Global => Private_State, |
|
|
|
Global => Private_State, |
|
|
|
Pre => Power_State = ON |
|
|
|
Pre => Power_State = ON |
|
|
|
and then On_State in INIT | RUNNING |
|
|
|
and then On_State in INIT | RUNNING; |
|
|
|
and then (if On_State = RUNNING then |
|
|
|
|
|
|
|
Running_State = FLIGHT and then Current_Flight_Phase = CRUISE); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Mission_Parameters_Defined return Boolean is |
|
|
|
function Operating_Mode return Navigation_Option_Type with |
|
|
|
(USB_Key_Present |
|
|
|
|
|
|
|
or else (Navigation_Mode_From_CP = RP |
|
|
|
|
|
|
|
and then Operating_Point_From_GS_Received)) |
|
|
|
|
|
|
|
with |
|
|
|
|
|
|
|
Global => Private_State, |
|
|
|
Global => Private_State, |
|
|
|
Pre => Power_State = ON |
|
|
|
Pre => Power_State = ON |
|
|
|
and then On_State = INIT; |
|
|
|
and then On_State = RUNNING |
|
|
|
|
|
|
|
and then Navigation_Mode = RP; |
|
|
|
|
|
|
|
|
|
|
|
function Payload_Bay_Closed return Boolean with |
|
|
|
function Initial_Energy_Compatible_With_Mission return Boolean with |
|
|
|
Global => Private_State, |
|
|
|
Global => Private_State, |
|
|
|
Pre => Power_State = ON |
|
|
|
Pre => Power_State = ON |
|
|
|
and then On_State = INIT; |
|
|
|
and then On_State = INIT; |
|
|
|
|
|
|
|
-- and then Mission_Parameters_Defined |
|
|
|
|
|
|
|
-- and then Payload_Mass_Given; |
|
|
|
|
|
|
|
|
|
|
|
function Mission_Cancellation_Signaled return Boolean with |
|
|
|
function In_Flight_Energy_Compatible_With_Mission return Boolean with |
|
|
|
Global => Private_State; |
|
|
|
Global => Private_State, |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then On_State = RUNNING |
|
|
|
|
|
|
|
and then Running_State = FLIGHT; |
|
|
|
|
|
|
|
-- and then Current_Flight_Phase = CRUISE; |
|
|
|
|
|
|
|
|
|
|
|
------------- |
|
|
|
function Mission_Parameters_Defined return Boolean is |
|
|
|
-- Outputs -- |
|
|
|
(USB_Key_Present |
|
|
|
------------- |
|
|
|
or else (Navigation_Mode_From_CP = RP |
|
|
|
|
|
|
|
and then Navigation_Parameters_From_GS_Received)); |
|
|
|
|
|
|
|
|
|
|
|
function Ready_For_Takeoff return Boolean is |
|
|
|
function Ready_For_Takeoff return Boolean is |
|
|
|
(Payload_Bay_Closed |
|
|
|
(Payload_Bay_Closed |
|
|
|
|
|
|
|
and then Payload_Mass_Given |
|
|
|
and then Mission_Parameters_Defined |
|
|
|
and then Mission_Parameters_Defined |
|
|
|
and then Energy_Compatible_With_Mission) |
|
|
|
and then Initial_Energy_Compatible_With_Mission) |
|
|
|
with |
|
|
|
with |
|
|
|
Global => Private_State, |
|
|
|
Global => (Private_State, Input_State), |
|
|
|
Pre => Power_State = ON |
|
|
|
Pre => Power_State = ON |
|
|
|
and then On_State = INIT; |
|
|
|
and then On_State = INIT; |
|
|
|
|
|
|
|
-- ??? Should be sent to F_CM but the corresponding flag is disabled for |
|
|
|
|
|
|
|
-- now... |
|
|
|
|
|
|
|
|
|
|
|
function Emergency_Landing return Boolean with |
|
|
|
function Emergency_Landing return Boolean is |
|
|
|
|
|
|
|
(On_State = CANCELLED) |
|
|
|
|
|
|
|
with |
|
|
|
Global => Private_State, |
|
|
|
Global => Private_State, |
|
|
|
Pre => Power_State = ON |
|
|
|
Pre => Power_State = ON; |
|
|
|
and then On_State = CANCELLED; |
|
|
|
-- ??? Should be ABORTED maybe? |
|
|
|
|
|
|
|
|
|
|
|
function Mission_Range return Current_Range_Type with |
|
|
|
function Mission_Range return Current_Range_Type with |
|
|
|
Global => Private_State; |
|
|
|
Global => Private_State; |
|
|
|
|
|
|
|
-- Pre => Mission_Parameters_Defined; |
|
|
|
|
|
|
|
|
|
|
|
function Operating_Point return Operating_Point_Type with |
|
|
|
function Operating_Point return Operating_Point_Type with |
|
|
|
Global => Private_State; |
|
|
|
Global => Private_State; |
|
|
|
|
|
|
|
-- Pre => Mission_Parameters_Defined; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Mission_Cancellation_Signaled return Boolean with |
|
|
|
|
|
|
|
Global => Private_State; |
|
|
|
|
|
|
|
|
|
|
|
--------------------------------------- |
|
|
|
--------------------------------------- |
|
|
|
-- Behavioural Specification of F_MM -- |
|
|
|
-- Behavioural Specification of F_MM -- |
|
|
@ -186,7 +203,7 @@ package MMS.F_PT.F_MM.Behavior with SPARK_Mode is |
|
|
|
|
|
|
|
|
|
|
|
procedure Read_Inputs with |
|
|
|
procedure Read_Inputs with |
|
|
|
-- Read values of inputs once and for all and update the current state |
|
|
|
-- Read values of inputs once and for all and update the current state |
|
|
|
Global => (In_Out => Private_State, |
|
|
|
Global => (Output => Input_State, |
|
|
|
Input => External.State); |
|
|
|
Input => External.State); |
|
|
|
|
|
|
|
|
|
|
|
procedure Write_Outputs with |
|
|
|
procedure Write_Outputs with |
|
|
@ -198,7 +215,7 @@ package MMS.F_PT.F_MM.Behavior with SPARK_Mode is |
|
|
|
-- Do: |
|
|
|
-- Do: |
|
|
|
-- - Compute the new state of the automaton |
|
|
|
-- - Compute the new state of the automaton |
|
|
|
|
|
|
|
|
|
|
|
Global => (In_Out => Private_State), |
|
|
|
Global => (In_Out => Private_State, Input => Input_State), |
|
|
|
Post => |
|
|
|
Post => |
|
|
|
|
|
|
|
|
|
|
|
-- RP mode enables modification of range parameter before take-off. |
|
|
|
-- RP mode enables modification of range parameter before take-off. |
|
|
@ -206,7 +223,9 @@ package MMS.F_PT.F_MM.Behavior with SPARK_Mode is |
|
|
|
(if not (Power_State'Old = ON |
|
|
|
(if not (Power_State'Old = ON |
|
|
|
and then On_State'Old = INIT |
|
|
|
and then On_State'Old = INIT |
|
|
|
and then Navigation_Mode'Old = RP) |
|
|
|
and then Navigation_Mode'Old = RP) |
|
|
|
then Mission_Range = Mission_Range'Old) |
|
|
|
then Mission_Range = Mission_Range'Old |
|
|
|
|
|
|
|
elsif Mission_Parameters_Defined |
|
|
|
|
|
|
|
then Mission_Range = Mission_Range_From_Navigation_Parameters) |
|
|
|
|
|
|
|
|
|
|
|
-- RP mode enables modification of altitude and speed parameters at any |
|
|
|
-- RP mode enables modification of altitude and speed parameters at any |
|
|
|
-- time (but not at landing, it is frozen...). |
|
|
|
-- time (but not at landing, it is frozen...). |
|
|
@ -308,7 +327,7 @@ package MMS.F_PT.F_MM.Behavior with SPARK_Mode is |
|
|
|
and then Current_Flight_Phase = CRUISE |
|
|
|
and then Current_Flight_Phase = CRUISE |
|
|
|
and then Power_On |
|
|
|
and then Power_On |
|
|
|
and then not Mission_Abort_Received |
|
|
|
and then not Mission_Abort_Received |
|
|
|
and then not Energy_Compatible_With_Mission |
|
|
|
and then not In_Flight_Energy_Compatible_With_Mission |
|
|
|
=> |
|
|
|
=> |
|
|
|
Power_State = ON |
|
|
|
Power_State = ON |
|
|
|
and then On_State = CANCELLED |
|
|
|
and then On_State = CANCELLED |
|
|
@ -333,7 +352,8 @@ package MMS.F_PT.F_MM.Behavior with SPARK_Mode is |
|
|
|
and then Power_On |
|
|
|
and then Power_On |
|
|
|
and then not Mission_Abort_Received |
|
|
|
and then not Mission_Abort_Received |
|
|
|
and then |
|
|
|
and then |
|
|
|
(if Current_Flight_Phase = CRUISE then Energy_Compatible_With_Mission) |
|
|
|
(if Current_Flight_Phase = CRUISE then |
|
|
|
|
|
|
|
In_Flight_Energy_Compatible_With_Mission) |
|
|
|
and then |
|
|
|
and then |
|
|
|
(if Current_Flight_Phase = DESCENT then not Descent_Over) |
|
|
|
(if Current_Flight_Phase = DESCENT then not Descent_Over) |
|
|
|
=> |
|
|
|
=> |
|
|
@ -371,23 +391,243 @@ package MMS.F_PT.F_MM.Behavior with SPARK_Mode is |
|
|
|
|
|
|
|
|
|
|
|
private |
|
|
|
private |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---------------------------- |
|
|
|
|
|
|
|
-- Definitions of Inputs -- |
|
|
|
|
|
|
|
---------------------------- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Power_On return Boolean is |
|
|
|
|
|
|
|
(State.Input_On_OFF_Push_Button); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Payload_Bay_Closed return Boolean is |
|
|
|
|
|
|
|
(State.Input_Bay_Switch = CLOSED); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Payload_Mass_Given return Boolean is |
|
|
|
|
|
|
|
(State.Input_Payload_Mass /= 99); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Payload_Mass return Payload_Mass_Type is |
|
|
|
|
|
|
|
(State.Input_Payload_Mass); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Mode_From_CP return Navigation_Mode_Type is |
|
|
|
|
|
|
|
(State.Input_Mode_Switch); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Mode_From_GS_Received return Boolean is |
|
|
|
|
|
|
|
(State.Input_Navigation_Mode.Present); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Mode_From_GS return Navigation_Mode_Type is |
|
|
|
|
|
|
|
(State.Input_Navigation_Mode.Content); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Operating_Mode_From_CP return Navigation_Option_Type is |
|
|
|
|
|
|
|
(ALTITUDE); -- ??? what is the default operating mode in A mode? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Operating_Mode_From_GS_Received return Boolean is |
|
|
|
|
|
|
|
(State.Input_Navigation_Option.Present); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Operating_Mode_From_GS return Navigation_Option_Type is |
|
|
|
|
|
|
|
(State.Input_Navigation_Option.Content); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Parameters_From_GS_Received return Boolean is |
|
|
|
|
|
|
|
(State.Input_Navigation_Parameters.Present); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Parameters_From_GS return Navigation_Parameters_Type is |
|
|
|
|
|
|
|
(State.Input_Navigation_Parameters.Content); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function USB_Key_Present return Boolean is |
|
|
|
|
|
|
|
(State.Input_USB_Key.Present); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Parameters_From_USB_Key return Navigation_Parameters_Type is |
|
|
|
|
|
|
|
(State.Input_USB_Key.Content); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Mission_Abort_Received return Boolean is |
|
|
|
|
|
|
|
(State.Input_Mission_Abort); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Start_Or_Go_Received return Boolean is |
|
|
|
|
|
|
|
(State.Input_Go or State.Input_Start_Push_Button); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Current_Range return Current_Range_Type is |
|
|
|
|
|
|
|
(State.Input_Current_Range); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Current_Speed return Current_Speed_Type is |
|
|
|
|
|
|
|
(State.Input_Current_Speed); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Current_Altitude return Current_Altitude_Type is |
|
|
|
|
|
|
|
(State.Input_Current_Altitude); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Current_Flight_Phase return Flight_Phase_Type is |
|
|
|
|
|
|
|
(State.Input_Current_Flight_Phase); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
------------------- |
|
|
|
|
|
|
|
-- Tasks of F_MM -- |
|
|
|
|
|
|
|
------------------- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Navigation_Parameters return Navigation_Parameters_Type is |
|
|
|
|
|
|
|
(State.Navigation_Parameters); |
|
|
|
|
|
|
|
-- with Pre => Mission_Parameters_Defined; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
procedure Management_Of_Navigation_Mode with |
|
|
|
|
|
|
|
-- Compute the value of Navigation_Mode / Options / Parameters (see 6.9.4) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Post => Navigation_Mode = |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- In case of conflict on the navigation mode, CP prevails over GS. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(if Navigation_Mode_From_CP = A |
|
|
|
|
|
|
|
or else not Navigation_Mode_From_GS_Received |
|
|
|
|
|
|
|
then Navigation_Mode_From_CP |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- If CP states the mode to RC then GS can choose the navigation mode. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else Navigation_Mode_From_GS) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
and then Operating_Mode = |
|
|
|
|
|
|
|
(if Navigation_Mode = A |
|
|
|
|
|
|
|
or else not Operating_Mode_From_GS_Received |
|
|
|
|
|
|
|
then Operating_Mode_From_CP |
|
|
|
|
|
|
|
else Operating_Mode_From_GS) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
and then |
|
|
|
|
|
|
|
(if Mission_Parameters_Defined then |
|
|
|
|
|
|
|
Navigation_Parameters = |
|
|
|
|
|
|
|
(if Navigation_Mode = A |
|
|
|
|
|
|
|
or else not Navigation_Parameters_From_GS_Received |
|
|
|
|
|
|
|
then Navigation_Parameters_From_USB_Key |
|
|
|
|
|
|
|
else Navigation_Parameters_From_GS)); |
|
|
|
|
|
|
|
|
|
|
|
procedure Operating_Point_Update_Management with |
|
|
|
procedure Operating_Point_Update_Management with |
|
|
|
-- Compute the value of Operating_Point |
|
|
|
-- Compute the value of Operating_Point |
|
|
|
|
|
|
|
|
|
|
|
Global => (In_Out => Private_State), |
|
|
|
Pre => |
|
|
|
Contract_Cases => |
|
|
|
Mission_Parameters_Defined |
|
|
|
(Navigation_Mode_From_CP = A |
|
|
|
and then Power_State = ON |
|
|
|
or else not Operating_Point_From_GS_Received |
|
|
|
and then On_State in INIT | RUNNING, |
|
|
|
=> |
|
|
|
|
|
|
|
Operating_Point = Operating_Point_From_USB_Key, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Navigation_Mode_From_CP = RP |
|
|
|
-- F_MM ensures freeze of the operating point once landing is activated. |
|
|
|
and then Operating_Point_From_GS_Received |
|
|
|
|
|
|
|
=> |
|
|
|
Post => |
|
|
|
(if Power_State = ON |
|
|
|
(if Power_State = ON |
|
|
|
and then On_State = RUNNING |
|
|
|
and then On_State = RUNNING |
|
|
|
and then Running_State = LANDING |
|
|
|
and then Running_State = LANDING |
|
|
|
then Operating_Point = Operating_Point'Old |
|
|
|
then Operating_Point = Operating_Point'Old |
|
|
|
else Operating_Point = Operating_Point_From_GS)); |
|
|
|
else Operating_Point = Operating_Point_From_Navigation_Parameters); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
------------------------------ |
|
|
|
|
|
|
|
-- Mission_Viability_Logic -- |
|
|
|
|
|
|
|
------------------------------ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Mission_Profile return Mission_Profile_Type with |
|
|
|
|
|
|
|
-- Assemble the mission profile |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Pre => Power_State = ON, |
|
|
|
|
|
|
|
-- and then Mission_Parameters_Defined |
|
|
|
|
|
|
|
-- and then Payload_Mass_Given, |
|
|
|
|
|
|
|
Post => Mission_Profile'Result = |
|
|
|
|
|
|
|
(Mass => Payload_Mass, |
|
|
|
|
|
|
|
Distance => Current_Range, |
|
|
|
|
|
|
|
Altitude => Current_Altitude, |
|
|
|
|
|
|
|
Speed => Current_Speed); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Appropriate_Tabulating_Function return Viability_Domain_Mesh_Type |
|
|
|
|
|
|
|
-- Select the tabulated function corresponding to the navigation mode |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then On_State in INIT | RUNNING, |
|
|
|
|
|
|
|
Post => Appropriate_Tabulating_Function'Result = |
|
|
|
|
|
|
|
(if On_State = INIT and then Navigation_Mode = A |
|
|
|
|
|
|
|
then Data.Amode_Initial_Domain_Mesh |
|
|
|
|
|
|
|
elsif On_State = INIT and then Navigation_Mode = RP |
|
|
|
|
|
|
|
then Data.RPmode_Initial_Domain_Mesh |
|
|
|
|
|
|
|
elsif Navigation_Mode = A |
|
|
|
|
|
|
|
then Data.Amode_Cruise_Domain_Mesh |
|
|
|
|
|
|
|
else Data.RPmode_Cruise_Domain_Mesh); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Distance_With_Neighbour |
|
|
|
|
|
|
|
(Neighbour : Mission_Profile_Type) return Mission_Profile_Distance_Type |
|
|
|
|
|
|
|
with |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then On_State in INIT | RUNNING; |
|
|
|
|
|
|
|
-- and then Mission_Parameters_Defined |
|
|
|
|
|
|
|
-- and then Payload_Mass_Given; |
|
|
|
|
|
|
|
-- Compute the distance between Mission_Profile and its Neighbour. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Nearest_Neighbours return Neighbour_Mission_Profile_Array_Type with |
|
|
|
|
|
|
|
-- Compute the nearest neighbous of Mission_Profile in |
|
|
|
|
|
|
|
-- Appropriate_Tabulating_Function, and the distance of Mission_Profile to |
|
|
|
|
|
|
|
-- its nearest neignbours. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then On_State in INIT | RUNNING, |
|
|
|
|
|
|
|
-- and then Mission_Parameters_Defined |
|
|
|
|
|
|
|
-- and then Payload_Mass_Given, |
|
|
|
|
|
|
|
Post => |
|
|
|
|
|
|
|
(for all Neighbour_Center of Nearest_Neighbours'Result => |
|
|
|
|
|
|
|
Neighbour_Center.Mission_Profile.M in |
|
|
|
|
|
|
|
MMS.F_PT.Data.Payload_Mass_Grid'Range |
|
|
|
|
|
|
|
and then Neighbour_Center.Mission_Profile.D in |
|
|
|
|
|
|
|
Appropriate_Tabulating_Function'Range (1) |
|
|
|
|
|
|
|
and then Neighbour_Center.Mission_Profile.A in |
|
|
|
|
|
|
|
Appropriate_Tabulating_Function'Range (2) |
|
|
|
|
|
|
|
and then Neighbour_Center.Mission_Profile.S in |
|
|
|
|
|
|
|
Appropriate_Tabulating_Function'Range (3) |
|
|
|
|
|
|
|
and then Neighbour_Center.Distance = |
|
|
|
|
|
|
|
Distance_With_Neighbour |
|
|
|
|
|
|
|
(Mission_Profile_Type' |
|
|
|
|
|
|
|
(Mass => |
|
|
|
|
|
|
|
MMS.F_PT.Data.Payload_Mass_Grid |
|
|
|
|
|
|
|
(Neighbour_Center.Mission_Profile.M), |
|
|
|
|
|
|
|
Distance => |
|
|
|
|
|
|
|
Appropriate_Tabulating_Function |
|
|
|
|
|
|
|
(Neighbour_Center.Mission_Profile.D, |
|
|
|
|
|
|
|
Neighbour_Center.Mission_Profile.A, |
|
|
|
|
|
|
|
Neighbour_Center.Mission_Profile.S).Distance, |
|
|
|
|
|
|
|
Altitude => |
|
|
|
|
|
|
|
Appropriate_Tabulating_Function |
|
|
|
|
|
|
|
(Neighbour_Center.Mission_Profile.D, |
|
|
|
|
|
|
|
Neighbour_Center.Mission_Profile.A, |
|
|
|
|
|
|
|
Neighbour_Center.Mission_Profile.S).Altitude, |
|
|
|
|
|
|
|
Speed => |
|
|
|
|
|
|
|
Appropriate_Tabulating_Function |
|
|
|
|
|
|
|
(Neighbour_Center.Mission_Profile.D, |
|
|
|
|
|
|
|
Neighbour_Center.Mission_Profile.A, |
|
|
|
|
|
|
|
Neighbour_Center.Mission_Profile.S).Speed))); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Extract_Energy_Level_For_Neighbour |
|
|
|
|
|
|
|
(Neighbour : Center_Mission_Profile_Type) return Energy_Level_Type |
|
|
|
|
|
|
|
-- Extract energy level for the neighbour. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with |
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then On_State in INIT | RUNNING, |
|
|
|
|
|
|
|
Post => Extract_Energy_Level_For_Neighbour'Result = |
|
|
|
|
|
|
|
(if On_State = INIT and then Navigation_Mode = A |
|
|
|
|
|
|
|
then Data.Viability_Amode_Initial (M => Neighbour.M, |
|
|
|
|
|
|
|
D => Neighbour.D, |
|
|
|
|
|
|
|
A => Neighbour.A, |
|
|
|
|
|
|
|
S => Neighbour.S) |
|
|
|
|
|
|
|
elsif On_State = INIT and then Navigation_Mode = RP |
|
|
|
|
|
|
|
then Data.Viability_RPmode_Initial (M => Neighbour.M, |
|
|
|
|
|
|
|
D => Neighbour.D, |
|
|
|
|
|
|
|
A => Neighbour.A, |
|
|
|
|
|
|
|
S => Neighbour.S) |
|
|
|
|
|
|
|
elsif Navigation_Mode = A |
|
|
|
|
|
|
|
then Data.Viability_Amode_Cruise (M => Neighbour.M, |
|
|
|
|
|
|
|
D => Neighbour.D, |
|
|
|
|
|
|
|
A => Neighbour.A, |
|
|
|
|
|
|
|
S => Neighbour.S) |
|
|
|
|
|
|
|
else Data.Viability_RPmode_Cruise (M => Neighbour.M, |
|
|
|
|
|
|
|
D => Neighbour.D, |
|
|
|
|
|
|
|
A => Neighbour.A, |
|
|
|
|
|
|
|
S => Neighbour.S)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
procedure Mission_Viability_Logic with |
|
|
|
|
|
|
|
-- Compute the value of Initial_Energy_Compatible_With_Mission and |
|
|
|
|
|
|
|
-- In_Flight_Energy_Compatible_With_Mission. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Pre => Power_State = ON |
|
|
|
|
|
|
|
and then On_State in INIT | RUNNING |
|
|
|
|
|
|
|
and then (if On_State = INIT |
|
|
|
|
|
|
|
then Mission_Parameters_Defined |
|
|
|
|
|
|
|
and then Payload_Mass_Given |
|
|
|
|
|
|
|
else Running_State = FLIGHT |
|
|
|
|
|
|
|
and then Current_Flight_Phase = CRUISE); |
|
|
|
|
|
|
|
|
|
|
|
end MMS.F_PT.F_MM.Behavior; |
|
|
|
end MMS.F_PT.F_MM.Behavior; |
|
|
|