blob: b5af50e5b628971a4ce85e610c1c1ea3a1f78319 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.mina.transport.serial;
import gnu.io.SerialPort;
import java.net.SocketAddress;
import java.security.InvalidParameterException;
/**
* An address for a serial port communication.
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
public class SerialAddress extends SocketAddress {
private static final long serialVersionUID = 1735370510442384505L;
/**
* The number of data bits per byte
*/
public enum DataBits {
/** 5 bits per bytes */
DATABITS_5,
/** 6 bits per bytes */
DATABITS_6,
/** 7 bits per bytes */
DATABITS_7,
/** 8 bits per bytes */
DATABITS_8
}
/**
* The error detection parity in use
*
*/
public enum Parity {
/** No parity bit sent */
NONE,
/** Odd parity */
ODD,
/** Even parity */
EVEN,
/** Mark signal condition */
MARK,
/**Space signal condition */
SPACE
}
/**
* Stop bits in use
*/
public enum StopBits {
/** One bit */
BITS_1,
/** Two bits */
BITS_2,
/** one and half bits */
BITS_1_5
}
/**
* The Flow control flags
*/
public enum FlowControl {
/** No flow control */
NONE,
/** RTS/CTS IN flow control */
RTSCTS_IN,
/** RTS/CTS OUT flow control */
RTSCTS_OUT,
/** RTS/CTS IN/OUT flow control */
RTSCTS_IN_OUT,
/** XON/XOFF IN flow control */
XONXOFF_IN,
/** XON/XOFF OUT flow control */
XONXOFF_OUT,
/** XON/XOFF IN/OUT flow control */
XONXOFF_IN_OUT
}
private final String name;
private final int bauds;
private final DataBits dataBits;
private final StopBits stopBits;
private final Parity parity;
private final FlowControl flowControl;
/**
* Create an address for a serial communication, associating a serial interface and
* various serial signal carcteristics.
* @param name name of the device, COM1 COM2 for Windows, /dev/ttyS0 for Unix
* @param bauds baud rate for the communication
* @param dataBits number of data bits per bytes
* @param stopBits number of stop bits
* @param parity parity used
* @param flowControl flow control used
*/
public SerialAddress(String name, int bauds, DataBits dataBits, StopBits stopBits, Parity parity,
FlowControl flowControl) {
if (name == null) {
throw new IllegalArgumentException("name");
}
name = name.trim();
if (name.length() == 0) {
throw new IllegalArgumentException("Empty name.");
}
if (bauds <= 0) {
throw new IllegalArgumentException("bauds: " + bauds);
}
if (dataBits == null) {
throw new IllegalArgumentException("dataBits");
}
if (stopBits == null) {
throw new IllegalArgumentException("stopBits");
}
if (parity == null) {
throw new IllegalArgumentException("parity");
}
if (flowControl == null) {
throw new IllegalArgumentException("flowControl");
}
this.name = name;
this.bauds = bauds;
this.dataBits = dataBits;
this.stopBits = stopBits;
this.parity = parity;
this.flowControl = flowControl;
}
/**
* Bauds rate for the communication.
* @return the bauds (bits per seconds) for this serial link
*/
public int getBauds() {
return bauds;
}
/**
* Number of data bits for each communicated bytes.
* @return the data bits
*/
public DataBits getDataBits() {
return dataBits;
}
/**
* The flow control policie used for this communication.
* @return the flow control
*/
public FlowControl getFlowControl() {
return flowControl;
}
/**
* The name of the device. Can be COM1, COM2, /dev/ttyS0, /dev/ttyUSB1, etc..
* @return name
*/
public String getName() {
return name;
}
/**
* The parity check for this communication.
* @return parity type
*/
public Parity getParity() {
return parity;
}
/**
* Number of stop bits used.
* @return stop bits number
*/
public StopBits getStopBits() {
return stopBits;
}
/**
* Convert this serial address to a human readable string.
*/
@Override
public String toString() {
return name + " (bauds: " + bauds + ", dataBits: " + dataBits + ", stopBits: " + stopBits + ", parity: "
+ parity + ", flowControl: " + flowControl + ")";
}
int getDataBitsForRXTX() {
switch (dataBits) {
case DATABITS_5:
return SerialPort.DATABITS_5;
case DATABITS_6:
return SerialPort.DATABITS_6;
case DATABITS_7:
return SerialPort.DATABITS_7;
case DATABITS_8:
return SerialPort.DATABITS_8;
}
throw new InvalidParameterException("broken databits");
}
int getStopBitsForRXTX() {
switch (stopBits) {
case BITS_1:
return SerialPort.STOPBITS_1;
case BITS_1_5:
return SerialPort.STOPBITS_1_5;
case BITS_2:
return SerialPort.STOPBITS_2;
}
throw new InvalidParameterException("broken stopbits");
}
int getParityForRXTX() {
switch (parity) {
case EVEN:
return SerialPort.PARITY_EVEN;
case MARK:
return SerialPort.PARITY_MARK;
case NONE:
return SerialPort.PARITY_NONE;
case ODD:
return SerialPort.PARITY_ODD;
case SPACE:
return SerialPort.PARITY_SPACE;
}
throw new InvalidParameterException("broken parity");
}
int getFLowControlForRXTX() {
switch (flowControl) {
case NONE:
return SerialPort.FLOWCONTROL_NONE;
case RTSCTS_IN:
return SerialPort.FLOWCONTROL_RTSCTS_IN;
case RTSCTS_OUT:
return SerialPort.FLOWCONTROL_RTSCTS_OUT;
case RTSCTS_IN_OUT:
return SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT;
case XONXOFF_IN:
return SerialPort.FLOWCONTROL_XONXOFF_IN;
case XONXOFF_OUT:
return SerialPort.FLOWCONTROL_XONXOFF_OUT;
case XONXOFF_IN_OUT:
return SerialPort.FLOWCONTROL_XONXOFF_IN | SerialPort.FLOWCONTROL_XONXOFF_OUT;
}
throw new InvalidParameterException("broken flow control");
}
}