//-----------------------------------------------------------------------------
// Include-файл для DLL-библиотеки lcard_ad.dll
// Определения макросов и констант
// ! При компиляции DLL необходимо определить символ LBIOS_DLL !
// (C)opyright AO L-Card 1995, 96
//-----------------------------------------------------------------------------
#ifndef __LC_DEFIN_H
#define __LC_DEFIN_H

// Определим набор атрибутов _EXPORT

// WIN32 definition for WATCOM C++
#if defined(__386__)
    #define WIN32
#endif

typedef struct
{
         DWORD Size;
         DWORD Offset;
         WORD  SegSel;
         WORD  BufferID;
         DWORD Physical;
} TDDS;
typedef TDDS *PTDDS;
typedef struct
{
  TDDS   DDS;
  int    DmaChannelNo;
  WORD * PLinear;
} TDmaChannel;
typedef TDmaChannel * PTDmaChannel;

#include "ord_fn.h"

#ifdef WIN32

  #include "vlcardd.h"
  #include "fastirq.h"

   // Компиляция под WIN32
    #ifdef LBIOS_DLL
        #define _EXPORT __stdcall
    #else
        #ifndef _EXPORT
            #ifdef __WATCOMC__
                #define _EXPORT __stdcall
            #endif
            #ifdef _MSC_VER
                #define _EXPORT __stdcall
            #endif
            #ifdef __BORLANDC__
                #define _EXPORT __stdcall _import
            #endif
        #endif
    #endif

    #ifndef HANDLER_TYPE
        #define HANDLER_TYPE void __stdcall
    #endif

    #ifndef HANDLER_PARM
        #define HANDLER_PARM HANDLE
    #endif

    #ifndef INT_HANDLER
        // Обработчик прерывания должен объявляться как HANDLER_TYPE f(HANDLER_PARM)
        typedef PTApcProc INT_HANDLER;
    #endif

    #ifndef TError
        #define TError __stdcall
    #endif

    #ifndef TErrorHandler
        typedef int (TError TErrorHandler)(DWORD Error, DWORD Info);
        typedef TErrorHandler* PTErrorHandler;
    #endif

#else

    // Компиляция под WIN16
    #ifdef LBIOS_DLL
        #define _EXPORT __pascal FAR __loadds
    #else
        #ifndef _EXPORT
            #define _EXPORT __pascal FAR
        #endif
    #endif

    #ifndef HANDLER_TYPE
        #define HANDLER_TYPE void __interrupt __far
    #endif

    #ifndef HANDLER_PARM
        #ifdef __cplusplus
            #define HANDLER_PARM void
        #else
            #define HANDLER_PARM ...
        #endif
    #endif

    #ifndef INT_HANDLER
        // Обработчик прерывания должен объявляться как HANDLER_TYPE f(HANDLER_PARM)
        // Определим тип PARM:
            #ifdef _MSC_VER
                typedef void (__interrupt __far* INT_HANDLER)(HANDLER_PARM);
            #else
                typedef HANDLER_TYPE (* INT_HANDLER)(HANDLER_PARM);
            #endif
    #endif

    #ifndef TError
        #define TError __far __pascal __loadds
    #endif

    #ifndef TErrorHandler
        typedef int (TError TErrorHandler)(DWORD Error, DWORD Info);
        typedef TErrorHandler * PTErrorHandler;
    #endif

#endif


//-----------------------------------------------------------------------------
// типы поддерживаемых данной библиотекой плат
//-----------------------------------------------------------------------------
#define NO_BOARD           0
#define L305               1
#define L1610              2
#define L1250              3
#define L154               4
#define L164               5
#define L1056              6
#define L1208              7
#define L264               8
#define E330               9
#define L1210             10
#define LCI01             11
#define CRAIT             12
#define L241              13
#define L1211             14

//-----------------------------------------------------------------------------
// Константы - типы интерфейсов для E330 и EPP крейт-контроллера
//-----------------------------------------------------------------------------
#define AUTODETECT_INTERFACE -1
#define EPP_INTERFACE         0
#define SERIAL_INTERFACE      1
#define BIDIR_INTERFACE       2
#define IDE_INTERFACE         3


//-----------------------------------------------------------------------------
// константы для определения режима dmm
// Тип ввода по DMA: однократный или с автоинициализацией
//-----------------------------------------------------------------------------
#define DMM_SINGLE   0
#define DMM_AUTOINIT 1

//-----------------------------------------------------------------------------
// Направление передачи по DMA: чтение или запись
//-----------------------------------------------------------------------------
#define DMM_READ     0
#define DMM_WRITE    2





//-----------------------------------------------------------------------------
// Определения, относящиеся к крейту LTC
// Тип ввода по DMA: однократный или с автоинициализацией
//-----------------------------------------------------------------------------
#define REG(Slot,NReg) (assert(NReg<15), 0x3000 + (NReg) + (Slot)*8 )
#define REG_(Slot,NReg) (0x3000 + NReg + Slot*8 )
#define REG0(Slot) (REG_(Slot,0))
#define REG1(Slot) (REG_(Slot,1))
#define REG2(Slot) (REG_(Slot,2))
#define REG3(Slot) (REG_(Slot,3))
#define REG4(Slot) (REG_(Slot,4))
#define REG5(Slot) (REG_(Slot,5))
#define REG6(Slot) (REG_(Slot,6))
#define REG7(Slot) (REG_(Slot,7))

/* Possible results for GET_STATUS                    */
//#define NO_ERROR              0
#define ERROR_SERIAL_TIMEOUT  1
#define ERROR_SERIAL_TIMEOUT2 2
#define ERROR_EPP_TIMEOUT     4
#define ERROR_FIFO_OVERFLOW   16
#define ERROR_USIL_202        64

#define ERROR_FIFO_OVERFLOW 16

#define CALIBR_ALL          0
#define DONT_CALIBR_ADC     1
#define DONT_CALIBR_SOURCE  2

#define DONT_CALIBR_LC351   4
#define DONT_CALIBR_LC302   8
#define DONT_CALIBR_LC102S  16
#define DONT_CALIBR_ALL     0xFFFF

#define MODULE_CC_227  227
#define MODULE_CC_451  451
#define MODULE_CC_351  351


#endif  // ifndef __LC_DEFIN

