------------------------------------------------------------------------------
--                                                                          --
--                 GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS              --
--                                                                          --
--                      I N T E R F A C E S . V X W O R K S                 --
--                                                                          --
--                                   S p e c                                --
--                                                                          --
--                               $Revision: 1.1 $
--                                                                          --
--               Copyright (C) 1999 Ada Core Technologies, Inc.             --
--                                                                          --
-- GNARL is free software; you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
-- sion. GNARL is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
-- Public License  distributed with GNARL; see file COPYING.  If not, write --
-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
-- MA 02111-1307, USA.                                                      --
--                                                                          --
-- As a special exception,  if other files  instantiate  generics from this --
-- unit, or you link  this unit with other files  to produce an executable, --
-- this  unit  does not  by itself cause  the resulting  executable  to  be --
-- covered  by the  GNU  General  Public  License.  This exception does not --
-- however invalidate  any other reasons why  the executable file  might be --
-- covered by the  GNU Public License.                                      --
--                                                                          --
-- GNARL was developed by the GNARL team at Florida State University. It is --
-- now maintained by Ada Core Technologies Inc. in cooperation with Florida --
-- State University (http://www.gnat.com).                                  --
--                                                                          --
------------------------------------------------------------------------------

--  This package provides a limited binding to the VxWorks API
--  In particular, it interfaces with the VxWorks hardware interrupt facilities
--  For a complete documentation on these operations, please consult your
--  VxWorks Reference Manual.

with Interfaces.C;
with System;

package Interfaces.VxWorks is
   pragma Preelaborate (VxWorks);

   ------------------------------------------------------------------------
   --  Here is a complete example that shows how to handle the Interrupt 18
   --  in Ada using this package:

   --  with Interfaces.VxWorks; use Interfaces.VxWorks;
   --  with System;
   --
   --  package P is
   --
   --     Count : Integer;
   --     pragma Atomic (Count);
   --
   --     Level : constant := 1;
   --     --  Interrupt level used by this example
   --
   --     procedure Handler (parameter : System.Address);
   --
   --  end P;
   --
   --  package body P is
   --
   --     procedure Handler (parameter : System.Address) is
   --        S : STATUS;
   --     begin
   --        Count := Count + 1;
   --        logMsg ("received an interrupt" & ASCII.LF & ASCII.Nul);
   --        S := sysBusIntAck (intLevel => Level);
   --     end Handler;
   --  end P;
   --
   --  with Interfaces.VxWorks; use Interfaces.VxWorks;
   --  with Ada.Text_IO; use Ada.Text_IO;
   --
   --  with P; use P;
   --  procedure Useint is
   --     Interrupt : constant := 18;
   --
   --     task T;
   --
   --     S : STATUS;
   --
   --     task body T is
   --     begin
   --        loop
   --           Put_Line ("Generating an interrupt...");
   --           delay 1.0;
   --           S := sysBusIntGen (1, INUM_TO_IVEC (Interrupt));
   --        end loop;
   --     end T;
   --
   --  begin
   --     S := sysIntEnable (intLevel => Level);
   --     S := intConnect (INUM_TO_IVEC (Interrupt), handler'Access);
   --
   --     loop
   --        delay 2.0;
   --        Put_Line ("value of count:" & P.Count'Img);
   --     end loop;
   --  end Useint;
   -------------------------------------

   package IC renames Interfaces.C;

   subtype int is IC.int;

   type STATUS is new int;
   --  Equivalent of the C type STATUS

   OK    : constant STATUS := 0;
   ERROR : constant STATUS := -1;

   type VOIDFUNCPTR is access procedure (parameter : System.Address);
   type Interrupt_Vector is new System.Address;
   type Exception_Vector is new System.Address;

   function intConnect
     (vector    : Interrupt_Vector;
      handler   : VOIDFUNCPTR;
      parameter : System.Address := System.Null_Address) return STATUS;
   --  Binding to the C routine intConnect.

   function INUM_TO_IVEC (intNum : int) return Interrupt_Vector;
   --  Equivalent to the C macro INUM_TO_IVEC used to convert an interrupt
   --  number to an interrupt vector

   function sysIntEnable (intLevel : int) return STATUS;
   --  Binding to the C routine sysIntEnable

   function sysIntDisable (intLevel : int) return STATUS;
   --  Binding to the C routine sysIntDisable

   function sysBusIntAck (intLevel : int) return STATUS;
   --  Binding to the C routine sysBusIntAck

   function sysBusIntGen (intLevel : int; vector : Interrupt_Vector)
     return STATUS;
   --  Binding to the C routine sysBusIntGen

   procedure logMsg
     (fmt : String; arg1, arg2, arg3, arg4, arg5, arg6 : int := 0);
   --  Binding to the C routine logMsg. Note that it is the caller
   --  responsibility to ensure that fmt is a null terminated string
   --  (e.g logMsg ("Interrupt" & ASCII.Nul))

private
   pragma Import (C, intConnect, "intConnect");
   pragma Import (C, INUM_TO_IVEC, "__gnat_inum_to_ivec");
   pragma Import (C, sysIntEnable, "sysIntEnable");
   pragma Import (C, sysIntDisable, "sysIntDisable");
   pragma Import (C, sysBusIntAck, "sysBusIntAck");
   pragma Import (C, sysBusIntGen, "sysBusIntGen");
   pragma Import (C, logMsg, "logMsg");
end Interfaces.VxWorks;
