------------------------------------------------------------------------------
--                                                                          --
--                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
--                                                                          --
--                     S Y S T E M . T R A C E S . S E N D                  --
--                                                                          --
--                                  B o d y                                 --
--                                                                          --
--           Copyright (C) 2001-2016, Free Software Foundation, 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 3,  or (at your option) any later ver- --
-- sion.  GNAT 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.                                     --
--                                                                          --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception,   --
-- version 3.1, as published by the Free Software Foundation.               --
--                                                                          --
-- You should have received a copy of the GNU General Public License and    --
-- a copy of the GCC Runtime Library Exception along with this program;     --
-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
-- <http://www.gnu.org/licenses/>.                                          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

--  This version is for VxWorks targets

--  Trace information is sent to WindView using the wvEvent function

--  Note that wvEvent is from the VxWorks API

--  When adding a new event, just give an Id to then event, and then modify
--  the WindView events database.

--  Refer to WindView User's Guide for more details on how to add new events
--  to the events database.

----------------
-- Send_Trace --
----------------

--  This procedure formats the string, maps the event Id to an Id
--  recognized by WindView, and send the event using wvEvent

separate (System.Traces.Format)
procedure Send_Trace (Id : Trace_T; Info : String) is

   procedure Wv_Event
     (Id : Integer;
      Buffer : System.Address;
      Size : Integer);
   pragma Import (C, Wv_Event, "wvEvent");

   Info_Trace : String_Trace;
   Id_Event   : Integer;

begin
   Info_Trace := Format_Trace (Info);

   case Id is
      when M_Accept_Complete => Id_Event := 30000;
      when M_Select_Else     => Id_Event := 30001;
      when M_RDV_Complete    => Id_Event := 30002;
      when M_Call_Complete   => Id_Event := 30003;
      when M_Delay           => Id_Event := 30004;
      when E_Kill            => Id_Event := 30005;
      when E_Missed          => Id_Event := 30006;
      when E_Timeout         => Id_Event := 30007;

      when W_Call            => Id_Event := 30010;
      when W_Accept          => Id_Event := 30011;
      when W_Select          => Id_Event := 30012;
      when W_Completion      => Id_Event := 30013;
      when W_Delay           => Id_Event := 30014;
      when WT_Select         => Id_Event := 30015;
      when WT_Call           => Id_Event := 30016;
      when WT_Completion     => Id_Event := 30017;
      when WU_Delay          => Id_Event := 30018;

      when PO_Call           => Id_Event := 30020;
      when POT_Call          => Id_Event := 30021;
      when PO_Run            => Id_Event := 30022;
      when PO_Lock           => Id_Event := 30023;
      when PO_Unlock         => Id_Event := 30024;
      when PO_Done           => Id_Event := 30025;

      when T_Create          => Id_Event := 30030;
      when T_Activate        => Id_Event := 30031;
      when T_Abort           => Id_Event := 30032;
      when T_Terminate       => Id_Event := 30033;

      --  Unrecognized events are given the special Id_Event value 29999

      when others            => Id_Event := 29999;
   end case;

   Wv_Event (Id_Event, Info_Trace'Address, Max_Size);
end Send_Trace;
