--
--  RTEMS / Body
--
--  DESCRIPTION:
--
--  This package provides the interface to the RTEMS API.
--
--
--  DEPENDENCIES:
--
--
--
--  COPYRIGHT (c) 1997-2008.
--  On-Line Applications Research Corporation (OAR).
--
--  The license and distribution terms for this file may in
--  the file LICENSE in this distribution or at
--  http://www.rtems.org/license/LICENSE.
--

package body RTEMS.Tasks is

   --
   --  Task Manager
   --

   procedure Create
     (Name             : in RTEMS.Name;
      Initial_Priority : in Priority;
      Stack_Size       : in RTEMS.Unsigned32;
      Initial_Modes    : in RTEMS.Mode;
      Attribute_Set    : in RTEMS.Attribute;
      ID               : out RTEMS.ID;
      Result           : out RTEMS.Status_Codes)
   is
      function Create_Base
        (Name             : RTEMS.Name;
         Initial_Priority : Priority;
         Stack_Size       : RTEMS.Unsigned32;
         Initial_Modes    : RTEMS.Mode;
         Attribute_Set    : RTEMS.Attribute;
         ID               : access RTEMS.ID)
         return             RTEMS.Status_Codes;
      pragma Import (C, Create_Base, "rtems_task_create");
      ID_Base : aliased RTEMS.ID;
   begin
      Result :=
         Create_Base
           (Name,
            Initial_Priority,
            Stack_Size,
            Initial_Modes,
            Attribute_Set,
            ID_Base'Access);
      ID     := ID_Base;
   end Create;

   procedure Ident
     (Name   : in RTEMS.Name;
      Node   : in RTEMS.Node;
      ID     : out RTEMS.ID;
      Result : out RTEMS.Status_Codes)
   is

      function Ident_Base
        (Name : RTEMS.Name;
         Node : RTEMS.Node;
         ID   : access RTEMS.ID)
         return RTEMS.Status_Codes;
      pragma Import (C, Ident_Base, "rtems_task_ident");
      ID_Base : aliased RTEMS.ID;

   begin

      Result := Ident_Base (Name, Node, ID_Base'Access);
      ID     := ID_Base;

   end Ident;

   procedure Start
     (ID          : in RTEMS.ID;
      Entry_Point : in RTEMS.Tasks.Entry_Point;
      Argument    : in RTEMS.Tasks.Argument;
      Result      : out RTEMS.Status_Codes)
   is
      function Start_Base
        (ID          : RTEMS.ID;
         Entry_Point : RTEMS.Tasks.Entry_Point;
         Argument    : RTEMS.Tasks.Argument)
         return        RTEMS.Status_Codes;
      pragma Import (C, Start_Base, "rtems_task_start");
   begin

      Result := Start_Base (ID, Entry_Point, Argument);

   end Start;

   procedure Restart
     (ID       : in RTEMS.ID;
      Argument : in RTEMS.Tasks.Argument;
      Result   : out RTEMS.Status_Codes)
   is
      function Restart_Base
        (ID       : RTEMS.ID;
         Argument : RTEMS.Tasks.Argument)
         return     RTEMS.Status_Codes;
      pragma Import (C, Restart_Base, "rtems_task_restart");
   begin

      Result := Restart_Base (ID, Argument);

   end Restart;

   procedure Delete
     (ID     : in RTEMS.ID;
      Result : out RTEMS.Status_Codes)
   is
      function Delete_Base (ID : RTEMS.ID) return RTEMS.Status_Codes;
      pragma Import (C, Delete_Base, "rtems_task_delete");
   begin

      Result := Delete_Base (ID);

   end Delete;

   procedure Suspend
     (ID     : in RTEMS.ID;
      Result : out RTEMS.Status_Codes)
   is
      function Suspend_Base (ID : RTEMS.ID) return RTEMS.Status_Codes;
      pragma Import (C, Suspend_Base, "rtems_task_suspend");
   begin

      Result := Suspend_Base (ID);

   end Suspend;

   procedure Resume
     (ID     : in RTEMS.ID;
      Result : out RTEMS.Status_Codes)
   is
      function Resume_Base (ID : RTEMS.ID) return RTEMS.Status_Codes;
      pragma Import (C, Resume_Base, "rtems_task_resume");
   begin

      Result := Resume_Base (ID);

   end Resume;

   procedure Is_Suspended
     (ID     : in RTEMS.ID;
      Result : out RTEMS.Status_Codes)
   is
      function Is_Suspended_Base
        (ID   : RTEMS.ID)
         return RTEMS.Status_Codes;
      pragma Import (C, Is_Suspended_Base, "rtems_task_is_suspended");
   begin

      Result := Is_Suspended_Base (ID);

   end Is_Suspended;

   procedure Set_Priority
     (ID           : in RTEMS.ID;
      New_Priority : in Priority;
      Old_Priority : out Priority;
      Result       : out RTEMS.Status_Codes)
   is
      function Set_Priority_Base
        (ID           : RTEMS.ID;
         New_Priority : Priority;
         Old_Priority : access Priority)
         return         RTEMS.Status_Codes;
      pragma Import (C, Set_Priority_Base, "rtems_task_set_priority");
      Old_Priority_Base : aliased Priority;
   begin

      Result       :=
         Set_Priority_Base (ID, New_Priority, Old_Priority_Base'Access);
      Old_Priority := Old_Priority_Base;

   end Set_Priority;

   procedure Mode
     (Mode_Set          : in RTEMS.Mode;
      Mask              : in RTEMS.Mode;
      Previous_Mode_Set : out RTEMS.Mode;
      Result            : out RTEMS.Status_Codes)
   is
      function Mode_Base
        (Mode_Set          : RTEMS.Mode;
         Mask              : RTEMS.Mode;
         Previous_Mode_Set : access RTEMS.Mode)
         return              RTEMS.Status_Codes;
      pragma Import (C, Mode_Base, "rtems_task_mode");
      Previous_Mode_Set_Base : aliased RTEMS.Mode;
   begin

      Result            :=
         Mode_Base (Mode_Set, Mask, Previous_Mode_Set_Base'Access);
      Previous_Mode_Set := Previous_Mode_Set_Base;

   end Mode;

   procedure Wake_When
     (Time_Buffer : in RTEMS.Time_Of_Day;
      Result      : out RTEMS.Status_Codes)
   is
      function Wake_When_Base
        (Time_Buffer : RTEMS.Time_Of_Day)
         return        RTEMS.Status_Codes;
      pragma Import (C, Wake_When_Base, "rtems_task_wake_when");
   begin

      Result := Wake_When_Base (Time_Buffer);

   end Wake_When;

   procedure Wake_After
     (Ticks  : in RTEMS.Interval;
      Result : out RTEMS.Status_Codes)
   is
      function Wake_After_Base
        (Ticks : RTEMS.Interval)
         return  RTEMS.Status_Codes;
      pragma Import (C, Wake_After_Base, "rtems_task_wake_after");
   begin

      Result := Wake_After_Base (Ticks);

   end Wake_After;

end RTEMS.Tasks;
