/* This is an implementation of a GPIB driver based on the drivers provided by National Instruments. The driver has been tested with the ENET-100 GPIB-TCP/IP bridge but should also work with NI GPIB boards plugged into the composter. copright: see file COPYRIGHT Mark Koennecke, January 2002 */ #include #include #include #include #include "fortify.h" #include "sics.h" #include #include "gpibcontroller.i" typedef struct __GPIB *pGPIB; /*--------------------------------------------------------------------------*/ static int NIattach(int boardNo, int address, int secondaryAddress, int tmo, int eot, int eos){ int devID; devID = ibdev(boardNo, address, secondaryAddress, tmo, eot, eos); if(devID < 0){ return -iberr; } else { return devID; } } /*---------------------------------------------------------------------*/ static int NIdetach(int devID){ int status; status = ibonl(devID, 0); if(status & ERR){ return -iberr; } else { return 1; } } /*-------------------------------------------------------------------*/ static int NIwrite(int devID, void *buffer, int bytesToWrite){ int status; status = ibwrt(devID,buffer,bytesToWrite); if(status & ERR){ return - iberr; } else { return 1; } } /*-------------------------------------------------------------------*/ static int NIread(int devID, void *buffer, int bytesToRead){ int status; status = ibrd(devID,buffer,bytesToRead); if(status & ERR){ return - iberr; } else { return 1; } } /*--------------------------------------------------------------------*/ static int NIclear(int devID){ ibclr(devID); return 1; } /*-----------------------------------------------------------------*/ static void NIerror(int code, char *buffer, int maxBuffer){ int flag = - code; switch(flag){ case EDVR: case ENEB: case ECIC: strncpy(buffer,"NI-GPIB not correctly installed or bad address", maxBuffer); return; case EABO: strncpy(buffer,"Timeout on data transfer",maxBuffer); return; case EBUS: strncpy(buffer,"No device connected to GPIB or address errror", maxBuffer); return; case ENOL: strncpy(buffer,"No listeners on bus. Perhaps address error?", maxBuffer); return; default: strncpy(buffer,"Unrecognised error code, fix nigpib.c", maxBuffer); break; } } /*------------------------------------------------------------------*/ void NIassign(pGPIB self){ self->attach = NIattach; self->detach = NIdetach; self->send = NIwrite; self->read = NIread; self->getErrorDescription = NIerror; self->clear = NIclear; }