#ifndef rtlibsrc_h
#define rtlibsrc_h

/* Copyright 1994-2000 The MathWorks, Inc.
 *
 * File    : rtlibsrc.h
 * Abstract:
 *      Function prototypes for .c sources in rtw/c/libsrc.
 *
 */

/* $Revision: 1.25 $ */

/*==========*
 * Includes *
 *==========*/

#include "tmwtypes.h"
#ifdef ERT
# include "simstruc_types.h"
#else
# include "simstruc.h"
#endif

#if defined(INTEGER_CODE)
# if INTEGER_CODE == 0
#  undef INTEGER_CODE
# endif
#endif

/*==========================*
 * Visible/extern functions *
 *==========================*/

#if !defined(INTEGER_CODE)

typedef enum {
  NORMAL_INTERP,
  AVERAGE_VALUE,
  MIDDLE_VALUE
} ZeroTechnique;

typedef struct SplineWorkVect_tag {
    const void  *uLambdas;
    const void  *uVect;
    const void  *yyA;
    const void  *yyB;
    const void  *yy2;
    const void  *up;
    const void  *y2;
    const int_T *Indices;
    const int_T *numYWorkElements;
    const int_T *maxIdx;
    const uint_T *bpIndices;
    const void  *bpData;
    const void  *tableData;
    int_T        extrapMethod;
} SplineWorkVect;

extern real_T rt_atan2(real_T a, real_T b);
extern real_T rt_hypot(real_T a, real_T b);
extern real_T rt_sgn(real_T x);
extern int_T  rt_GetLookupIndex(const real_T *x, int_T xlen, real_T u);
extern real_T rt_Lookup(const real_T *x, int_T xlen, real_T u, const real_T *y);
extern real_T rt_Lookup2D_General (const real_T *rowVals, const int_T numRowVals,
                                   const real_T *colVals, const int_T numColVals,
                                   const real_T *outputValues,
                                   const real_T uX, const real_T uY,
                                   const int_T colZeroIdx,
                                   const ZeroTechnique colZeroTechnique,
                                   const real_T *outputAtRowZero);
extern real_T rt_Lookup2D_Normal (const real_T *xVals, const int_T numX,
                                  const real_T *yVals, const int_T numY,
                                  const real_T *zVals,
                                  const real_T x, const real_T y);
extern real_T rt_LookupLinearInterpND_real_T(int_T         dim, 
                                             int_T         offset,
                                             const int_T  *bpIndex,
                                             const real_T *bpLambda,
                                             const int_T  *dimSizes,
                                             const real_T *tableData);
extern real32_T rt_LookupLinearInterpND_real32_T(int_T           dim, 
                                                 int_T           offset,
                                                 const int_T    *bpIndex,
                                                 const real32_T *bpLambda,
                                                 const int_T    *dimSizes,
                                                 const real32_T *tableData);
extern real_T rt_LookupSplineInterpND_real_T(int_T numDims,
                                             const SplineWorkVect *splWork);
extern real32_T rt_LookupSplineInterpND_real32_T(int_T numDims,
                                                 const SplineWorkVect *splWork);
extern real_T rt_Urand(uint_T *seed);
extern real_T rt_NormalRand(uint_T *seed);

extern ZCEventType rt_ZCFcn(ZCDirection direction,
                            ZCSigState *prevSigState, 
                            real_T      zcSig);

/*=========*
 * Defines *
 *=========*/

# define MAXSEED  2147483646   /* 2^31-2 */
# define SEED0    1144108930   /* Seed #6, starting from seed = 1 */
# define BIT16         32768   /* 2^15   */

# define rt_SET_RZC_SIGSTATE(sig) ( ((sig) < 0.0) ? NEG_ZCSIG : \
                                  ((sig) > 0.0 ? POS_ZCSIG : ZERO_ZCSIG) )

#define RT_PI          3.14159265358979323846
#define RT_LN_10       2.30258509299404568402
#define RT_LOG10E      0.43429448190325182765
#define RT_E           2.7182818284590452354

#define INTERP(x,x1,x2,y1,y2) ( y1+((y2 - y1)/(x2 - x1))*(x-x1) )
#endif

#define rt_SET_BZC_SIGSTATE(sig) ((sig)? POS_ZCSIG : ZERO_ZCSIG)

extern EnableStates rt_EnableState(boolean_T enableTest, int_T prevEnableState);

extern int8_T   SaturateProduct_int8_T   (int8_T   a, int8_T b);
extern int16_T  SaturateProduct_int16_T  (int16_T  a, int16_T b);
extern int32_T  SaturateProduct_int32_T  (int32_T  a, int32_T b);
extern uint8_T  SaturateProduct_uint8_T  (uint8_T  a, uint8_T b);
extern uint16_T SaturateProduct_uint16_T (uint16_T a, uint16_T b);
extern uint32_T SaturateProduct_uint32_T (uint32_T a, uint32_T b);
extern int8_T   SaturateDivide_int8_T    (int8_T   a, int8_T b);
extern int16_T  SaturateDivide_int16_T   (int16_T  a, int16_T b);
extern int32_T  SaturateDivide_int32_T   (int32_T  a, int32_T b);
extern uint8_T  SaturateDivide_uint8_T   (uint8_T  a, uint8_T b);
extern uint16_T SaturateDivide_uint16_T  (uint16_T a, uint16_T b);
extern uint32_T SaturateDivide_uint32_T  (uint32_T a, uint32_T b);

#if !defined(ERT)
extern int_T rt_CallSys(SimStruct *S, int_T element, int_T tid);
#endif

#endif /* rtlibsrc_h */
