/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: Equipment.java
* Written by Eric Kim and Tom O'Neill, Sun Microsystems.
*
* Copyright (c) 2004 Sun Microsystems and Static Free Software
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.simulation.test;
/**
* Device-independent control of a piece of experimental equipment over GPIB.
* Device-dependent APIs are provided by extending this class for each equipment
* model.
* <p>
* Native command documentation including error codes can be found in the <a
* href="../../../../../manuals/NI-488.2M_sw.pdf">NI-488.2M Software Reference
* Manual </a> (also found <a href="http://www.ni.com/pdf/manuals/370963a.pdf">
* here </a>) and in <a href="../../../../../ugpib.h"> <tt>ugpib.h</tt> </a>.
*/
public class Equipment extends Logger implements EquipmentInterface {
/**
* <code>option</code> value for {@link #ask}  that returns the ID
* number of the GPIB controller that this device is connected to.
*/
public final static int CONTROLLER_ID_NUMBER = 0x200;
/** Unit descriptor for device */
private int ud = -1;
/** the name of the device, as it appears in <tt>ibconf</tt>. */
private String name;
/**
* Default constructor, should be invoked by any class that extends
* {@link Equipment}. Finds the device on GPIB and clears its internal
* state (cf. {@link #clear}).
*
* @param name
* Name of the device, as given in
* /proj/async/cad/linux/src/gpib/nienet/ibconf
*/
public Equipment(String name) {
this.name = name;
if (isDisabled()) {
Logger.logInit(" GPIB device " + name + " not enabled for this test.");
return;
}
if (Infrastructure.gpibControllers == null) {
Infrastructure.fatal("You must set Infrastructure.gpibControllers "
+ "before initializing any GPIB devices");
}
ud = GPIB.findDevice(name);
Logger.logInit(" Initializing GPIB device: " + name + ", ud: " + ud);
int board = this.ask(CONTROLLER_ID_NUMBER);
for (int ind = 0; ind < Infrastructure.gpibControllers.length; ind++) {
if (board == Infrastructure.gpibControllers[ind]) {
//clear();
return;
}
}
Infrastructure.fatal("Device " + name + " is on controller number "
+ board + ", which is not in Infrastructure.gpibControllers");
}
public String toString() {
return name;
}
/**
* Returns the name of the device, as it appears in <tt>ibconf</tt>.
*
* @return Returns the name of the device.
*/
public String getName() {
return name;
}
/**
* send write message to receiver
*
* @param data
* data string
*/
public void write(String data) {
if (isDisabled()) { return; }
if (ud < 0) {
System.out.println("can't write to uninitized device:" + this);
}
GPIB.ibWrite(ud, name, data);
}
/**
* Receive up to <code>length</code> bytes from the device.
*
* @param length
* length of the data to read
* @return data string which is read
*/
public String read(int length) {
if (isDisabled()) { return ""; }
if (ud < 0) {
System.out.println("can't read from uninitized device:" + this);
}
String result = GPIB.ibRead(ud, name, length).trim();
//System.out.println(id + ": " + result + ". " + result.length());
if (result.length() == 0) {
Infrastructure.nonfatal("Empty string from id " + ud);
}
return result.trim();
}
/**
* Read 80 characters from device.
*
* @return data string which is read
*/
public String readLine(){
return read(80);
}
public float readFloat(int length) {
if (isDisabled()) { return 0f; }
String s = read(length);
return Float.parseFloat(s);
}
/**
* Return information about the GPIB software configuration parameters.
* Valid <code>option</code> values can be found in the <tt>ibconfig</tt>
* and <tt>ibask</tt> constants section in <a
* href="../../../../../ugpib.h"> <tt>ugpib.h</tt> </a>. Currently
* {@link #CONTROLLER_ID_NUMBER} is provided for convenience in
* specifying <code>option</code>.
*
* @param option
* constant identifying which configuration parameter to return
* @return value of the requested configuration parameter
*/
public int ask(int option) {
if (isDisabled()) { return 0; }
return GPIB.ibAsk(ud, name, option);
}
/**
* Clear internal or device functions of the device. Among other things,
* this should clear device GPIB error conditions and allow its use again.
* For some devices, it appears that the clear does not work if it is too
* soon after the error occurs.
*/
public void clear() {
if (isDisabled()) { return; }
GPIB.ibClr(ud, name);
}
/**
* Send GPIB interface messages to the device. The commands are listed in
* Appendix A of <a href="../../../../../manuals/NI-488.2M_sw.pdf">NI-488.2M
* Software Reference Manual </a>
*
* @param command
* string containing characters to send over GPIB
*/
public void command(String command) {
if (isDisabled()) { return; }
GPIB.ibCmd(ud, name, command);
}
/**
* For device bringup and command testing, takes commands from the terminal
* and sends them to the device. If a command includes a question mark, then
* it waits for the reply from the device before prompting for the next
* command to send.
*/
public void interactive() {
String command, response;
do {
command = Infrastructure.readln("Enter command: ");
write(command);
if (command.indexOf("?") > 0) {
response = read(100);
if (response.length() > 0) {
System.out.println("response: " + response);
}
}
} while (true);
}
/**
* Whether or not this piece of equipment is disabled.
* Presently, all equipment is disabled when running on a
* simulation rather than an actual chip. In particular,
* GPIB communication is disabled so that we do not
* need to connect to GPIB devices.
*/
protected boolean isDisabled() {
return SimulationModel.isInUse();
}
/** test program */
public static void main(String[] argv) {
Equipment pulse = new Equipment("SRS535"); // Stanford Pulse Generator
Equipment osc = new Equipment("HPINF54845A"); // HP Infinium Scope
osc.write("MEAS:FREQ? CHAN1");
System.out.println("Freq:" + osc.read(30));
}
}