001    /*----------------------------------------------------------------------------*/
002    /* Copyright (c) FIRST 2008-2012. All Rights Reserved.                        */
003    /* Open Source Software - may be modified and shared by FRC teams. The code   */
004    /* must be accompanied by the FIRST BSD license file in the root directory of */
005    /* the project.                                                               */
006    /*----------------------------------------------------------------------------*/
007    
008    package edu.wpi.first.wpilibj.visa;
009    
010    import com.sun.cldc.jna.Function;
011    import com.sun.cldc.jna.NativeLibrary;
012    import com.sun.cldc.jna.Pointer;
013    import com.sun.cldc.jna.ptr.IntByReference;
014    
015    /**
016     *  This port of visa.h includes only the functions and definitions used in
017     * SerialPort.java
018     * @author dtjones
019     */
020    public class Visa {
021    
022        /**
023         * Stores the status of the last operation.
024         */
025        private static int status;
026    
027        /**
028         * temp buffer for getting values by references
029         */
030        private static final IntByReference pValue = new IntByReference(0);
031    
032        public static final int VI_ATTR_ASRL_BAUD = (0x3FFF0021);
033        public static final int VI_ATTR_ASRL_DATA_BITS = (0x3FFF0022);
034        public static final int VI_ATTR_ASRL_PARITY = (0x3FFF0023);
035        public static final int VI_ATTR_ASRL_STOP_BITS = (0x3FFF0024);
036        public static final int VI_ATTR_ASRL_FLOW_CNTRL = (0x3FFF0025);
037        public static final int VI_ATTR_TERMCHAR_EN = (0x3FFF0038);
038        public static final int VI_ATTR_TERMCHAR = (0x3FFF0018);
039        public static final int VI_ATTR_ASRL_END_IN = (0x3FFF00B3);
040        public static final int VI_ASRL_END_TERMCHAR = 2;
041        public static final int VI_ASRL_END_NONE = 0;
042        public static final int VI_ATTR_ASRL_AVAIL_NUM = (0x3FFF00AC);
043        public static final int VI_SUCCESS_TERM_CHAR = (0x3FFF0005);
044        public static final int VI_SUCCESS_MAX_CNT = (0x3FFF0006);
045        public static final int VI_ATTR_TMO_VALUE = (0x3FFF001A);
046        public static final int VI_ATTR_WR_BUF_OPER_MODE = (0x3FFF002D);
047        public static final short VI_READ_BUF = 1;
048        public static final short VI_WRITE_BUF = 2;
049    
050        private static final Function viOpenDefaultRMFn = NativeLibrary.getDefaultInstance().getFunction("viOpenDefaultRM");
051        public synchronized static int viOpenDefaultRM() throws VisaException {
052            status = viOpenDefaultRMFn.call1(pValue.getPointer());
053            assertCleanStatus("viOpenDefaultRM");
054            return pValue.getValue();
055        }
056    
057        private static final Function viOpenFn = NativeLibrary.getDefaultInstance().getFunction("viOpen");
058        public synchronized static int viOpen(int sesn, String name, int mode,
059                int timeout) throws VisaException {
060            Pointer pName = new Pointer(name.length());
061            pName.setBytes(0, name.getBytes(), 0, name.length());
062            status = viOpenFn.call5(sesn, pName, mode, timeout, pValue.getPointer());
063            assertCleanStatus("viOpen");
064            pName.free();
065            return pValue.getValue();
066        }
067    
068        private static final Function viSetAttributeFn = NativeLibrary.getDefaultInstance().getFunction("viSetAttribute");
069        public static void viSetAttribute(int vi, int attrName, int attrValue) throws VisaException {
070            status = viSetAttributeFn.call3(vi, attrName, attrValue);
071            assertCleanStatus("viSetAttribute");
072        }
073    
074        public static void viSetAttribute(int vi, int attrName, boolean attrValue) throws VisaException {
075            status = viSetAttributeFn.call3(vi, attrName, attrValue?1:0);
076            assertCleanStatus("viSetAttribute");
077        }
078        
079        private static final Function viSetBufFn = NativeLibrary.getDefaultInstance().getFunction("viSetBuf");
080        public static void viSetBuf(int vi, short buffer, int size) throws VisaException {
081            status = viSetBufFn.call3(vi, buffer, size);
082            assertCleanStatus("viSetBuf");
083        }
084    
085        private static final Function viCloseFn = NativeLibrary.getDefaultInstance().getFunction("viClose");
086        public static void viClose(int vi) {
087            viCloseFn.call1(vi);
088        }
089    
090        private static final Function viGetAttributeFn = NativeLibrary.getDefaultInstance().getFunction("viGetAttribute");
091        public synchronized static int viGetAttribute(int vi, int attrName) throws VisaException {
092            status = viGetAttributeFn.call3(vi, attrName, pValue.getPointer());
093            assertCleanStatus("viGetAttribute");
094            return pValue.getValue();
095        }
096    
097        //Doesn't work correctly. Correct parameters are vi, a format string, and a list of args
098        private static final Function viVPrintfFn = NativeLibrary.getDefaultInstance().getFunction("viVPrintf");
099        public static void viVPrintf(int vi, String write) throws VisaException {
100            Pointer string = new Pointer(write.length());
101            string.setBytes(0, write.getBytes(), 0, write.length());
102            status = viVPrintfFn.call2(vi, string);
103            string.free();
104            assertCleanStatus("viPrintf");
105        }
106    
107        private static final Function viBufReadFn = NativeLibrary.getDefaultInstance().getFunction("viBufRead");
108        public static byte[] viBufRead(int vi, int cnt) throws VisaException {
109            Pointer bytes = new Pointer(cnt);
110            Pointer retCnt = new Pointer(4);
111            status = viBufReadFn.call4(vi, bytes, cnt, retCnt);
112            switch (status) {
113                case VI_SUCCESS_TERM_CHAR:
114                case VI_SUCCESS_MAX_CNT:
115                    status = 0;
116                    break;
117                default:
118                    assertCleanStatus("viBufRead");
119            }
120    
121            byte[] toReturn = new byte[cnt];
122            bytes.getBytes(0, toReturn, 0, cnt);
123            bytes.free();
124            return toReturn;
125        }
126    
127        private static final Function viBufWriteFn = NativeLibrary.getDefaultInstance().getFunction("viBufWrite");
128        public synchronized static int viBufWrite(int vi, byte[] buf, int cnt) throws VisaException {
129            Pointer string = new Pointer(buf.length);
130            string.setBytes(0, buf, 0, buf.length);
131            status = viBufWriteFn.call4(vi, string, cnt, pValue.getPointer());
132            assertCleanStatus("viBufWrite");
133            string.free();
134            return pValue.getValue();
135        }
136    
137        private static final Function viFlushFn = NativeLibrary.getDefaultInstance().getFunction("viFlush");
138        public static void viFlush(int vi, short mask) throws VisaException {
139            status = viFlushFn.call2(vi, mask);
140            assertCleanStatus("viFlush");
141        }
142    
143        private static final Function viClearFn = NativeLibrary.getDefaultInstance().getFunction("viClear");
144        public static void viClear(int vi) throws VisaException {
145            viClearFn.call1(vi);
146            assertCleanStatus("viClear");
147        }
148    
149        protected static final void assertCleanStatus(String function) throws VisaException {
150            if (status < 0) {
151                throw new VisaException(function, status);
152            } else if (status != 0) {
153                System.out.println(VisaException.makeMessage(function, status));
154                status = 0;
155            }
156        }
157    
158        private Visa() {
159            /* do not instantiate utility class */
160        }
161    }