/*------------------------------------------------------------------------------*
 * File Name: NI488-2.h															*
 * Purpose: OriginC header file for GPIB support								*
 * Based on the GPIB header file by National Instruments Corporation			*
/*------------------------------------------------------------------------------*/

 
#ifndef _NI488_2_H_       // ensure we are only included once
#define _NI488_2_H_

// Origin C access gpib-32.dll which was located under windows system folder
#pragma dll(gpib-32, system)

// The global variales used in gpib-32.dll.
extern int  user_ibsta;
extern int  user_iberr;
extern int  user_ibcnt;
extern long user_ibcntl;

// HANDY CONSTANTS FOR USE BY APPLICATION PROGRAMS

#define UNL  0x3f  // GPIB unlisten command 
#define UNT  0x5f  // GPIB untalk command                 
#define GTL  0x01  // GPIB go to local                     
#define SDC  0x04  // GPIB selected device clear           
#define PPC  0x05  // GPIB parallel poll configure         
#define GET  0x08  // GPIB group execute trigger           
#define TCT  0x09  // GPIB take control                   
#define LLO  0x11  // GPIB local lock out                  
#define DCL  0x14  // GPIB device clear                  
#define PPU  0x15  // GPIB parallel poll unconfigure      
#define SPE  0x18  // GPIB serial poll enable           
#define SPD  0x19  // GPIB serial poll disable             
#define PPE  0x60  // GPIB parallel poll enable           
#define PPD  0x70  // GPIB parallel poll disable         

// GPIB status bit vector :                                
// global variable ibsta and wait mask               


#define ERR     (1<<15) // Error detected                  
#define TIMO    (1<<14) // Timeout                        
#define END     (1<<13) // EOI or EOS detected             
#define SRQI    (1<<12) // SRQ detected by CIC             
#define RQS     (1<<11) // Device needs service           
#define CMPL    (1<<8)  // I/O completed                  
#define LOK     (1<<7)  // Local lockout state            
#define REM     (1<<6)  // Remote state                    
#define CIC     (1<<5)  // Controller-in-Charge          
#define ATN     (1<<4)  // Attention asserted              
#define TACS    (1<<3)  // Talker active                   
#define LACS    (1<<2)  // Listener active                 
#define DTAS    (1<<1)  // Device trigger state          
#define DCAS    (1<<0)  // Device clear state             

// Error messages returned in global variable iberr       

#define EDVR  0  // System error                           
#define ECIC  1  // Function requires GPIB board to be CIC 
#define ENOL  2  // Write function detected no Listeners   
#define EADR  3  // Interface board not addressed correctly
#define EARG  4  // Invalid argument to function call      
#define ESAC  5  // Function requires GPIB board to be SAC 
#define EABO  6  // I/O operation aborted                  
#define ENEB  7  // Non-existent interface board          
#define EDMA  8  // Error performing DMA                   
#define EOIP 10  // I/O operation started before previous  
                 // operation completed                    
#define ECAP 11  // No capability for intended operation   
#define EFSO 12  // File system operation error            
#define EBUS 14  // Command error during device call       
#define ESTB 15  // Serial poll status byte lost           
#define ESRQ 16  // SRQ remains asserted                 
#define ETAB 20  // The return buffer is full.            
#define ELCK 21  // Address or board is locked.            

// EOS mode bits                                           

#define BIN  (1<<12) // Eight bit compare                  
#define XEOS (1<<11) // Send END with EOS byte            
#define REOS (1<<10) // Terminate read on EOS              

// Timeout values and meanings                        

#define TNONE    0   // Infinite timeout (disabled)        
#define T10us    1   // Timeout of 10 us (ideal)          
#define T30us    2   // Timeout of 30 us (ideal)          
#define T100us   3   // Timeout of 100 us (ideal)         
#define T300us   4   // Timeout of 300 us (ideal)         
#define T1ms     5   // Timeout of 1 ms (ideal)          
#define T3ms     6   // Timeout of 3 ms (ideal)          
#define T10ms    7   // Timeout of 10 ms (ideal)           
#define T30ms    8   // Timeout of 30 ms (ideal)           
#define T100ms   9   // Timeout of 100 ms (ideal)       
#define T300ms  10   // Timeout of 300 ms (ideal)          
#define T1s     11   // Timeout of 1 s (ideal)            
#define T3s     12   // Timeout of 3 s (ideal)            
#define T10s    13   // Timeout of 10 s (ideal)           
#define T30s    14   // Timeout of 30 s (ideal)            
#define T100s   15   // Timeout of 100 s (ideal)          
#define T300s   16   // Timeout of 300 s (ideal)        
#define T1000s  17   // Timeout of 1000 s (ideal)        


// IBLN Constants                                         
#define NO_SAD   0
#define ALL_SAD -1


// The following constants are used for the second parameter of the
// ibconfig function.  They are the "option" selection codes.

#define  IbcPAD        0x0001      // Primary Address                      
#define  IbcSAD        0x0002      // Secondary Address                   
#define  IbcTMO        0x0003      // Timeout Value                        
#define  IbcEOT        0x0004      // Send EOI with last data byte?        
#define  IbcPPC        0x0005      // Parallel Poll Configure              
#define  IbcREADDR     0x0006      // Repeat Addressing                    
#define  IbcAUTOPOLL   0x0007      // Disable Auto Serial Polling         
#define  IbcCICPROT    0x0008      // Use the CIC Protocol?                
#define  IbcIRQ        0x0009      // Use PIO for I/O                     
#define  IbcSC         0x000A      // Board is System Controller?         
#define  IbcSRE        0x000B      // Assert SRE on device calls?          
#define  IbcEOSrd      0x000C      // Terminate reads on EOS              
#define  IbcEOSwrt     0x000D      // Send EOI with EOS character       
#define  IbcEOScmp     0x000E      // Use 7 or 8-bit EOS compare         
#define  IbcEOSchar    0x000F      // The EOS character.                  
#define  IbcPP2        0x0010      // Use Parallel Poll Mode 2.            
#define  IbcTIMING     0x0011      // NORMAL, HIGH, or VERY_HIGH timing.  
#define  IbcDMA        0x0012      // Use DMA for I/O                      
#define  IbcReadAdjust 0x0013      // Swap bytes during an ibrd.          
#define  IbcWriteAdjust 0x014      // Swap bytes during an ibwrt.        
#define  IbcSendLLO    0x0017      // Enable/disable the sending of LLO.     
#define  IbcSPollTime  0x0018      // Set the timeout value for serial polls. 
#define  IbcPPollTime  0x0019      // Set the parallel poll length period.    
#define  IbcEndBitIsNormal 0x001A  // Remove EOS from END bit of IBSTA.       
#define  IbcUnAddr         0x001B  // Enable/disable device unaddressing.     
#define  IbcSignalNumber   0x001C  // Set UNIX signal number - unsupported 
#define  IbcBlockIfLocked  0x001D  // Enable/disable blocking for locked boards/devices         
#define  IbcHSCableLength  0x001F  // Length of cable specified for high speed timing.
#define  IbcIst        0x0020      // Set the IST bit.                    
#define  IbcRsv        0x0021      // Set the RSV byte.                   


// Constants that can be used (in addition to the ibconfig constants)
// when calling the ibask() function.

#define  IbaPAD            IbcPAD
#define  IbaSAD            IbcSAD
#define  IbaTMO            IbcTMO
#define  IbaEOT            IbcEOT
#define  IbaPPC            IbcPPC
#define  IbaREADDR         IbcREADDR
#define  IbaAUTOPOLL       IbcAUTOPOLL
#define  IbaCICPROT        IbcCICPROT
#define  IbaIRQ            IbcIRQ
#define  IbaSC             IbcSC
#define  IbaSRE            IbcSRE
#define  IbaEOSrd          IbcEOSrd
#define  IbaEOSwrt         IbcEOSwrt
#define  IbaEOScmp         IbcEOScmp
#define  IbaEOSchar        IbcEOSchar
#define  IbaPP2            IbcPP2
#define  IbaTIMING         IbcTIMING
#define  IbaDMA            IbcDMA
#define  IbaReadAdjust     IbcReadAdjust
#define  IbaWriteAdjust    IbcWriteAdjust
#define  IbaSendLLO        IbcSendLLO
#define  IbaSPollTime      IbcSPollTime
#define  IbaPPollTime      IbcPPollTime
#define  IbaEndBitIsNormal IbcEndBitIsNormal
#define  IbaUnAddr         IbcUnAddr
#define  IbaSignalNumber   IbcSignalNumber
#define  IbaBlockIfLocked  IbcBlockIfLocked
#define  IbaHSCableLength  IbcHSCableLength
#define  IbaIst            IbcIst
#define  IbaRsv            IbcRsv

#define  IbaBNA            0x0200   // A device's access board.             


// Values used by the Send 488.2 command. 
#define  NULLend 0x00  // Do nothing at the end of a transfer.
#define  NLend   0x01  // Send NL with EOI after a transfer.  
#define  DABend  0x02  // Send EOI with the last DAB.         

// Value used by the 488.2 Receive command.
#define  STOPend     0x0100


// Address type (for 488.2 calls) 

typedef short Addr4882_t;       // System dependent: must be 16 bits 

//  This macro can be used to easily create an entry in address list
//  that is required by many of the 488.2 functions. The primary address goes in the
//  lower 8-bits and the secondary address goes in the upper 8-bits.

#define  MakeAddr(pad, sad)   ((Addr4882_t)(((pad)&0xFF) | ((sad)<<8)))

//  This value is used to terminate an address list.  It should be
//  assigned to the last entry.

#ifndef NOADDR
#define  NOADDR    (Addr4882_t)((unsigned short)0xFFFF)
#endif

//  The following two macros are used to "break apart" an address list
//  entry.  They take an unsigned integer and return either the primary
//  or secondary address stored in the integer.

#define  GetPAD(val)    ((val) & 0xFF)
#define  GetSAD(val)    (((val) >> 8) & 0xFF)

// iblines constants

#define  ValidEOI   (short)0x0080
#define  ValidATN   (short)0x0040
#define  ValidSRQ   (short)0x0020
#define  ValidREN   (short)0x0010
#define  ValidIFC   (short)0x0008
#define  ValidNRFD  (short)0x0004
#define  ValidNDAC  (short)0x0002
#define  ValidDAV   (short)0x0001
#define  BusEOI     (short)0x8000
#define  BusATN     (short)0x4000
#define  BusSRQ     (short)0x2000
#define  BusREN     (short)0x1000
#define  BusIFC     (short)0x0800
#define  BusNRFD    (short)0x0400
#define  BusNDAC    (short)0x0200
#define  BusDAV     (short)0x0100


// Origin C did not support callback function in this version 
// typedef for ibnotify callback
// typedef int (__stdcall * GpibNotifyCallback_t)(int, int, int, long, PVOID);

#define IBNOTIFY_REARM_FAILED    0xE00A003F


// iblockx and ibunlockx definitions --- for use with GPIB-ENET only.

#define  TIMMEDIATE                 -1
#define  TINFINITE                  -2
#define  MAX_LOCKSHARENAME_LENGTH   64

// some type defination in WIN32
typedef char 	*PCHAR;
typedef int 	*PINT;
typedef void 	*PVOID;
typedef short 	*PSHORT;


// Origin C did not support UNICODE in this version 

#define iblockx iblockxA

/** >Communications
*/   
extern int __stdcall iblockxA (int ud, int LockWaitTime, PCHAR LockShareName);

/** >Communications
*/
extern int __stdcall ibunlockx (int ud);

#define ibbna  ibbnaA
#define ibfind ibfindA
#define ibrdf  ibrdfA
#define ibwrtf ibwrtfA
 
// Extern 32-bit GPIB DLL functions
// NI-488 Function Prototypes 
/** >Communications
*/
extern int __stdcall ibfindA(LPCSTR udname);
 
/** >Communications
*/
extern int __stdcall ibbnaA(int ud, LPCSTR udname);
 
/** >Communications
*/
extern int __stdcall ibrdfA(int ud, LPCSTR filename);
 
/** >Communications
*/
extern int __stdcall ibwrtfA(int ud, LPCSTR filename);
 
/** >Communications
*/
extern int __stdcall ibask(int ud, int option, PINT v);
 
/** >Communications
*/
extern int __stdcall ibcac(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibclr(int ud);
 
/** >Communications
*/
extern int __stdcall ibcmd(int ud, PVOID buf, long cnt);
 
/** >Communications
*/
extern int __stdcall ibcmda(int ud, PVOID buf, long cnt);
 
/** >Communications
*/
extern int __stdcall ibconfig(int ud, int option, int v);
 
/** >Communications
*/
extern int __stdcall ibdev(int boardID, int pad, int sad, int tmo, int eot, int eos);
 
/** >Communications
*/
extern int __stdcall ibdiag(int ud, PVOID buf, long cnt);
 
/** >Communications
*/
extern int __stdcall ibdma(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibeos(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibeot(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibgts(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibist(int ud, int v);
 
/** >Communications
*/
extern int __stdcall iblines(int ud, PSHORT result);
 
/** >Communications
*/
extern int __stdcall ibln(int ud, int pad, int sad, PSHORT listen);
 
/** >Communications
*/
extern int __stdcall ibloc(int ud);


// Origin C did not support callback function in this version 
// extern int __stdcall ibnotify (int ud, int mask, GpibNotifyCallback_t Callback, PVOID RefData);
/** >Communications
*/
extern int __stdcall ibonl(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibpad(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibpct(int ud);
 
/** >Communications
*/
extern int __stdcall ibpoke(int ud, long option, long v);
 
/** >Communications
*/
extern int __stdcall ibppc(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibrd(int ud, PVOID buf, long cnt);
 
/** >Communications
*/
extern int __stdcall ibrda(int ud, PVOID buf, long cnt);
 
/** >Communications
*/
extern int __stdcall ibrpp(int ud, PCHAR ppr);
 
/** >Communications
*/
extern int __stdcall ibrsc(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibrsp(int ud, PCHAR spr);
 
/** >Communications
*/
extern int __stdcall ibrsv(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibsad(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibsic(int ud);
 
/** >Communications
*/
extern int __stdcall ibsre(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibstop(int ud);
 
/** >Communications
*/
extern int __stdcall ibtmo(int ud, int v);
 
/** >Communications
*/
extern int __stdcall ibtrg(int ud);
 
/** >Communications
*/
extern int __stdcall ibwait(int ud, int mask);
 
/** >Communications
*/
extern int __stdcall ibwrt(int ud, PVOID buf, long cnt);
 
/** >Communications
*/
extern int __stdcall ibwrta(int ud, PVOID buf, long cnt);


// GPIB-ENET only functions to support locking across machines
/** >Communications
*/
extern int __stdcall iblock(int ud);
 
/** >Communications
*/
extern int __stdcall ibunlock (int ud);

// Functions to access Thread-Specific copies of the GPIB global vars 
 
/** >Communications
*/
extern int  __stdcall ThreadIbsta(void);
 
/** >Communications
*/
extern int  __stdcall ThreadIberr(void);
 
/** >Communications
*/
extern int  __stdcall ThreadIbcnt(void);
 
/** >Communications
*/
extern long __stdcall ThreadIbcntl(void);


// NI-488.2 Function Prototypes 
/** >Communications
*/
extern void __stdcall AllSpoll(int boardID, Addr4882_t * addrlist, PSHORT results);
 
/** >Communications
*/
extern void __stdcall DevClear(int boardID, Addr4882_t addr);
 
/** >Communications
*/
extern void __stdcall DevClearList(int boardID, Addr4882_t * addrlist);
 
/** >Communications
*/
extern void __stdcall EnableLocal(int boardID, Addr4882_t * addrlist);
 
/** >Communications
*/
extern void __stdcall EnableRemote(int boardID, Addr4882_t * addrlist);
 
/** >Communications
*/
extern void __stdcall FindLstn(int boardID, Addr4882_t * addrlist, Addr4882_t * results, int limit);
 
/** >Communications
*/
extern void __stdcall FindRQS(int boardID, Addr4882_t * addrlist, PSHORT dev_stat);
 
/** >Communications
*/
extern void __stdcall PPoll(int boardID, PSHORT result);
 
/** >Communications
*/
extern void __stdcall PPollConfig(int boardID, Addr4882_t addr, int dataLine, int lineSense);
 
/** >Communications
*/
extern void __stdcall PPollUnconfig(int boardID, Addr4882_t * addrlist);
 
/** >Communications
*/
extern void __stdcall PassControl(int boardID, Addr4882_t addr);
 
/** >Communications
*/
extern void __stdcall RcvRespMsg(int boardID, PVOID buffer, long cnt, int Termination);
 
/** >Communications
*/
extern void __stdcall ReadStatusByte(int boardID, Addr4882_t addr, PSHORT result);
 
/** >Communications
*/
extern void __stdcall Receive(int boardID, Addr4882_t addr, PVOID buffer, long cnt, int Termination);
 
/** >Communications
*/
extern void __stdcall ReceiveSetup(int boardID, Addr4882_t addr);
 
/** >Communications
*/
extern void __stdcall ResetSys(int boardID, Addr4882_t * addrlist);
 
/** >Communications
*/
extern void __stdcall Send(int boardID, Addr4882_t addr, PVOID databuf, long datacnt, int eotMode);
 
/** >Communications
*/
extern void __stdcall SendCmds(int boardID, PVOID buffer, long cnt);
 
/** >Communications
*/
extern void __stdcall SendDataBytes(int boardID, PVOID buffer, long cnt, int eot_mode);
 
/** >Communications
*/
extern void __stdcall SendIFC(int boardID);
 
/** >Communications
*/
extern void __stdcall SendLLO(int boardID);
 
/** >Communications
*/
extern void __stdcall SendList(int boardID, Addr4882_t * addrlist, PVOID databuf, long datacnt, int eotMode);
 
/** >Communications
*/
extern void __stdcall SendSetup(int boardID, Addr4882_t * addrlist);
 
/** >Communications
*/
extern void __stdcall SetRWLS(int boardID, Addr4882_t * addrlist);
 
/** >Communications
*/
extern void __stdcall TestSRQ(int boardID, PSHORT result);
 
/** >Communications
*/
extern void __stdcall TestSys(int boardID, Addr4882_t * addrlist, PSHORT results);
 
/** >Communications
*/
extern void __stdcall Trigger(int boardID, Addr4882_t addr);
 
/** >Communications
*/
extern void __stdcall TriggerList(int boardID, Addr4882_t * addrlist);
 
/** >Communications
*/
extern void __stdcall WaitSRQ(int boardID, PSHORT result);

#endif // !_NI488_2_H_

