Annotation of researchv10no/cmd/qsnap/gpib.c, revision 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.