File : atomic_action.adb


with Ada.Text_IO;           use Ada.Text_IO;

with Ada.Real_Time;         use Ada.Real_Time;

with Atomic_Action_Types;   use Atomic_Action_Types;
with Generic_Atomic_Action;

package body Atomic_Action is

   No_Of_Tasks : constant Positive := 3;

   subtype Tasks_Index is Positive range 1..No_Of_Tasks;

   ------------------------
   -- Actions Parts
   ------------------------

   procedure Action_Task_1 is

   begin
      Put_Line ("First_Action_Part: begin");
--      raise Constraint_error;
      delay (1.0);
--      raise Constraint_error;
      Put_Line ("First_Action_Part: end");
   end Action_Task_1;

   procedure Action_Task_2 is

   begin
      Put_Line ("Second_Action_Part: begin");
--      raise Constraint_error;
      delay 2.0;
--      raise Constraint_error;
      Put_Line ("Second_Action_Part: end");
   end Action_Task_2;

   procedure Action_Task_3 is

   begin
      Put_Line ("Third_Action_Part: begin");
--      raise Constraint_error;
      delay 3.0;
--      raise Constraint_error;
      Put_Line ("Third_Action_Part: end");
   end Action_Task_3;

   ------------------------
   -- Cleanup Parts
   ------------------------

   procedure Cleanup_Task_1 is

   begin
      Put_Line ("First_One_Cleanup");
   end Cleanup_Task_1;

   procedure Cleanup_Task_2 is

   begin
      Put_Line ("Second_One_Cleanup");
   end Cleanup_Task_2;

   procedure Cleanup_Task_3 is

   begin
      Put_Line ("Third_One_Cleanup");
   end Cleanup_Task_3;

   ------------------------
   -- Set up configuration
   ------------------------

   Actions : Action_Parts (Tasks_Index) :=
     (1 => (Action  => Action_Task_1'Access,
            Cleanup => Cleanup_Task_1'Access,
            Scope   => (Start_Delay_Min => Milliseconds (33),
                        Start_Delay_Max => Milliseconds (133),
                        Max_Elapse      => Milliseconds (2000),
                        Deadline        => Time_Last)
           ),
      2 => (Action  => Action_Task_2'Access,
            Cleanup => Cleanup_Task_2'Access,
            Scope   => (Start_Delay_Min => Milliseconds (22),
                        Start_Delay_Max => Milliseconds (122),
                        Max_Elapse      => Milliseconds (3000),
                        Deadline        => Time_Last)
           ),
      3 => (Action  => Action_Task_3'Access,
            Cleanup => Cleanup_Task_3'Access,
            Scope   => (Start_Delay_Min => Milliseconds (11),
                        Start_Delay_Max => Milliseconds (111),
                        Max_Elapse      => Milliseconds (4000),
                        Deadline        => Time_Last)
           ));

   package Atomic_Action is new Generic_Atomic_Action (Actions);
   use Atomic_Action;

   -------------------------------
   -- Perform the atomic action
   -------------------------------

   procedure Perform is

   begin
      Atomic_Action.Perform;

   exception
      when Failure_State =>
         Put_Line ("Failure in Atomic_Action");
         raise Atomic_Action_Failure;
      when Time_Out_State =>
         Put_Line ("Time_Out in Atomic_Action");
         raise Atomic_Action_Time_Out;
      when Late_Activation_State =>
         Put_Line ("Late_Activation in Atomic_Action");
         raise Atomic_Action_Late_Activation;
   end Perform;

end Atomic_Action;