/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
*     National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
*     Operator of Los Alamos National Laboratory.
* SPDX-License-Identifier: EPICS
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
 *
 *                    L O S  A L A M O S
 *              Los Alamos National Laboratory
 *               Los Alamos, New Mexico 87545
 *
 *  Copyright, 1986, The Regents of the University of California.
 *
 *  Author: Jeffrey O. Hill
 *
 */


#ifndef INC_caerr_H
#define INC_caerr_H

#include "epicsTypes.h"

#include "libCaAPI.h"

/*  CA Status Code Definitions   */

#define CA_K_INFO       3   /* successful */
#define CA_K_ERROR      2   /* failed- continue */
#define CA_K_SUCCESS    1   /* successful */
#define CA_K_WARNING    0   /* unsuccessful */
#define CA_K_SEVERE     4   /* failed- quit */
#define CA_K_FATAL  CA_K_ERROR | CA_K_SEVERE

#define CA_M_MSG_NO     0x0000FFF8
#define CA_M_SEVERITY   0x00000007
#define CA_M_LEVEL      0x00000003
#define CA_M_SUCCESS    0x00000001
#define CA_M_ERROR      0x00000002
#define CA_M_SEVERE     0x00000004

#define CA_S_MSG_NO     0x0D
#define CA_S_SEVERITY   0x03

#define CA_V_MSG_NO     0x03
#define CA_V_SEVERITY   0x00
#define CA_V_SUCCESS    0x00

/* Define MACROS to extract/insert individual fields from a status value */

#define CA_EXTRACT_MSG_NO(code)\
( ( (code) & CA_M_MSG_NO )  >> CA_V_MSG_NO )
#define CA_EXTRACT_SEVERITY(code)\
( ( (code) & CA_M_SEVERITY )    >> CA_V_SEVERITY )
#define CA_EXTRACT_SUCCESS(code)\
( ( (code) & CA_M_SUCCESS )     >> CA_V_SUCCESS )

#define CA_INSERT_MSG_NO(code)\
(   ((code)<< CA_V_MSG_NO)  & CA_M_MSG_NO   )
#define CA_INSERT_SEVERITY(code)\
(   ((code)<< CA_V_SEVERITY)& CA_M_SEVERITY )
#define CA_INSERT_SUCCESS(code)\
(   ((code)<< CA_V_SUCCESS) & CA_M_SUCCESS  )

#define DEFMSG(SEVERITY,NUMBER)\
(CA_INSERT_MSG_NO(NUMBER) | CA_INSERT_SEVERITY(SEVERITY))

/*
 * In the lines below "defunct" indicates that current release
 * servers and client library will not return this error code, but
 * servers on earlier releases that communicate with current clients
 * might still generate exceptions with these error constants
 */
#define ECA_NORMAL          DEFMSG(CA_K_SUCCESS,    0) /* success */
#define ECA_MAXIOC          DEFMSG(CA_K_ERROR,      1) /* defunct */
#define ECA_UKNHOST         DEFMSG(CA_K_ERROR,      2) /* defunct */
#define ECA_UKNSERV         DEFMSG(CA_K_ERROR,      3) /* defunct */
#define ECA_SOCK            DEFMSG(CA_K_ERROR,      4) /* defunct */
#define ECA_CONN            DEFMSG(CA_K_WARNING,    5) /* defunct */
#define ECA_ALLOCMEM        DEFMSG(CA_K_WARNING,    6)
#define ECA_UKNCHAN         DEFMSG(CA_K_WARNING,    7) /* defunct */
#define ECA_UKNFIELD        DEFMSG(CA_K_WARNING,    8) /* defunct */
#define ECA_TOLARGE         DEFMSG(CA_K_WARNING,    9)
#define ECA_TIMEOUT         DEFMSG(CA_K_WARNING,   10)
#define ECA_NOSUPPORT       DEFMSG(CA_K_WARNING,   11) /* defunct */
#define ECA_STRTOBIG        DEFMSG(CA_K_WARNING,   12) /* defunct */
#define ECA_DISCONNCHID     DEFMSG(CA_K_ERROR,     13) /* defunct */
#define ECA_BADTYPE         DEFMSG(CA_K_ERROR,     14)
#define ECA_CHIDNOTFND      DEFMSG(CA_K_INFO,      15) /* defunct */
#define ECA_CHIDRETRY       DEFMSG(CA_K_INFO,      16) /* defunct */
#define ECA_INTERNAL        DEFMSG(CA_K_FATAL,     17)
#define ECA_DBLCLFAIL       DEFMSG(CA_K_WARNING,   18) /* defunct */
#define ECA_GETFAIL         DEFMSG(CA_K_WARNING,   19)
#define ECA_PUTFAIL         DEFMSG(CA_K_WARNING,   20)
#define ECA_ADDFAIL         DEFMSG(CA_K_WARNING,   21) /* defunct */
#define ECA_BADCOUNT        DEFMSG(CA_K_WARNING,   22)
#define ECA_BADSTR          DEFMSG(CA_K_ERROR,     23)
#define ECA_DISCONN         DEFMSG(CA_K_WARNING,   24)
#define ECA_DBLCHNL         DEFMSG(CA_K_WARNING,   25)
#define ECA_EVDISALLOW      DEFMSG(CA_K_ERROR,     26)
#define ECA_BUILDGET        DEFMSG(CA_K_WARNING,   27) /* defunct */
#define ECA_NEEDSFP         DEFMSG(CA_K_WARNING,   28) /* defunct */
#define ECA_OVEVFAIL        DEFMSG(CA_K_WARNING,   29) /* defunct */
#define ECA_BADMONID        DEFMSG(CA_K_ERROR,     30)
#define ECA_NEWADDR         DEFMSG(CA_K_WARNING,   31) /* defunct */
#define ECA_NEWCONN         DEFMSG(CA_K_INFO,      32) /* defunct */
#define ECA_NOCACTX         DEFMSG(CA_K_WARNING,   33) /* defunct */
#define ECA_DEFUNCT         DEFMSG(CA_K_FATAL,     34) /* defunct */
#define ECA_EMPTYSTR        DEFMSG(CA_K_WARNING,   35) /* defunct */
#define ECA_NOREPEATER      DEFMSG(CA_K_WARNING,   36) /* defunct */
#define ECA_NOCHANMSG       DEFMSG(CA_K_WARNING,   37) /* defunct */
#define ECA_DLCKREST        DEFMSG(CA_K_WARNING,   38) /* defunct */
#define ECA_SERVBEHIND      DEFMSG(CA_K_WARNING,   39) /* defunct */
#define ECA_NOCAST          DEFMSG(CA_K_WARNING,   40) /* defunct */
#define ECA_BADMASK         DEFMSG(CA_K_ERROR,     41)
#define ECA_IODONE          DEFMSG(CA_K_INFO,      42)
#define ECA_IOINPROGRESS    DEFMSG(CA_K_INFO,      43)
#define ECA_BADSYNCGRP      DEFMSG(CA_K_ERROR,     44)
#define ECA_PUTCBINPROG     DEFMSG(CA_K_ERROR,     45)
#define ECA_NORDACCESS      DEFMSG(CA_K_WARNING,   46)
#define ECA_NOWTACCESS      DEFMSG(CA_K_WARNING,   47)
#define ECA_ANACHRONISM     DEFMSG(CA_K_ERROR,     48)
#define ECA_NOSEARCHADDR    DEFMSG(CA_K_WARNING,   49)
#define ECA_NOCONVERT       DEFMSG(CA_K_WARNING,   50)
#define ECA_BADCHID         DEFMSG(CA_K_ERROR,     51)
#define ECA_BADFUNCPTR      DEFMSG(CA_K_ERROR,     52)
#define ECA_ISATTACHED      DEFMSG(CA_K_WARNING,   53)
#define ECA_UNAVAILINSERV   DEFMSG(CA_K_WARNING,   54)
#define ECA_CHANDESTROY     DEFMSG(CA_K_WARNING,   55)
#define ECA_BADPRIORITY     DEFMSG(CA_K_ERROR,     56)
#define ECA_NOTTHREADED     DEFMSG(CA_K_ERROR,     57)
#define ECA_16KARRAYCLIENT  DEFMSG(CA_K_WARNING,   58)
#define ECA_CONNSEQTMO      DEFMSG(CA_K_WARNING,   59)
#define ECA_UNRESPTMO       DEFMSG(CA_K_WARNING,   60)

#ifdef __cplusplus
extern "C" {
#endif

LIBCA_API const char * epicsStdCall ca_message(long ca_status);

LIBCA_API extern const char * ca_message_text [];

#ifdef __cplusplus
}
#endif

#endif
