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 }