|
|
1.1 ! root 1: /* ! 2: * This software is provided solely for use with ! 3: * the National Instruments GPIB11-series interfaces. ! 4: * ! 5: * Copyright 1980, 1983 National Instruments ! 6: * ! 7: * Jeffrey Kodosky ! 8: * REV D: 10/09/83 ! 9: */ ! 10: #include <sgtty.h> ! 11: ! 12: #define OK 1 ! 13: #define EIO 5 ! 14: #define ENOFUN (-7) ! 15: #define ELOOKU (-100) ! 16: #define stty(a,b) ioctl(a, TIOCSETP, b) ! 17: #define gtty(a,b) ioctl(a, TIOCGETP, b) ! 18: ! 19: static int ibfd= -1, timo= 10; ! 20: static char rmd= -1, eod= 0, wmd= -1; ! 21: static spfn[3]; ! 22: extern int errno; ! 23: ! 24: gpib(f, a1, a2, a3, a4) ! 25: { ! 26: register int x; ! 27: ! 28: if(ibfd < 0){ ! 29: if((ibfd = open("/dev/ib", 2)) < 0) ! 30: return(geterror()); ! 31: } ! 32: spfn[0] = f-2; ! 33: switch(f) ! 34: { ! 35: default: ! 36: return ENOFUN; ! 37: case 0: ! 38: spfn[0] = 0; /* command */ ! 39: if(stty(ibfd,spfn) < 0) ! 40: { printf("hit\n"); ! 41: return(geterror()); ! 42: } ! 43: if((x = write(ibfd, a1, a2)) < 0) ! 44: { printf("write returns %d\n", x); ! 45: return geterror(); ! 46: } ! 47: return(x); ! 48: case 1: ! 49: if(wmd != a3){ /* write */ ! 50: wmd = a3; ! 51: if(setmodes() < 0) ! 52: return(geterror()); ! 53: } ! 54: if((x = write(ibfd, a1, a2)) < 0) ! 55: return geterror(); ! 56: return(x); ! 57: case 2: ! 58: if((rmd != a3) || (a3&2) && (eod != a4)){ /* read */ ! 59: rmd = a3; ! 60: eod = a4; ! 61: if(setmodes() < 0) ! 62: return(geterror()); ! 63: } ! 64: if((x = read(ibfd, a1, a2)) < 0) ! 65: return(geterror()); ! 66: return(x); ! 67: case 16: /* spbyte */ ! 68: spfn[0]--; ! 69: case 9: /* setstat, monitor, testsrq */ ! 70: case 10: /* setstat, monitor, testsrq */ ! 71: case 13: /* setstat, monitor, testsrq */ ! 72: spfn[1] = a1; ! 73: case 3: /* transfer, clear, remote */ ! 74: case 4: /* transfer, clear, remote */ ! 75: case 5: /* transfer, clear, remote */ ! 76: case 6: /* local, passctrl */ ! 77: case 8: /* local, passctrl */ ! 78: if(stty(ibfd, spfn) < 0) ! 79: return(geterror()); ! 80: return(1); ! 81: case 15: /* status */ ! 82: spfn[2] = a2; ! 83: spfn[1] = a1; ! 84: spfn[0]--; ! 85: case 7: /* ppoll, readcmd */ ! 86: case 11: /* ppoll, readcmd */ ! 87: if(stty(ibfd, spfn) < 0) ! 88: return(geterror()); ! 89: if(gtty(ibfd, spfn) < 0) ! 90: return(ELOOKU); ! 91: return(spfn[0]); ! 92: case 12: ! 93: timo= a1; /* setparam */ ! 94: if(setmodes() < 0) ! 95: return(geterror()); ! 96: return(1); ! 97: case 14: ! 98: if(close(ibfd) < 0) ! 99: return(geterror()); /* finish */ ! 100: ibfd = -1; ! 101: timo = 10; ! 102: rmd = 0; ! 103: eod = 0; ! 104: wmd = 0; ! 105: return(1); ! 106: } ! 107: } ! 108: ! 109: static ! 110: setmodes() ! 111: { ! 112: spfn[0] = 10; ! 113: spfn[1] = timo; ! 114: spfn[2] = (wmd&017) | ((rmd&017)<<4) | (eod<<8); ! 115: return(stty(ibfd,spfn)); ! 116: } ! 117: ! 118: static ! 119: geterror() ! 120: { ! 121: if((errno != EIO) || (gtty(ibfd,spfn) < 0)) ! 122: return(ELOOKU); ! 123: return(spfn[0]); ! 124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.