- GPIB/ECB modules completed, ecb motor driver in progress
This commit is contained in:
106
nigpib.c
Normal file
106
nigpib.c
Normal file
@ -0,0 +1,106 @@
|
||||
/*
|
||||
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 <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <tcl.h>
|
||||
#include "fortify.h"
|
||||
#include "sics.h"
|
||||
#include <ugpib.h>
|
||||
#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 void NIclear(int devID){
|
||||
ibclr(devID);
|
||||
}
|
||||
/*-----------------------------------------------------------------*/
|
||||
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;
|
||||
}
|
Reference in New Issue
Block a user