package meitan;import javax.comm.*;
import java.io.*;
import java.awt.TextArea;
import java.awt.event.*;
import java.util.TooManyListenersException;public class SerialConnection implements SerialPortEventListener, 
 CommPortOwnershipListener {
    private SerialDemo parent;    private TextArea messageAreaOut;
    private TextArea messageAreaIn;
    private SerialParameters parameters;
    private OutputStream os;
    private InputStream is;
    private KeyHandler keyHandler;    private CommPortIdentifier portId;
    private SerialPort sPort;    private boolean open;
    public SerialConnection(SerialDemo parent,
    SerialParameters parameters,
    TextArea messageAreaOut,
    TextArea messageAreaIn) {
this.parent = parent;
this.parameters = parameters;
this.messageAreaOut = messageAreaOut;
this.messageAreaIn = messageAreaIn;
open = false;
   }
   public void openConnection() throws SerialConnectionException { // Obtain a CommPortIdentifier object for the port you want to open.
try {
    portId = 
 CommPortIdentifier.getPortIdentifier(parameters.getPortName());
} catch (NoSuchPortException e) {
    throw new SerialConnectionException(e.getMessage());
}
try {
    sPort = (SerialPort)portId.open("SerialDemo", 30000);
} catch (PortInUseException e) {
    throw new SerialConnectionException(e.getMessage());
}
try {
    setConnectionParameters();
} catch (SerialConnectionException e) {
    sPort.close();
    throw e;
}
try {
    os = sPort.getOutputStream();
    is = sPort.getInputStream();
} catch (IOException e) {
    sPort.close();
    throw new SerialConnectionException("Error opening i/o streams");
} keyHandler = new KeyHandler(os);
messageAreaOut.addKeyListener(keyHandler);
try {
    sPort.addEventListener(this);
} catch (TooManyListenersException e) {
    sPort.close();
    throw new SerialConnectionException("too many listeners added");
} sPort.notifyOnDataAvailable(true); sPort.notifyOnBreakInterrupt(true); try {
    sPort.enableReceiveTimeout(30);
} catch (UnsupportedCommOperationException e) {
} portId.addPortOwnershipListener(this); open = true;
    }
    public void setConnectionParameters() throws SerialConnectionException {
int oldBaudRate = sPort.getBaudRate();
int oldDatabits = sPort.getDataBits();
int oldStopbits = sPort.getStopBits();
int oldParity   = sPort.getParity();
int oldFlowControl = sPort.getFlowControlMode(); try {
    sPort.setSerialPortParams(parameters.getBaudRate(),
      parameters.getDatabits(),
      parameters.getStopbits(),
      parameters.getParity());
} catch (UnsupportedCommOperationException e) {
    parameters.setBaudRate(oldBaudRate);
    parameters.setDatabits(oldDatabits);
    parameters.setStopbits(oldStopbits);
    parameters.setParity(oldParity);
    throw new SerialConnectionException("Unsupported parameter");
} // Set flow control.
try {
    sPort.setFlowControlMode(parameters.getFlowControlIn() 
           | parameters.getFlowControlOut());
} catch (UnsupportedCommOperationException e) {
    throw new SerialConnectionException("Unsupported flow control");
}
    }
    public void closeConnection() {
// If port is alread closed just return.
if (!open) {
    return;
} // Remove the key listener.
messageAreaOut.removeKeyListener(keyHandler); // Check to make sure sPort has reference to avoid a NPE.
if (sPort != null) {
    try {
// close the i/o streams.
     os.close();
     is.close();
    } catch (IOException e) {
System.err.println(e);
    }     // Close the port.
    sPort.close();     // Remove the ownership listener.
    portId.removePortOwnershipListener(this);
} open = false;
    }
    public void sendBreak() {
sPort.sendBreak(1000);
    }
    public boolean isOpen() {
return open;
    }    public void serialEvent(SerialPortEvent e) {
  // Create a StringBuffer and int to receive input data.
StringBuffer inputBuffer = new StringBuffer();
int newData = 0; // Determine type of event.
switch (e.getEventType()) {     // Read data until -1 is returned. If \r is received substitute
    // \n for correct newline handling.
    case SerialPortEvent.DATA_AVAILABLE:
    while (newData != -1) {
     try {
         newData = is.read();
    if (newData == -1) {
break;
    }
    if ('\r' == (char)newData) {
    inputBuffer.append('\n');
    } else {
     inputBuffer.append((char)newData);
    }
     } catch (IOException ex) {
         System.err.println(ex);
         return;
       }
        } // Append received data to messageAreaIn.
messageAreaIn.append(new String(inputBuffer));
break;     // If break event append BREAK RECEIVED message.
    case SerialPortEvent.BI:
messageAreaIn.append("\n--- BREAK RECEIVED ---\n");
}    }   
    public void ownershipChange(int type) {
if (type == CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED) {
    PortRequestedDialog prd = new PortRequestedDialog(parent);
}
    }
    class KeyHandler extends KeyAdapter {
OutputStream os;
public KeyHandler(OutputStream os) {
    super();
    this.os = os;
}
        public void keyTyped(KeyEvent evt) {
            char newCharacter = evt.getKeyChar();
    try {
     os.write((int)newCharacter);
    } catch (IOException e) {
System.err.println("OutputStream write error: " + e);
    }
        }
    }
}