-- FA13A00.A
--
--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 
--     unlimited rights in the software and documentation contained herein.
--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making 
--     this public release, the Government intends to confer upon all 
--     recipients unlimited rights  equal to those held by the Government.  
--     These rights include rights to use, duplicate, release or disclose the 
--     released technical data and computer software in whole or in part, in 
--     any manner and for any purpose whatsoever, and to have or permit others 
--     to do so.
--
--                                    DISCLAIMER
--
--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED 
--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE 
--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
--     PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- FOUNDATION DESCRIPTION:
--      This foundation code is used to check visibility of separate
--      subunit of child packages.
--      Declares a package containing type definitions; package will be
--      with'ed by the root of the elevator abstraction.
--
--      Declare an elevator abstraction in a parent root package which manages 
--      basic operations.  This package has a private part.  Declare a 
--      private child package which calculates the floors for going up or 
--      down.  Declare a public child package which provides the actual 
--      operations.  
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--
--!
-- Simulates a fragment of an elevator operation application.
package FA13A00_0 is                      -- Building Manager
   type Electrical_Power is (Off, V120, V240);
   Power : Electrical_Power := V120;
   -- other type definitions and procedure declarations in real application.
end FA13A00_0;
-- No bodies provided for FA13A00_0.
     --==================================================================--
package FA13A00_1 is                      -- Basic Elevator Operations
   type Call_Waiting_Type is private;
   type Floor is (Basement, Floor1, Floor2, Floor3, Penthouse);
   type Floor_No is range Floor'Pos(Floor'First) .. Floor'Pos(Floor'Last);
   Current_Floor : Floor   := Floor1;
   TC_Operation  : boolean := true;       
   procedure Call (F : in Floor; C : in out Call_Waiting_Type);
   procedure Clear_Calls (C : in out Call_Waiting_Type);
private
   type Call_Waiting_Type is array (Floor) of boolean;
   Call_Waiting : Call_Waiting_Type := (others => false);
end FA13A00_1;
     --==================================================================--
package body FA13A00_1 is              
   -- Call the elevator.
   procedure Call (F : in Floor; C : in out Call_Waiting_Type) is
   begin
      C (F) := true;
   end Call;
   --------------------------------------------
   -- Clear all calls of the elevator.
   procedure Clear_Calls (C : in out Call_Waiting_Type) is
   begin
      C := (others => false);
   end Clear_Calls;
end FA13A00_1;
     --==================================================================--
-- Private child package of an elevator application.  This package calculates
-- how many floors to go up or down.
private package FA13A00_1.FA13A00_2 is    -- Floor Calculation
   -- Other type definitions in real application.
   procedure Up (HowMany : in Floor_No);
                 
   procedure Down (HowMany : in Floor_No);
end FA13A00_1.FA13A00_2;
     --==================================================================--
package body FA13A00_1.FA13A00_2 is              
   -- Go up from the current floor.
   procedure Up (HowMany : in Floor_No) is
   begin
      Current_Floor := Floor'val (Floor'pos (Current_Floor) + HowMany);
   end Up;
   --------------------------------------------
   -- Go down from the current floor.
   procedure Down (HowMany : in Floor_No) is
   begin
      Current_Floor := Floor'val (Floor'pos (Current_Floor) - HowMany);
   end Down;
end FA13A00_1.FA13A00_2;
     --==================================================================--
-- Public child package of an elevator application.  This package provides
-- the actual operation of the elevator.
package FA13A00_1.FA13A00_3 is            -- Move Elevator  
   -- Other type definitions in real application.
   procedure Move_Elevator (F : in     Floor;
                            C : in out Call_Waiting_Type);
end FA13A00_1.FA13A00_3;
     --==================================================================--
with FA13A00_1.FA13A00_2;                 -- Floor Calculation
package body FA13A00_1.FA13A00_3 is              
   -- Going up or down depends on the current floor.
   procedure Move_Elevator (F : in     Floor;
                            C : in out Call_Waiting_Type) is
   begin
      if F > Current_Floor then
         FA13A00_1.FA13A00_2.Up (Floor'Pos (F) - Floor'Pos (Current_Floor));
         FA13A00_1.Call (F, C);
      elsif F < Current_Floor then
         FA13A00_1.FA13A00_2.Down (Floor'Pos (Current_Floor) - Floor'Pos (F));
         FA13A00_1.Call (F, C);
      end if;
   end Move_Elevator;
end FA13A00_1.FA13A00_3;