|
|
researchv10 Norman
/*
* This software is provided solely for use with
* the National Instruments GPIB11-series interfaces.
*
* Copyright 1980, 1983 National Instruments
*
* Jeffrey Kodosky
* REV D: 10/09/83
*/
#include <sgtty.h>
#define OK 1
#define EIO 5
#define ENOFUN (-7)
#define ELOOKU (-100)
#define stty(a,b) ioctl(a, TIOCSETP, b)
#define gtty(a,b) ioctl(a, TIOCGETP, b)
static int ibfd= -1, timo= 10;
static char rmd= -1, eod= 0, wmd= -1;
static spfn[3];
extern int errno;
gpib(f, a1, a2, a3, a4)
{
register int x;
if(ibfd < 0){
if((ibfd = open("/dev/ib", 2)) < 0)
return(geterror());
}
spfn[0] = f-2;
switch(f)
{
default:
return ENOFUN;
case 0:
spfn[0] = 0; /* command */
if(stty(ibfd,spfn) < 0)
{ printf("hit\n");
return(geterror());
}
if((x = write(ibfd, a1, a2)) < 0)
{ printf("write returns %d\n", x);
return geterror();
}
return(x);
case 1:
if(wmd != a3){ /* write */
wmd = a3;
if(setmodes() < 0)
return(geterror());
}
if((x = write(ibfd, a1, a2)) < 0)
return geterror();
return(x);
case 2:
if((rmd != a3) || (a3&2) && (eod != a4)){ /* read */
rmd = a3;
eod = a4;
if(setmodes() < 0)
return(geterror());
}
if((x = read(ibfd, a1, a2)) < 0)
return(geterror());
return(x);
case 16: /* spbyte */
spfn[0]--;
case 9: /* setstat, monitor, testsrq */
case 10: /* setstat, monitor, testsrq */
case 13: /* setstat, monitor, testsrq */
spfn[1] = a1;
case 3: /* transfer, clear, remote */
case 4: /* transfer, clear, remote */
case 5: /* transfer, clear, remote */
case 6: /* local, passctrl */
case 8: /* local, passctrl */
if(stty(ibfd, spfn) < 0)
return(geterror());
return(1);
case 15: /* status */
spfn[2] = a2;
spfn[1] = a1;
spfn[0]--;
case 7: /* ppoll, readcmd */
case 11: /* ppoll, readcmd */
if(stty(ibfd, spfn) < 0)
return(geterror());
if(gtty(ibfd, spfn) < 0)
return(ELOOKU);
return(spfn[0]);
case 12:
timo= a1; /* setparam */
if(setmodes() < 0)
return(geterror());
return(1);
case 14:
if(close(ibfd) < 0)
return(geterror()); /* finish */
ibfd = -1;
timo = 10;
rmd = 0;
eod = 0;
wmd = 0;
return(1);
}
}
static
setmodes()
{
spfn[0] = 10;
spfn[1] = timo;
spfn[2] = (wmd&017) | ((rmd&017)<<4) | (eod<<8);
return(stty(ibfd,spfn));
}
static
geterror()
{
if((errno != EIO) || (gtty(ibfd,spfn) < 0))
return(ELOOKU);
return(spfn[0]);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.