📄 parallelportdisplay.java
字号:
/*
* @(#)ParallelPortDisplay.java 1.4 98/10/20 SMI
*
* Author: Tom Corson
*
* Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license
* to use, modify and redistribute this software in source and binary
* code form, provided that i) this copyright notice and license appear
* on all copies of the software; and ii) Licensee does not utilize the
* software in a manner which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
* LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE
* SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS
* BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
* HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING
* OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control
* of aircraft, air traffic, aircraft navigation or aircraft
* communications; or in the design, construction, operation or
* maintenance of any nuclear facility. Licensee represents and
* warrants that it will not use or redistribute the Software for such
* purposes.
*/
package samples.ParallelBlackBox;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.util.TooManyListenersException;
import java.awt.Panel;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import javax.comm.CommPortIdentifier;
import javax.comm.CommPortOwnershipListener;
import javax.comm.ParallelPort;
import javax.comm.ParallelPortEvent;
import javax.comm.ParallelPortEventListener;
import javax.comm.PortInUseException;
public class ParallelPortDisplay
extends Panel implements ParallelPortEventListener, MouseListener,
CommPortOwnershipListener {
protected CommPortIdentifier portID;
protected ParallelPort port = null;
protected InputStream in;
protected OutputStream out,
outSave;
protected boolean lineMonitor,
open = false;
private int rcvDelay;
private Thread rcvThread = null;
private ParallelBlackBox owner;
private boolean threadRcv,
friendly,
waiting = false;
Panel display,
textPanel;
Label portName = null;
LPTMode mode;
CtlSigDisplay ctlSigs;
Receiver receiver;
Transmitter transmitter;
public ParallelPortDisplay(CommPortIdentifier portID,
boolean threadRcv,
boolean friendly,
int rcvDelay,
ParallelBlackBox owner) throws PortInUseException {
super();
this.setLayout(new BorderLayout());
this.owner = owner;
this.lineMonitor = false;
this.outSave = null;
this.portID = portID;
this.threadRcv = threadRcv;
this.friendly = friendly;
this.rcvDelay = rcvDelay;
this.openPBBPort();
}
private boolean openPBBPort() throws PortInUseException {
/*
* If we are already open, do a close first.
*/
if (this.open) {
this.closePBBPort();
}
/*
* Register an ownership listener so we can
* manage the port.
*/
this.portID.addPortOwnershipListener(this);
/*
* Try to open the port
*/
try {
port = (ParallelPort)
portID.open("ParallelBlackBox",
2000);
if (port == null) {
System.out.println("Error opening port "
+ portID.getName());
return false;
}
else {
this.open = true;
this.waiting = false;
if (portName != null) {
portName.setForeground(Color.green);
}
}
/*
* Get the input stream
*/
try {
in = this.port.getInputStream();
}
catch (IOException e) {
System.out.println("Cannot open input stream");
}
/*
* Get the output stream
*/
try {
out = this.port.getOutputStream();
}
catch (IOException e) {
System.out.println("Cannot open output stream");
}
/*
* Create the panel (if needed)
*/
this.createPanel();
this.showValues();
/*
* Setup an event listener for the port
*/
try {
port.addEventListener(this);
}
catch (TooManyListenersException tmle) {
tmle.printStackTrace();
}
/*
* These are the events we want to know about
*/
port.notifyOnBuffer(true);
port.notifyOnError(true);
/*
* Create the receiver thread
*/
if (this.threadRcv && (rcvThread == null)) {
rcvThread = new Thread(this.receiver,
"Rcv "
+ port.getName());
rcvThread.start();
}
else {
rcvThread = null;
}
}
catch (PortInUseException e) {
System.out.println("Queueing open for "
+ portID.getName()
+ ": port in use by "
+ e.currentOwner);
if (portName != null) {
portName.setForeground(Color.yellow);
}
this.waiting = true;
// throw(e);
}
return true;
}
public void closePBBPort() {
if (this.open) {
System.out.println("Closing " + this.port.getName());
this.portName.setForeground(Color.red);
this.open = false;
/*
* Stop transmitting
*/
this.transmitter.stopTransmit();
/*
* Stop receiving
*/
if (this.rcvThread != null) {
this.rcvThread.interrupt();
this.rcvThread = null;
}
/*
* Remove the event listener for the port
*/
this.port.removeEventListener();
/*
* Remove the ownership event listener
*/
this.portID.removePortOwnershipListener(this);
/*
* Close the port
*/
this.port.close();
this.port = null;
ctlSigs.setPort(this.port);
receiver.setPort(this.port);
transmitter.setPort(this.port);
transmitter.clearValues();
receiver.clearValues();
ctlSigs.clearValues();
ctlSigs.clearErrorValues();
this.showValues();
}
}
public ParallelPort getPort() {
return (this.open ? this.port : null);
}
private OutputStream getOutputStream() {
return (this.out);
}
private void setOutputStream(OutputStream newout) {
this.outSave = getOutputStream();
this.out = newout;
}
public void setLineMonitor(ParallelPortDisplay other,
boolean value) {
/*
* To make a line monitor, we simply take two ports
* and interchange their output streams!
*/
this.lineMonitor = value;
other.lineMonitor = value;
if (this.lineMonitor) {
this.setOutputStream(other.getOutputStream());
other.setOutputStream(this.outSave);
}
else {
other.setOutputStream(this.getOutputStream());
this.setOutputStream(this.outSave);
}
}
private void createPanel() {
/*
* If this labels exists, we have already been created,
* so just reset the correct port.
*/
if (portName != null) {
ctlSigs.setPort(this.port);
receiver.setPort(this.port);
transmitter.setPort(this.port);
}
else {
/*
* Create the User Interface objects
*/
display = new Panel();
display.setLayout(new FlowLayout());
portName = new Label(portID.getName());
if (this.open) {
portName.setForeground(Color.green);
}
else if (this.waiting) {
portName.setForeground(Color.yellow);
}
else {
portName.setForeground(Color.red);
}
portName.addMouseListener(this);
display.add(portName);
mode = new LPTMode(this);
display.add(mode);
this.add("North", display);
ctlSigs = new CtlSigDisplay(port);
this.add("South", ctlSigs);
textPanel = new Panel();
textPanel.setLayout(new BorderLayout());
receiver = new Receiver(this, 6, 40, this.rcvDelay);
textPanel.add("East", receiver);
transmitter = new Transmitter(this, 6, 40);
textPanel.add("West", transmitter);
this.add("Center", textPanel);
owner.addPanel(this);
}
}
protected void showValues() {
mode.showValue();
transmitter.showValues();
receiver.showValues();
ctlSigs.showValues();
ctlSigs.showErrorValues();
}
/*
* Handler for all parallel port events
*/
public void parallelEvent(ParallelPortEvent ev) {
if (this.port == null) {
System.out.println(port.getName()
+ "got parallel event on a closed port");
return;
}
switch (ev.getEventType()) {
case ParallelPortEvent.PAR_EV_ERROR:
this.ctlSigs.showErrorValues();
break;
/*
case ParallelPortEvent.DATA_AVAIL:
this.ctlSigs.DA = true;
this.ctlSigs.showErrorValues();
if (rcvThread != null)
{
synchronized (receiver) {
receiver.notify();
}
}
else if (threadRcv)
{
System.out.println(port.getName()
+ "Receive thread has died!");
rcvThread = new Thread(this.receiver,
"Rcv "
+ port.getName());
rcvThread.start();
}
else
{
this.receiver.readData();
}
break;
*/
case ParallelPortEvent.PAR_EV_BUFFER:
this.ctlSigs.BE = true;
this.ctlSigs.showErrorValues();
break;
}
}
/*
* Handler to open/close port
*/
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
// this.showValues();
if (this.open) {
this.closePBBPort();
}
else {
try {
openPBBPort();
}
catch (PortInUseException ex) {
System.out.println(portID.getName()
+ " is in use by "
+ ex.currentOwner);
}
}
}
public void mouseReleased(MouseEvent e) {
}
/*
* Handler for port ownership events.
*/
public void ownershipChange(int type) {
switch (type) {
case CommPortOwnershipListener.PORT_UNOWNED:
System.out.println(portID.getName()
+ ": PORT_UNOWNED");
if (this.waiting) {
/*
* Try to open the port
*/
try {
openPBBPort();
}
catch (PortInUseException e) {
System.out.println(portID.getName()
+ " s/b free but is in use by "
+ e.currentOwner);
}
}
break;
case CommPortOwnershipListener.PORT_OWNED:
System.out.println(portID.getName() + ": PORT_OWNED");
break;
case CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED:
System.out.println(portID.getName()
+ ": PORT_OWNERSHIP_REQUESTED");
if (this.friendly && this.open) {
/*
* Give up the port
*/
this.closePBBPort();
}
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -