-- C3900010.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.
--*
--
-- OBJECTIVE:
--      See C3900011.AM.
--
-- TEST DESCRIPTION:
--      See C3900011.AM.
--
-- TEST FILES:
--      This test consists of the following files:
--
--      => C3900010.A
--         C3900011.AM
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      15 May 96   SAIC    ACVC 2.1: Modified prologue. Added pragma Elaborate
--                          for Ada.Calendar.
--
--!

with Ada.Calendar;
pragma Elaborate (Ada.Calendar);

package C3900010 is


   -- Declarations used by component Display_On and procedure Display.

   type Device_Enum      is (Null_Device, Teletype, Console, Big_Screen);
   type Display_Counters is array (Device_Enum) of Natural;

   Display_Count_For : Display_Counters := (others => 0);


   -- Declarations required for component Arrival_Time.

   Default_Time : constant Ada.Calendar.Time :=
                    Ada.Calendar.Time_Of (1901, 1, 1);
   Alert_Time   : constant Ada.Calendar.Time :=
                    Ada.Calendar.Time_Of (1991, 6, 15);


   type Alert_Type is tagged record                    -- Root tagged type.
      Arrival_Time : Ada.Calendar.Time := Default_Time;
      Display_On   : Device_Enum       := Null_Device;
   end record;


   procedure Display (A : in Alert_Type);             -- To be inherited by
                                                      -- all derivatives.

   procedure Handle (A : in out Alert_Type);          -- To be inherited by
                                                      -- all derivatives.



   type Low_Alert_Type is new Alert_Type with record  -- Record extension of
      Level : Integer := 0;                           -- root tagged type.
   end record;

   -- Inherits procedure Display from Alert.
   -- Inherits procedure Handle  from Alert.

   function Level_Of (LA : in Low_Alert_Type)         -- To be inherited by
     return Integer;                                  -- all derivatives.



   -- Declarations required for component Action_Officer;

   type Person_Enum is (Nobody,          Duty_Officer,
                        Watch_Commander, Commanding_Officer);



   type Medium_Alert_Type is new Low_Alert_Type with record
      Action_Officer : Person_Enum := Nobody;         -- Record extension of
   end record;                                        -- record extension.

   -- Inherits (inherited) procedure Display from Low_Alert_Type.
   -- Inherits (inherited) procedure Handle  from Low_Alert_Type.

   -- Inherits function Level_Of from Low_Alert_Type.

   procedure Assign_Officer (MA : in out Medium_Alert_Type;
                             To : in     Person_Enum);


end C3900010;


     --==================================================================--


package body C3900010 is


   procedure Display (A : in Alert_Type) is
   begin
      Display_Count_For (A.Display_On) := Display_Count_For (A.Display_On) + 1;
   end Display;


   procedure Handle (A : in out Alert_Type) is
   begin
      A.Arrival_Time := Alert_Time;
   end Handle;


   function Level_Of (LA : in Low_Alert_Type) return Integer is
   begin
      return (LA.Level + 1);
   end Level_Of;


   procedure Assign_Officer (MA : in out Medium_Alert_Type;
                             To : in     Person_Enum) is
   begin
      MA.Action_Officer := To;
   end Assign_Officer;


end C3900010;
