package com.intelligt.modbus.jlibmodbus.serial;
|
|
import com.intelligt.modbus.jlibmodbus.Modbus;
|
import com.intelligt.modbus.jlibmodbus.net.stream.base.ModbusInputStream;
|
import com.intelligt.modbus.jlibmodbus.net.stream.base.ModbusOutputStream;
|
|
import java.io.IOException;
|
|
/*
|
* Copyright (C) 2016 "Invertor" Factory", JSC
|
* [http://www.sbp-invertor.ru]
|
*
|
* This file is part of JLibModbus.
|
*
|
* Licensed 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.
|
*
|
* Authors: Vladislav Y. Kochedykov, software engineer.
|
* email: vladislav.kochedykov@gmail.com
|
*/
|
|
public abstract class SerialPort {
|
|
final private SerialParameters serialParameters;
|
private int readTimeout = Modbus.MAX_RESPONSE_TIMEOUT;
|
|
public SerialPort(SerialParameters sp) {
|
this.serialParameters = sp;
|
}
|
|
public SerialParameters getSerialParameters() {
|
return serialParameters;
|
}
|
|
public int getReadTimeout() {
|
return readTimeout;
|
}
|
|
public void setReadTimeout(int readTimeout) {
|
this.readTimeout = readTimeout;
|
}
|
|
public ModbusOutputStream getOutputStream() {
|
return new ModbusOutputStream() {
|
final private SerialPort serial = SerialPort.this;
|
|
@Override
|
public void flush() throws IOException {
|
try {
|
if (serial.isOpened()) {
|
serial.write(toByteArray());
|
}
|
} finally {
|
super.flush();
|
}
|
}
|
};
|
}
|
|
public ModbusInputStream getInputStream() {
|
|
return new ModbusInputStream() {
|
|
final private SerialPort serial = SerialPort.this;
|
|
@Override
|
public int read() throws IOException {
|
return serial.read() & 0xff;
|
}
|
|
@Override
|
public int read(byte[] b, int off, int len) throws IOException {
|
int size = 0;
|
while (size < len) {
|
size += serial.read(b, off + size, len - size);
|
}
|
return size;
|
}
|
|
@Override
|
public void setReadTimeout(int readTimeout) {
|
serial.setReadTimeout(readTimeout);
|
}
|
};
|
}
|
|
abstract public void write(int b) throws IOException;
|
|
abstract public void write(byte[] bytes) throws IOException;
|
|
abstract public void open() throws SerialPortException;
|
|
abstract public int read() throws IOException;
|
|
abstract public int read(byte[] b, int off, int len) throws IOException;
|
|
abstract public void close();
|
|
abstract public boolean isOpened();
|
|
public enum Parity {
|
NONE(0),
|
ODD(1),
|
EVEN(2),
|
MARK(3),
|
SPACE(4);
|
|
private final int value;
|
|
Parity(int value) {
|
this.value = value;
|
}
|
|
static public Parity getParity(Integer value) {
|
for (Parity par : Parity.values()) {
|
if (par.value == value) {
|
return par;
|
}
|
}
|
throw new IllegalArgumentException("Illegal parity value:" + value);
|
}
|
|
public int getValue() {
|
return value;
|
}
|
|
@Override
|
public String toString() {
|
return String.valueOf(value);
|
}
|
}
|
|
public enum BaudRate {
|
BAUD_RATE_4800(4800),
|
BAUD_RATE_9600(9600),
|
BAUD_RATE_14400(14400),
|
BAUD_RATE_19200(19200),
|
BAUD_RATE_38400(38400),
|
BAUD_RATE_57600(57600),
|
BAUD_RATE_115200(115200);
|
|
private final int value;
|
|
BaudRate(int value) {
|
this.value = value;
|
}
|
|
static public BaudRate getBaudRate(int value) {
|
for (BaudRate br : BaudRate.values()) {
|
if (br.value == value) {
|
return br;
|
}
|
}
|
throw new IllegalArgumentException("Illegal baud rate value:" + value);
|
}
|
|
public int getValue() {
|
return value;
|
}
|
|
@Override
|
public String toString() {
|
return String.valueOf(value);
|
}
|
}
|
}
|