1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.transport.serial;
21
22 import gnu.io.CommPortIdentifier;
23 import gnu.io.PortInUseException;
24 import gnu.io.SerialPort;
25 import gnu.io.UnsupportedCommOperationException;
26
27 import java.io.IOException;
28 import java.net.SocketAddress;
29 import java.util.Enumeration;
30 import java.util.TooManyListenersException;
31 import java.util.concurrent.Executor;
32
33 import org.apache.mina.core.future.ConnectFuture;
34 import org.apache.mina.core.future.DefaultConnectFuture;
35 import org.apache.mina.core.service.AbstractIoConnector;
36 import org.apache.mina.core.service.IoConnector;
37 import org.apache.mina.core.service.TransportMetadata;
38 import org.apache.mina.core.session.IdleStatusChecker;
39 import org.apache.mina.core.session.IoSessionConfig;
40 import org.apache.mina.core.session.IoSessionInitializer;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
43
44
45
46
47
48
49 public final class SerialConnector extends AbstractIoConnector {
50 private final Logger log;
51
52 private IdleStatusChecker idleChecker;
53
54 public SerialConnector() {
55 this(null);
56 }
57
58 public SerialConnector(Executor executor) {
59 super(new DefaultSerialSessionConfig(), executor);
60 log = LoggerFactory.getLogger(SerialConnector.class);
61
62 idleChecker = new IdleStatusChecker();
63
64
65 executeWorker(idleChecker.getNotifyingTask(), "idleStatusChecker");
66
67 }
68
69 @Override
70 protected synchronized ConnectFuture connect0(SocketAddress remoteAddress, SocketAddress localAddress,
71 IoSessionInitializer<? extends ConnectFuture> sessionInitializer) {
72
73 CommPortIdentifier portId;
74 Enumeration<?> portList = CommPortIdentifier.getPortIdentifiers();
75
76 SerialAddress portAddress = (SerialAddress) remoteAddress;
77
78
79 while (portList.hasMoreElements()) {
80 portId = (CommPortIdentifier) portList.nextElement();
81 if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
82 if (log.isDebugEnabled()) {
83 log.debug("Serial port discovered : " + portId.getName());
84 }
85 if (portId.getName().equals(portAddress.getName())) {
86 try {
87 if (log.isDebugEnabled()) {
88 log.debug("Serial port found : " + portId.getName());
89 }
90
91 SerialPort serialPort = initializePort("Apache MINA", portId, portAddress);
92
93 ConnectFuture future = new DefaultConnectFuture();
94 SerialSessionImpl session = new SerialSessionImpl(this, getListeners(), portAddress, serialPort);
95 initSession(session, future, sessionInitializer);
96 session.start();
97 return future;
98 } catch (PortInUseException e) {
99 if (log.isDebugEnabled()) {
100 log.debug("Port In Use Exception : ", e);
101 }
102 return DefaultConnectFuture.newFailedFuture(e);
103 } catch (UnsupportedCommOperationException e) {
104 if (log.isDebugEnabled()) {
105 log.debug("Comm Exception : ", e);
106 }
107 return DefaultConnectFuture.newFailedFuture(e);
108 } catch (IOException e) {
109 if (log.isDebugEnabled()) {
110 log.debug("IOException : ", e);
111 }
112 return DefaultConnectFuture.newFailedFuture(e);
113 } catch (TooManyListenersException e) {
114 if (log.isDebugEnabled()) {
115 log.debug("TooManyListenersException : ", e);
116 }
117 return DefaultConnectFuture.newFailedFuture(e);
118 }
119 }
120 }
121 }
122
123 return DefaultConnectFuture.newFailedFuture(new SerialPortUnavailableException("Serial port not found"));
124 }
125
126 @Override
127 protected void dispose0() throws Exception {
128
129 idleChecker.getNotifyingTask().cancel();
130 }
131
132 public TransportMetadata getTransportMetadata() {
133 return SerialSessionImpl.METADATA;
134 }
135
136 private SerialPort initializePort(String user, CommPortIdentifier portId, SerialAddress portAddress)
137 throws UnsupportedCommOperationException, PortInUseException {
138
139 SerialSessionConfig config = (SerialSessionConfig) getSessionConfig();
140
141 long connectTimeout = getConnectTimeoutMillis();
142 if (connectTimeout > Integer.MAX_VALUE) {
143 connectTimeout = Integer.MAX_VALUE;
144 }
145
146 SerialPort serialPort = (SerialPort) portId.open(user, (int) connectTimeout);
147
148 serialPort.setSerialPortParams(portAddress.getBauds(), portAddress.getDataBitsForRXTX(),
149 portAddress.getStopBitsForRXTX(), portAddress.getParityForRXTX());
150
151 serialPort.setFlowControlMode(portAddress.getFLowControlForRXTX());
152
153 serialPort.notifyOnDataAvailable(true);
154
155 if (config.isLowLatency()) {
156 serialPort.setLowLatency();
157 }
158
159 serialPort.setInputBufferSize(config.getInputBufferSize());
160 serialPort.setOutputBufferSize(config.getOutputBufferSize());
161
162 if (config.getReceiveThreshold() >= 0) {
163 serialPort.enableReceiveThreshold(config.getReceiveThreshold());
164 } else {
165 serialPort.disableReceiveThreshold();
166 }
167
168 return serialPort;
169 }
170
171 IdleStatusChecker getIdleStatusChecker0() {
172 return idleChecker;
173 }
174
175 public IoSessionConfig getSessionConfig() {
176 return sessionConfig;
177 }
178 }