|
|
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.