1 package kernel.serial_ports;
3 import gnu.io.PortInUseException;
4 import gnu.io.RXTXPort;
5 import gnu.io.UnsupportedCommOperationException;
6 import org.jetbrains.annotations.Contract;
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.io.OutputStream;
23 private static Logger log = LoggerFactory.getLogger(
RXTXPortWrapper.class);
28 private RXTXPort port;
35 private final String portName;
51 private Thread shutdownThread;
57 writeLogEntryForInitialization(portName);
58 this.portName = portName;
65 @Contract(pure =
true)
77 writeLogEntryForInputStreamRequest();
78 return this.port.getInputStream();
88 writeLogEntryForOutputStreamRequest();
89 return this.port.getOutputStream();
95 @Contract(pure =
true)
103 @Contract(pure =
true)
105 return this.port.getBaudRate();
111 @Contract(pure =
true)
113 return this.port.getStopBits();
119 @Contract(pure =
true)
121 return this.port.getDataBits();
127 @Contract(pure =
true)
129 return this.port.getParity();
137 this.desiredPortConfiguration = newConfig;
146 @Override
public void open() throws PortInUseException,
147 UnsupportedCommOperationException {
149 this.port =
new RXTXPort(this.portName);
152 shutdownThread =
new PortShutdown(
this);
153 Runtime.getRuntime().addShutdownHook(shutdownThread);
156 setConfigurationParametersForOpenPort();
157 }
catch (IOException error){
158 throw new UnsupportedCommOperationException(
159 "Unable to set port configuration parameters" 163 writeLogEntryForPortOpen();
182 Runtime.getRuntime().removeShutdownHook(shutdownThread);
184 writeLogEntryForPortClosed();
191 private void assertPortOpen()
throws IOException {
193 throw new IOException(
"Attempted to access a resource that " +
194 "requires the port to be open");
205 private void setConfigurationParametersForOpenPort()
throws 206 UnsupportedCommOperationException, IOException {
208 int baudRate = desiredPortConfiguration.
getBaudRate();
209 int dataBits = desiredPortConfiguration.
getDataBits();
210 int stopBits = desiredPortConfiguration.
getStopBits();
213 this.port.setSerialPortParams(
214 baudRate, dataBits, stopBits, parityBits
217 writeLogEntryForParametersSet(baudRate, dataBits, stopBits,
224 private void writeLogEntryForInitialization(String portName){
226 "Port wrapper initialized for RS232 port with name {}",
235 private void writeLogEntryForInputStreamRequest(){
237 "Input stream requested for RS232 port {}", this.portName
245 private void writeLogEntryForOutputStreamRequest(){
247 "Output stream requested for RS232 port {}", this.portName
261 private void writeLogEntryForParametersSet(
262 int baudRate,
int dataBits,
int stopBits,
int parityBits
264 String parameterTemplate =
"Parameter {} for port {} was set to {}.";
267 parameterTemplate,
"Baud Rate", portName, baudRate
270 parameterTemplate,
"Data Bits", portName, dataBits
273 parameterTemplate,
"Stop Bits", portName, stopBits
276 parameterTemplate,
"Stop Bits", portName, parityBits
280 private void writeLogEntryForPortOpen(){
281 log.info(
"Port {} was opened.", portName);
284 private void writeLogEntryForPortClosed(){
285 log.info(
"Port {} was closed", portName);
292 private final class PortShutdown
extends Thread {
297 private final Logger log = LoggerFactory.getLogger(PortShutdown.class);
316 log.info(
"Port {} caught shutdown signal. Closing", portName);
318 log.info(
"Port {} successfully closed", portName);
OutputStream getOutputStream()
PortCommunicator getCommunicator()
PortConfiguration getConfig()
InputStream getInputStream()
void setConfig(PortConfiguration newConfig)