/*
 * Copyright (c) GPC mbH, Lengenfeld, Germany
 * Author: Andrae Behrens
 * first edit: 08/15/2006
 * last change: 01/10/2010
 *
 * pbmsapi.h:
 * - declarations for an API to a ProfiBus
 *   MultiSlave card SST-PBMS-PCI
 * - intention: source compatibility
 *   with software API delivered with the card
 *
 */

#ifndef __PBMSAPI_H_
#define __PBMSAPI_H_

/*
  details come from SST-PBMS-PCI_User_Manual_01_0.pdf with
  "(c) 2003 SST, A Devision of Woodhead Canada Limited" and
  Pbmman32.pdf, "Copyright (c) 1998 SST, a devision of Woodhead Canada Limited"
  and its header files and header file pbmctl.h rev: 1.0 date: 04/21/2001 with
  "Copyright (c) 1997-2001 SST a division of Woodhead Canada Limited"
*/

#define PBM_NO_ERROR                       0x00000000

// general error codes
#define PBM_GENERAL_ERROR                  0x20000000

// PBM_LoadDriver
#define PBM_DRIVER_LOADED                  0x20000000
#define PBM_DRIVER_NOT_FOUND               0x20000001
#define PBM_INVALID_DRIVER                 0x20000002
#define PBM_DRIVER_NOT_LOADED              0x20000003

// error groups
#define PBM_SSPBM32_ERROR                  0x20000100
#define PBM_PBMMAN32_ERROR                 0x20000200
#define PBM_STATUS_ERROR                   0x20000300
#define PBM_COMMAND_OFF_EXPECTED           0x20000400
#define PBM_COMMON_ERROR                   0x20000800

#define PBM_ERROR_MASK                     0xffffff00

#define PBM_GENERAL_FAILURE                0x20000100
#define PBM_HANDLE_NOT_AVAILABLE           0x20000101
#define PBM_INVALID_CARDHANDLE             0x20000102
#define PBM_WRITE_ACCESS_DENIED            0x20000103
#define PBM_CARDIRQ_ACCESS_DENIED          0x20000104
#define PBM_APPIRQ_ACCESS_DENIED           0x20000105
#define PBM_HCONTROL_ACCESS_DENIED         0x20000106
#define PBM_OVERLAP_CONFLICT               0x20000107
#define PBM_CONFIG_NOT_FOUND               0x20000108
#define PBM_CARD_NOT_FOUND                 0x20000109
#define PBM_MEMORY_CONFLICT                0x2000010a
#define PBM_INVALID_MODULE                 0x2000010b
#define PBM_CARD_NOT_RESPONDING            0x2000010c
#define PBM_CARD_SELF_DIAG_FAILED          0x2000010d
#define PBM_INVALID_OFFSET                 0x2000010e
#define PBM_INVALID_BIT_NUMBER             0x2000010f
#define PBM_INVALID_SIZE                   0x20000110
#define PBM_INVALID_SIGNAL_ID              0x20000111
#define PBM_SIGNAL_READ_ONLY               0x20000112
#define PBM_INVALID_SIGNAL_VALUE           0x20000113
#define PBM_INVALID_POINTER                0x20000114
#define PBM_INVALID_INT_LEVEL              0x20000115
#define PBM_INVALID_IO_ADD                 0x20000116
#define PBM_INVALID_IO_LENGTH              0x20000117
#define PBM_INVALID_MEM_ADD                0x20000118
#define PBM_INVALID_MEM_LENGTH             0x20000119
#define PBM_PBM_CARD_ACCESS_TIMEOUT        0x2000011a
#define PBM_DRIVER_ACCESS_DENIED           0x2000011b
#define PBM_MEMORY_TEST_FAILURE            0x2000011c
#define PBM_MODULE_LOAD_REQUEST_DENIED     0x2000011d
#define PBM_INVALID_PAGE                   0x2000011e
#define PBM_CPU_NOT_RUNNING                0x2000011f
#define PBM_PCI_NOT_SUPPORTED              0x20000120
#define PBM_PCI_BOOT_TIMEOUT               0x20000121
#define PBM_PCI_MODULE_DIAG_FAILED         0x20000122

// common errors
#define pbms_2_errno(ERROR_CODE)           (ERROR_CODE & ~PBM_ERROR_MASK)
#define errno_2_pbms(ERROR_VALUE)          (PBM_GENERAL_ERROR | PBM_COMMON_ERROR | pbms_2_errno(ERROR_VALUE))

// PBM_Version
#define PBM_INVALID_BUFFER_POINTER         0x20000201
#define PBM_INVALID_VERSION_POINTER        0x20000202

// PBM_PutNetCfg
#define PBM_INVALID_PBM_BAUD               0x20000209

// FBM_PutSlvCfg
#define PBM_INVALID_SLV_TX_LEN             0x2000020a

// PBM_GetSlvCfg
// PBM_GetSlvCfgChk
// PBM_GetSlvStnEna
// PBM_GetSlvDiagInfo
// PBM_GetSlvParmData
// PBM_GetSlvInpData
// PBM_GetSlvOutData
// PBM_PutSlvCfg
// PBM_PutSlvDiagInfo
// PBM_PutSlvInpData
// PBM_RequestSlvDiagUpdate
// PBM_EnableSlvExtDiag
// PBM_GetSlvExtDiagFlag
// PBM_PutSlvExtDiagData
#define PBM_INVALID_SLV_NUMBER             0x2000020b

// PBM_PutSlvDiagInfo
// PBM_PutSlvExtDiagData
#define PBM_INVALID_SLV_EXT_DIAG_LEN       0x2000020c

// PBM_GetSlvInpData
// PBM_PutSlvInpData
#define PBM_INVALID_RELATIVE_INP_OFFSET    0x2000020d
#define PBM_INVALID_RELATIVE_INP_LEN       0x2000020e

// PBM_GetSlvOutData
#define PBM_INVALID_RELATIVE_OUT_OFFSET    0x2000020f
#define PBM_INVALID_RELATIVE_OUT_LEN       0x20000210

// PBM_PutSlvCfg
// PBM_PutSlvStnEna
#define PBM_INVALID_SLV_STN_ENA            0x20000211

// PBM_Command
#define PBM_INVALID_COMMAND                0x20000215
#define PBM_NOT_ON_LINE_STATE              0x20000216
#define PBM_NO_ERROR_TO_CLEAR              0x20000217
#define PBM_NOT_OFF_LINE_STATE             0x20000218
#define PBM_TIMEOUT_EXECUTING_COMMAND      0x20000219

// PFB_ConfigAbf
#define PBM_INVALID_FILENAME_POINTER       0x2000021d
#define PBM_INVALID_CFG_FILE               0x2000021e

#define PBM_ERROR_READING_FILE             0x20000258

// Shared flags
#define PBM_SS_WRITE                       ((unsigned short)0x0001)    // shared write access
#define PBM_SS_XWRITE                      ((unsigned short)0x0002)    // exclusive write acces
#define PBM_SS_HCONTROL                    ((unsigned short)0x0004)    // exclusive hardware control
#define PBM_SS_CARDIRQ                     ((unsigned short)0x0008)    // exclusive IRQ -> card
#define PBM_SS_APPIRQ                      ((unsigned short)0x0010)    // exclusive APD -> card
#define PBM_SS_OVERLAP                     ((unsigned short)0x4000)    // overlapped cards are suported

// Modul load flags
#define PBM_SS_NOLOAD                      ((unsigned short)0x0000)
#define PBM_SS_REPLACE                     ((unsigned short)0x0001)
#define PBM_SS_RELOAD                      ((unsigned short)0x0002)
#define PBM_SS_EMBEDDED                    ((unsigned short)0x0004)
#define PBM_SS_GO_OFF_ONCLOSE              ((unsigned short)0x0008)
#define PBM_SS_STAY_RUN_ONCLOSE            ((unsigned short)0x0010)

// definitions related to PBM_SLV_CFG.pbmStnEna
#define PBM_MOD_STN_ENA_ACTIVE             ((BYTE)0x01)    // station activated
#define PBM_MOD_STN_ENA_VIRTUAL            ((BYTE)0x02)    // emulate this slave
#define PBM_MOD_STN_ENA_VIRTUAL_ACTIVE     ((BYTE)0x03)    // emulate this active slave
#define PBM_MOD_STN_ENA_ERR_EVNT           ((BYTE)0x40)    // generate event when this station errors
#define PBM_MOD_STN_ENA_IGNORE_STS         ((BYTE)0x80)    // ignore status of this slave (ALL_OK, and LED)

// definitions related to PBM_NET_CFG.pbmBaud
#define PBM_MOD_BAUD_9k6                   ((BYTE)0)
#define PBM_MOD_BAUD_19k2                  ((BYTE)1)
#define PBM_MOD_BAUD_93k75                 ((BYTE)2)
#define PBM_MOD_BAUD_187k5                 ((BYTE)3)
#define PBM_MOD_BAUD_500k                  ((BYTE)4)
#define PBM_MOD_BAUD_750k                  ((BYTE)5)
#define PBM_MOD_BAUD_1m5                   ((BYTE)6)
#define PBM_MOD_BAUD_3m                    ((BYTE)7)
#define PBM_MOD_BAUD_6m                    ((BYTE)8)
#define PBM_MOD_BAUD_12m                   ((BYTE)9)

#if defined(_WINDOWS) || defined(_Windows) || defined(_WIN32) || defined(WIN32) || defined(__WIN32__)

#define PBM_WINDOWS

// include original headers from card vendor
#include "ssflags.h"
#include "pbmerr32.h"
#include "pbmflags.h"
#include "pbmext32.h"
#include "pbmptr32.h"

#define PBM_DLL_NAME "PBMMAN32.DLL"
#define PBM_SSPBM32  "SSPBM32.DLL"
#define PBM_PBMERR32 "PBMERR32.DLL"

#else // _WINDOWS

#ifdef __cplusplus
extern "C" {
#endif
#pragma pack(1)

// source compatibility typedefs
typedef unsigned char  BYTE;
typedef unsigned short WORD;
typedef unsigned int   DWORD;
typedef char           TCHAR;
typedef DWORD          BOOL;

#ifndef TRUE
#define TRUE ((BOOL)1)
#endif

#ifndef FALSE
#define FALSE ((BOOL)0)
#endif

#define PBM_MODULE_ID                      ((unsigned short)0xbb02)


// Network Configuration Data
// PBM_GetNetCfg
// PBM_PutNetCfg
typedef struct {
  BYTE pbmBaud;         // 203 network baud rate
  WORD pbmOptions;      // 204 network options (not currently used)
  WORD pbmEvtEna;       // 210 Event enable mask
  WORD pbmIntEna;       // 212 Event interrupt enable mask
} PBM_NET_CFG;

// Multi Slave Configuration Data
// PBM_GetSlvCfg
// PBM_PutSlvCfg
typedef struct {
  BYTE pbmStnEna;       // 300-37f Station monitor list
  BYTE pbmTxLen;        // 380-3ff Station Tx Len Table
  WORD pbmWdTime;       // 600-6ff Initial slave watchdog times
} PBM_SLV_CFG;

// Card status information
// PBM_GetCardStatus
typedef struct {
  BYTE pbmCommand;      // 200 Card command register
  BYTE pbmStatus;       // 201 Card status register
  BYTE pbmCommSts;      // 202 Communication status
  WORD pbmCardId;       // 20a 5136-PBMSLV Card ID (0xaad1)
  WORD pbmModId;        // 20c PBMDPSLV Module ID (0xbb02)
  WORD pbmModVer;       // 20e PBMDPSLV Module Version (ex. 0x0102 = 1.02)
} PBM_CARD_STS;

// Local diagnostic counter
// PBM_GetDiagCounters
typedef struct {
  WORD pbmRxFrames;     // 2c2 Total received frames (to virtual or monitored stations)
  WORD pbmCfgFrames;    // 2c4 Total received configuration frames
  WORD pbmBadRxFrames;  // 2c6 Frames received with errors
  WORD pbmSlvTmeOuts;   // 2c8 Slave watchdog timeouts
  WORD pbmFrameErrors;  // 2ca Length, Start delimiter or end delimiter errors
  WORD pbmChkErrors;    // 2cc Checksum errors during receive
  WORD pbmParErrors;    // 2ce Parity errors during receive
  WORD pbmDupSlvErrors; // 2d0 duplicate slave errors during receive
  WORD pbmErrArg;       // 2d2 argument for internal errors
} PBM_DIAG_CTRS;

// Multi Slave Status Diag Info
// PBM_GetSlvDiagInfo
// PBM_PutSlvDiagInfo
typedef struct {
  BYTE dgnLen;          // 300     Length of diagnostic status response + 5
  BYTE dgnSts1;         // 306     See profibus spec
  BYTE dgnSts2;         // 307     See profibus spec
  BYTE dgnSts3;         // 308     See profibus spec
  BYTE dgnMstrAddr;     // 309     See profibus spec
  BYTE dgnIdentHi;      // 30a     See profibus spec
  BYTE dgnIdentLo;      // 30b     See profibus spec
  BYTE dgnExtDataLen;   // 30c     Length of extended diagnostic data
  BYTE dgnExtData[237]; // 30d-3f9 Extended diagnostic data
} PBM_SLV_DIAG_INFO;

// Multi Slave Parameter Data
// PBM_GetSlvParmData
typedef struct {
  BYTE prmLen;          // 400     Length of parameter information from master + 5
  BYTE prmSts;          // 406     See profibus spec
  BYTE prmWDogFact1;    // 407     See profibus spec
  BYTE prmWDogFact2;    // 408     See profibus spec
  BYTE prmRdyTme;       // 409     See profibus spec
  BYTE prmIdentHi;      // 40a     See profibus spec
  BYTE prmIdentLo;      // 40b     See profibus spec
  BYTE prmGrpID;        // 40c     See profibus spec
  BYTE prmExtData[237]; // 40d-4f9 Extended parameter information from master
} PBM_SLV_PARM_DATA;

// Multi Slave Configuration Check
// PBM_GetSlvCfgChk
typedef struct {
  BYTE cfgLen;          // 600     Length of configuration check information from master + 5
  BYTE cfgChkData[244]; // 606-6f9 Configuration check information from master
} PBM_SLV_CHK_CFG;

// compatibility functions
extern DWORD    GetLastError            (void);

// Management functions
extern BOOL     PBM_Version             (TCHAR* Buffer, WORD* Version, DWORD Size);
extern BOOL     PBM_OpenCard            (DWORD* CardHandle, TCHAR* CardName, void* Module, WORD ModuleId, WORD ShareFlags, WORD LoadFlags);
extern BOOL     PBM_CloseCard           (DWORD CardHandle);
extern BOOL     PBM_EnumDrivers         (DWORD Index, char* lpName, DWORD* Len);

// Card Management functions
extern BOOL     PBM_Command             (DWORD CardHandle, TCHAR* Command);
extern BOOL     PBM_GetCardSts          (DWORD CardHandle, PBM_CARD_STS* CrdSts);
extern BOOL     PBM_GetDiagCounters     (DWORD CardHandle, PBM_DIAG_CTRS* DiagCtrs);
extern BOOL     PBM_GetCountersSts      (DWORD CardHandle, BYTE* CntsSts);
extern BOOL     PBM_InitCounters        (DWORD CardHandle);

// DP network functions
extern BOOL     PBM_GetNetCfg           (DWORD CardHandle, PBM_NET_CFG* NetCfg);
extern BOOL     PBM_PutNetCfg           (DWORD CardHandle, PBM_NET_CFG* NetCfg);

// DP multi slave functions
extern BOOL     PBM_ConfigAbf           (DWORD CardHandle, TCHAR* pszFileName);
extern BOOL     PBM_GetSlvCfg           (DWORD CardHandle, BYTE SlvNum, PBM_SLV_CFG* SlvCfg);
extern BOOL     PBM_PutSlvCfg           (DWORD CardHandle, BYTE SlvNum, PBM_SLV_CFG* SlvCfg);
extern BOOL     PBM_GetSlvStnEna        (DWORD CardHandle, BYTE SlvNum, BYTE* SlvStnEna);
extern BOOL     PBM_PutSlvStnEna        (DWORD CardHandle, BYTE SlvNum, BYTE SlvStnEna);
extern BOOL     PBM_GetSlvDiagInfo      (DWORD CardHandle, BYTE SlvNum, PBM_SLV_DIAG_INFO* SlvDiag);
extern BOOL     PBM_PutSlvDiagInfo      (DWORD CardHandle, BYTE SlvNum, PBM_SLV_DIAG_INFO* SlvDiag);
extern BOOL     PBM_GetSlvParmData      (DWORD CardHandle, BYTE SlvNum, PBM_SLV_PARM_DATA* SlvParm);
extern BOOL     PBM_GetSlvCfgChk        (DWORD CardHandle, BYTE SlvNum, PBM_SLV_CHK_CFG* SlvChkCfg);
extern BOOL     PBM_GetSlvInpData       (DWORD CardHandle, BYTE SlvNum, BYTE Ofs, BYTE Len, BYTE* DataBuf);
extern BOOL     PBM_GetSlvOutData       (DWORD CardHandle, BYTE SlvNum, BYTE Ofs, BYTE Len, BYTE* DataBuf);
extern BOOL     PBM_PutSlvInpData       (DWORD CardHandle, BYTE SlvNum, BYTE Ofs, BYTE Len, BYTE* DataBuf);
extern BOOL     PBM_GetSlvStsTable      (DWORD CardHandle, BYTE* SlvStsTable);
extern BOOL     PBM_GetSlvInpFC         (DWORD CardHandle, BYTE SlvNum, BYTE* InpFC);
extern BOOL     PBM_GetSlvInpLen        (DWORD CardHandle, BYTE SlvNum, BYTE* InpLen);
extern BOOL     PBM_GetSlvOutLen        (DWORD CardHandle, BYTE SlvNum, BYTE* OutLen);
extern BOOL     PBM_RequestSlvDiagUpdate(DWORD CardHandle, BYTE SlvNum);
extern BOOL     PBM_GetSlvExtDiagFlag   (DWORD CardHandle, BYTE SlvNum, BOOL* ExtDiag);
extern BOOL     PBM_EnableSlvExtDiag    (DWORD CardHandle, BYTE SlvNum, BOOL ExtDiag);
extern BOOL     PBM_PutSlvExtDiagData   (DWORD CardHandle, BYTE SlvNum, BYTE* Data, BYTE Size);

// dummy functions: PBMMAN32.DLL: low level driver Low level dirver SSPBM32.DLL
extern BOOL     PBM_LoadDriver          (TCHAR* DriverName);
extern BOOL     PBM_FreeDriver          (void);
extern BOOL     PBM_DriverVersion       (TCHAR* Buffer, WORD* Version, DWORD Size);

extern BOOL     PBM_ReadByte            (DWORD CardHandle, DWORD Offset, BYTE* Buffer);
extern BOOL     PBM_WriteByte           (DWORD CardHandle, DWORD Offset, BYTE Data);
extern BOOL     PBM_ReadWord            (DWORD CardHandle, DWORD Offset , WORD* Data);
extern BOOL     PBM_WriteWord           (DWORD CardHandle, DWORD Offset, WORD Data);
extern BOOL     PBM_ReadBlock           (DWORD CardHandle, DWORD Offset, void* Block, DWORD Size);
extern BOOL     PBM_WriteBlock          (DWORD CardHandle, DWORD Offset, void* Block, DWORD Size);
extern BOOL     PBM_ReadBit             (DWORD CardHandle, DWORD Offset, DWORD Bit, BYTE* Buffer);
extern BOOL     PBM_WriteBit            (DWORD CardHandle, DWORD Offset, DWORD Bit, BYTE Data);
extern BOOL     PBM_ToggleBit           (DWORD CardHandle, DWORD Offset, DWORD Bit);
extern BOOL     PBM_ReadHC              (DWORD CardHandle, WORD Signal, WORD* Buffer);
extern BOOL     PBM_WriteHC             (DWORD CardHandle, WORD Signal, WORD Data);
extern BOOL     PBM_GetCardPtr          (DWORD CardHandle, volatile void* *ThePointer);
extern BOOL     PBM_FreeCardPtr         (DWORD CardHandle, volatile void* ThePointer);
extern BOOL     PBM_PageReadByte        (DWORD CardHandle, DWORD Offset, BYTE* Buffer, BYTE Page);
extern BOOL     PBM_PageWriteByte       (DWORD CardHandle, DWORD Offset, BYTE Data, BYTE Page);
extern BOOL     PBM_PageReadWord        (DWORD CardHandle, DWORD Offset , WORD* Data, BYTE Page);
extern BOOL     PBM_PageWriteWord       (DWORD CardHandle, DWORD Offset, WORD Data, BYTE Page);
extern BOOL     PBM_PageReadBlock       (DWORD CardHandle, DWORD Offset, void* Block, DWORD Size, BYTE Page);
extern BOOL     PBM_PageWriteBlock      (DWORD CardHandle, DWORD Offset, void* Block, DWORD Size, BYTE Page);
extern BOOL     PBM_PageReadBit         (DWORD CardHandle, DWORD Offset, DWORD Bit, BYTE* Buffer, BYTE Page);
extern BOOL     PBM_PageWriteBit        (DWORD CardHandle, DWORD Offset, DWORD Bit, BYTE Data, BYTE Page);
extern BOOL     PBM_PageToggleBit       (DWORD CardHandle, DWORD Offset, DWORD Bit, BYTE Page);
extern BOOL     PBM_SetAccessTimeout    (DWORD CardHandle, DWORD Timeout);

extern BOOL     PBM_WaitIrq             (DWORD CardHandle);
extern BOOL     PBM_CancelWaitIrq       (DWORD CardHandle);

// error functions
extern void     PBME_CommandError       (DWORD ErrorCode, TCHAR* Buffer, WORD Size);
extern void     PBME_Version            (TCHAR* Buffer, WORD* Revision, WORD Size);

#pragma pack()
#ifdef __cplusplus
} // extern "C"
#endif

#endif // _WINDOWS

#endif // __PBMSAPI_H_

