/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: Agilent34970A.java * Written by 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; /** * API for controlling the Agilent 34970A data acquisition/swith unit. At * present many capabilities of the device, such as scanning, are not supported, * and it is used as a simple multi-channel voltmeter. Error checking on channel * numbers is provided by the device itself (see <code>handleError</code>), * since the valid channel numbers depend on which modules are inserted. */ class Agilent34970A extends Equipment { /** Maximum current value that the DVM can measure, value: 3 A */ public static final float MAX_AMPS = 3.0f; int lastChannel = CHANNEL_UNDEFINED; static final int CHANNEL_UNDEFINED = -1; /** Creates a new instance of HP34401A */ public Agilent34970A(String name) { super(name); } /** Reset to factor configuration */ public void reset() { write("*RST; *CLS"); } /** Perform a self-test */ public void selfTest() { System.out.println("Initiating self-test, please wait..."); write("*TST?"); try { Thread.sleep(5000); } catch (InterruptedException _) { } String s = read(40); System.out.println("Self-test output: " + s); } /** * Displays a message on the front panel. Provided to allow programmer to * taunt the user with insulting messages. */ public void display(String text) { write("DISPLAY:TEXT '" + text + "'"); } /** * Clears the message from the front panel. Provided to allow programmer to * clear inappropriate messages from the display when the boss shows up. */ public void clearDisplay() { write("DISPLAY:TEXT:CLEAR"); } /** * Measure voltage on specified channel * * @param channel * channel to measure voltage on (e.g., 101) */ public float readVoltage(int channel) { write("MEASURE:VOLTAGE:DC? (@" + channel + ")"); String s = read(20); if (s.length() == 0) { handleError(); Infrastructure .fatal("failed to read voltage on channel " + channel); } return Float.parseFloat(s); } String readError() { write("SYSTEM:ERROR?"); String error = read(80); return error; } /** * Reports the contents of the device's error FIFO, with stack traces. * Should only be called in case of error. */ void handleError() { String error = readError(); do { if (error.length() <= 0) { Infrastructure.fatal("No reply from Agilent34970A named " + this.toString()); } Infrastructure.nonfatal("Agilent34970 named " + this.toString() + " reports error " + error); error = readError(); } while (error.equals("+0,\"No error\"") == false); } public static void main(String[] args) { Agilent34970A dvm = new Agilent34970A("HP34970"); dvm.reset(); //dvm.interactive(); //dvm.selfTest(); for (int channel = 101; channel < 120; channel++) { float volts = dvm.readVoltage(channel); System.out.println(channel + ": " + volts + " V"); } } }