Author: jvermillard
Date: Wed Dec 13 09:38:23 2006
New Revision: 486773
URL: http://svn.apache.org/viewvc?view=rev&rev=486773
Log:
start of serial communication implementation for MINA trunk
Added:
mina/sandbox/jvermillard/serial/src/main/java/
mina/sandbox/jvermillard/serial/src/main/java/org/
mina/sandbox/jvermillard/serial/src/main/java/org/apache/
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/DefaultSerialSessionConfig.java
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialFilterChain.java
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialPortAddress.java
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSession.java
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSessionConfig.java
Added:
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/DefaultSerialSessionConfig.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/DefaultSerialSessionConfig.java?view=auto&rev=486773
==============================================================================
---
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/DefaultSerialSessionConfig.java
(added)
+++
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/DefaultSerialSessionConfig.java
Wed Dec 13 09:38:23 2006
@@ -0,0 +1,16 @@
+package org.apache.mina.transport.serial;
+
+public class DefaultSerialSessionConfig implements SerialSessionConfig
+{
+
+ public DefaultSerialSessionConfig()
+ {
+
+ }
+
+ @Override
+ public Object clone()
+ {
+ return new DefaultSerialSessionConfig();
+ }
+}
Added:
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java?view=auto&rev=486773
==============================================================================
---
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java
(added)
+++
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java
Wed Dec 13 09:38:23 2006
@@ -0,0 +1,101 @@
+package org.apache.mina.transport.serial;
+
+import java.io.IOException;
+import java.net.SocketAddress;
+import java.util.Enumeration;
+import java.util.TooManyListenersException;
+
+import javax.comm.CommPortIdentifier;
+import javax.comm.PortInUseException;
+import javax.comm.SerialPort;
+import javax.comm.UnsupportedCommOperationException;
+
+import org.apache.mina.common.ConnectFuture;
+import org.apache.mina.common.IoSessionConfig;
+import org.apache.mina.common.support.BaseIoConnector;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SerialConnector extends BaseIoConnector
+{
+ private Logger log;
+
+ public SerialConnector()
+ {
+ super(new DefaultSerialSessionConfig());
+ log=LoggerFactory.getLogger(SerialConnector.class);
+ }
+
+ @Override
+ protected Class<? extends SocketAddress> getAddressType() {
+ return SerialPortAddress.class;
+ }
+
+ @Override
+ protected Class<? extends IoSessionConfig> getSessionConfigType() {
+ return SerialSessionConfig.class;
+ }
+
+ @Override
+ protected ConnectFuture doConnect(SocketAddress remoteAddress,
SocketAddress localAddress) {
+ if( ! (remoteAddress instanceof SerialPortAddress) )
+ {
+ throw new IllegalArgumentException("Bad SocketAddress,
need a SerialPortAddress");
+ }
+
+ CommPortIdentifier portId;
+ Enumeration portList = CommPortIdentifier.getPortIdentifiers();
+
+ SerialPortAddress portAddress = (SerialPortAddress)
remoteAddress;
+
+ // looping around found ports
+ while (portList.hasMoreElements())
+ {
+ portId = (CommPortIdentifier) portList.nextElement();
+ if (portId.getPortType() ==
CommPortIdentifier.PORT_SERIAL)
+ {
+ if(log.isDebugEnabled())
+ {
+ log.debug("Serial port discovered :
"+portId.getName());
+ }
+ if
(portId.getName().equals(portAddress.getName())) {
+ try {
+ if(log.isDebugEnabled())
+ {
+ log.debug("Serial port
found : "+portId.getName());
+ }
+ SerialPort serialPort =
(SerialPort) portId.open(
+ "Apache MINA",
2000); // TODO: need a parameter for millisec. timeout
+
+
serialPort.setSerialPortParams(portAddress.getBauds(),
+
portAddress.getDataBitsForRXTX(),portAddress.getStopBitsForRXTX(),
+
portAddress.getParityForRXTX());
+
serialPort.setFlowControlMode(portAddress.getFLowControlForRXTX());
+
+ // TODO : receive threshold
+ //
serialPort.enableReceiveThreshold(receiveThreshold); /* bytes */
+ // TODO : reveive Timeout
serialPort.enableReceiveTimeout(10); /* milliseconds */
+
+ // TODO : create serial session
+ outputStream = serialPort
+
.getOutputStream();
+ inputStream =
serialPort.getInputStream();
+
+
serialPort.notifyOnDataAvailable(true);
+
serialPort.addEventListener(this);
+
+ } catch (PortInUseException e) {
+ e.printStackTrace();
+ } catch
(UnsupportedCommOperationException e1) {
+ e1.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (TooManyListenersException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ return null;
+ }
+}
Added:
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialFilterChain.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialFilterChain.java?view=auto&rev=486773
==============================================================================
---
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialFilterChain.java
(added)
+++
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialFilterChain.java
Wed Dec 13 09:38:23 2006
@@ -0,0 +1,25 @@
+package org.apache.mina.transport.serial;
+
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.IoFilter.WriteRequest;
+import org.apache.mina.common.support.AbstractIoFilterChain;
+
+public class SerialFilterChain extends AbstractIoFilterChain {
+
+ protected SerialFilterChain(IoSession session) {
+ super(session);
+ }
+
+ @Override
+ protected void doClose(IoSession session) throws Exception {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected void doWrite(IoSession session, WriteRequest writeRequest)
throws Exception {
+ // TODO Auto-generated method stub
+
+ }
+
+}
Added:
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialPortAddress.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialPortAddress.java?view=auto&rev=486773
==============================================================================
---
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialPortAddress.java
(added)
+++
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialPortAddress.java
Wed Dec 13 09:38:23 2006
@@ -0,0 +1,185 @@
+/*
+ * 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 java.net.SocketAddress;
+import java.security.InvalidParameterException;
+
+import javax.comm.SerialPort;
+import javax.naming.directory.InvalidAttributesException;
+
+public class SerialPortAddress extends SocketAddress {
+
+ private static final long serialVersionUID = 1735370510442384505L;
+
+ public enum DataBits
+ {
+ DATABITS_5,
+ DATABITS_6,
+ DATABITS_7,
+ DATABITS_8
+ }
+
+ public enum Parity
+ {
+ PARITY_NONE,
+ PARITY_ODD,
+ PARITY_EVEN,
+ PARITY_MARK,
+ PARITY_SPACE
+ }
+
+ public enum StopBits
+ {
+ STOP_BITS_1,
+ STOP_BITS_2,
+ STOP_BITS_1_5
+ }
+
+ public enum FlowControl {
+ FLOWCONTROL_NONE,
+ FLOWCONTROL_RTSCTS_IN,
+ FLOWCONTROL_RTSCTS_OUT,
+ FLOWCONTROL_XONXOFF_IN,
+ FLOWCONTROL_XONXOFF_OUT
+ }
+
+ private String name;
+ private int bauds;
+ private DataBits dataBits;
+ private StopBits stopBits;
+ private Parity parity;
+ private FlowControl flowControl;
+
+
+ public SerialPortAddress(String name, int bauds, DataBits dataBits,
StopBits stopBits,
+ Parity parity, FlowControl flowControl)
+ {
+ super();
+ this.name = name;
+ this.bauds = bauds;
+ this.dataBits = dataBits;
+ this.stopBits = stopBits;
+ this.parity = parity;
+ this.flowControl = flowControl;
+ }
+
+ public int getBauds() {
+ return bauds;
+ }
+
+ public DataBits getDataBits() {
+ return dataBits;
+ }
+
+ public FlowControl getFlowControl() {
+ return flowControl;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Parity getParity() {
+ return parity;
+ }
+
+ public StopBits getStopBits() {
+ return stopBits;
+ }
+
+ public String toString() {
+ return
"serial("+name+",bauds:"+bauds+",databits:"+dataBits+",stopbits:"+stopBits+",parity:"+parity+",flowcontrol:"+flowControl+")";
+ }
+
+ public static void main(String[] args) {
+ SerialPortAddress addy=new
SerialPortAddress("/dev/ttyS0",9600,DataBits.DATABITS_8,StopBits.STOP_BITS_1,Parity.PARITY_NONE,FlowControl.FLOWCONTROL_NONE);
+ System.err.println("serial : "+addy);
+
+ }
+
+
+ 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 STOP_BITS_1:
+ return SerialPort.STOPBITS_1;
+ case STOP_BITS_1_5:
+ return SerialPort.STOPBITS_1_5;
+ case STOP_BITS_2:
+ return SerialPort.STOPBITS_2;
+ }
+ throw new InvalidParameterException( "broken stopbits");
+ }
+
+ int getParityForRXTX()
+ {
+ switch (parity)
+ {
+ case PARITY_EVEN:
+ return SerialPort.PARITY_EVEN;
+ case PARITY_MARK:
+ return SerialPort.PARITY_MARK;
+ case PARITY_NONE:
+ return SerialPort.PARITY_NONE;
+ case PARITY_ODD:
+ return SerialPort.PARITY_ODD;
+ case PARITY_SPACE:
+ return SerialPort.PARITY_SPACE;
+ }
+ throw new InvalidParameterException( "broken parity");
+ }
+
+ int getFLowControlForRXTX() {
+ switch(flowControl)
+ {
+ case FLOWCONTROL_NONE:
+ return SerialPort.FLOWCONTROL_NONE;
+ case FLOWCONTROL_RTSCTS_IN:
+ return SerialPort.FLOWCONTROL_RTSCTS_IN;
+ case FLOWCONTROL_RTSCTS_OUT:
+ return SerialPort.FLOWCONTROL_RTSCTS_OUT;
+ case FLOWCONTROL_XONXOFF_IN:
+ return SerialPort.FLOWCONTROL_XONXOFF_IN;
+ case FLOWCONTROL_XONXOFF_OUT:
+ return SerialPort.FLOWCONTROL_XONXOFF_OUT;
+ }
+ throw new InvalidParameterException( "broken stopbits");
+ }
+}
\ No newline at end of file
Added:
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSession.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSession.java?view=auto&rev=486773
==============================================================================
---
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSession.java
(added)
+++
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSession.java
Wed Dec 13 09:38:23 2006
@@ -0,0 +1,75 @@
+package org.apache.mina.transport.serial;
+
+import java.net.SocketAddress;
+import java.util.LinkedList;
+import java.util.Queue;
+
+import org.apache.mina.common.IoFilterChain;
+import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoService;
+import org.apache.mina.common.IoSessionConfig;
+import org.apache.mina.common.TransportType;
+import org.apache.mina.common.IoFilter.WriteRequest;
+import org.apache.mina.common.support.BaseIoSession;
+
+public class SerialSession extends BaseIoSession {
+
+ private SerialSessionConfig config;
+ private IoHandler ioHandler;
+ private IoFilterChain filterChain;
+ private IoService service;
+ private SerialPortAddress address;
+ private final Queue<WriteRequest> writeRequestQueue;
+
+ public SerialSession(IoService service, SerialPortAddress address)
+ {
+ this.service = service;
+ this.ioHandler = service.getHandler();
+ this.filterChain = new SerialFilterChain( this );
+ this.writeRequestQueue = new LinkedList<WriteRequest>();
+ }
+
+ @Override
+ protected void updateTrafficMask() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public IoSessionConfig getConfig() {
+ return config;
+ }
+
+ public IoFilterChain getFilterChain() {
+ return filterChain;
+ }
+
+ public IoHandler getHandler() {
+ return ioHandler;
+ }
+
+ public SocketAddress getLocalAddress() {
+ return null; // not applicable
+ }
+
+ public SocketAddress getRemoteAddress() {
+ return address;
+ }
+
+ public int getScheduledWriteBytes() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getScheduledWriteMessages() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public IoService getService() {
+ return service;
+ }
+
+ public TransportType getTransportType() {
+ return TransportType.getInstance("SERIAL");
+ }
+}
\ No newline at end of file
Added:
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSessionConfig.java
URL:
http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSessionConfig.java?view=auto&rev=486773
==============================================================================
---
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSessionConfig.java
(added)
+++
mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSessionConfig.java
Wed Dec 13 09:38:23 2006
@@ -0,0 +1,7 @@
+package org.apache.mina.transport.serial;
+
+import org.apache.mina.common.IoSessionConfig;
+
+public interface SerialSessionConfig extends IoSessionConfig {
+// TODO : low latency and other SerialPort params
+}