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
+}


Reply via email to