📄 serialportdisplay.java
字号:
/*
* @(#)SerialPortDisplay.java 1.16 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.BlackBox;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
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 java.util.TooManyListenersException;
import javax.comm.CommPortIdentifier;
import javax.comm.CommPortOwnershipListener;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.PortInUseException;
import javax.comm.UnsupportedCommOperationException;
public class SerialPortDisplay extends Panel implements SerialPortEventListener, MouseListener, CommPortOwnershipListener
{
protected CommPortIdentifier portID;
protected SerialPort port = null;
protected InputStream in;
protected OutputStream out,
outSave;
protected boolean lineMonitor,
silentReceive,
modemMode,
open = false;
protected int numDataBits = 1;
private int rcvDelay;
private Thread rcvThread = null;
private BlackBox owner;
private boolean threadRcv,
friendly,
waiting = false;
Panel display,
statePanel,
textPanel;
Label portName = null;
BaudRate baudRate;
DataBits dataBits;
Parity parity;
StopBits stopBits;
CtlSigDisplay ctlSigs;
FlowCtlDisplay flowCtl;
Receiver receiver;
Transmitter transmitter;
public SerialPortDisplay(CommPortIdentifier portID,
boolean threadRcv,
boolean friendly,
boolean silentReceive,
boolean modemMode,
int rcvDelay,
BlackBox 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.silentReceive = silentReceive;
this.modemMode = modemMode;
this.openBBPort();
}
private boolean openBBPort() throws PortInUseException
{
/*
* If we are already open, do a close first.
*/
if (this.open)
{
this.closeBBPort();
}
/*
* Register an ownership listener so we can
* manage the port.
*/
this.portID.addPortOwnershipListener(this);
/*
* Try to open the port
*/
try
{
port = (SerialPort)
portID.open("BlackBox", 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
{
if (modemMode)
{
out = new ConvertedOutputStream(port.getOutputStream());
}
else
{
out = 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.notifyOnCTS(true);
port.notifyOnDSR(true);
port.notifyOnRingIndicator(true);
port.notifyOnCarrierDetect(true);
port.notifyOnOverrunError(true);
port.notifyOnParityError(true);
port.notifyOnFramingError(true);
port.notifyOnBreakInterrupt(true);
port.notifyOnDataAvailable(true);
port.notifyOnOutputEmpty(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 closeBBPort()
{
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);
flowCtl.setPort(this.port);
receiver.setPort(this.port);
transmitter.setPort(this.port);
transmitter.clearValues();
receiver.clearValues();
flowCtl.clearValues();
ctlSigs.clearValues();
ctlSigs.clearErrorValues();
this.showValues();
}
}
public SerialPort 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(SerialPortDisplay 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 hav already been created,
* so just reset the correct port.
*/
if (portName != null)
{
ctlSigs.setPort(this.port);
flowCtl.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);
baudRate = new BaudRate(this);
display.add(baudRate);
dataBits = new DataBits(this);
display.add(dataBits);
stopBits = new StopBits(this);
display.add(stopBits);
parity = new Parity(this);
display.add(parity);
this.add("North", display);
statePanel = new Panel();
statePanel.setLayout(new BorderLayout());
ctlSigs = new CtlSigDisplay(port);
statePanel.add("North", ctlSigs);
flowCtl = new FlowCtlDisplay(port);
statePanel.add("South", flowCtl);
this.add("South", statePanel);
textPanel = new Panel();
textPanel.setLayout(new BorderLayout());
receiver = new Receiver(this, 6, 40,
this.rcvDelay,
this.silentReceive);
textPanel.add("East", receiver);
transmitter = new Transmitter(this, 6, 40,
this.modemMode);
textPanel.add("West", transmitter);
this.add("Center", textPanel);
owner.addPanel(this);
}
}
protected void showValues()
{
baudRate.showValue();
dataBits.showValue();
stopBits.showValue();
parity.showValue();
transmitter.setBitsPerCharacter(numDataBits);
receiver.setBitsPerCharacter(numDataBits);
transmitter.showValues();
receiver.showValues();
flowCtl.showValues();
ctlSigs.showValues();
ctlSigs.showErrorValues();
}
/*
* Handler for all serial port events
*/
public void serialEvent(SerialPortEvent ev)
{
if (this.port == null)
{
System.out.println(port.getName()
+ "got serial event on a closed port");
return;
}
switch(ev.getEventType())
{
case SerialPortEvent.BI:
this.ctlSigs.BILabel.setState(ev.getNewValue());
break;
case SerialPortEvent.OE:
this.ctlSigs.OELabel.setState(ev.getNewValue());
break;
case SerialPortEvent.FE:
this.ctlSigs.FELabel.setState(ev.getNewValue());
break;
case SerialPortEvent.PE:
this.ctlSigs.PELabel.setState(ev.getNewValue());
break;
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
this.ctlSigs.showValues();
break;
case SerialPortEvent.DATA_AVAILABLE:
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 SerialPortEvent.OUTPUT_BUFFER_EMPTY:
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.closeBBPort();
}
else
{
try
{
openBBPort();
}
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
{
openBBPort();
}
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.closeBBPort();
}
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -