Annotation of researchv10no/cmd/qsnap/gpib.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.