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 }