You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by jv...@apache.org on 2007/02/02 11:39:44 UTC

svn commit: r502570 - in /mina/sandbox/jvermillard/serial/src: main/java/org/apache/mina/transport/serial/ test/ test/java/ test/java/archean/ test/java/archean/pa/ test/java/archean/pa/serialconsole/ test/java/archean/pa/serialconsole/protocol/

Author: jvermillard
Date: Fri Feb  2 02:39:42 2007
New Revision: 502570

URL: http://svn.apache.org/viewvc?view=rev&rev=502570
Log:
refactored class names, created the default config object and a temporary latency test for helping in design choices

Added:
    mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialAddress.java
      - copied, changed from r495609, mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialPortAddress.java
    mina/sandbox/jvermillard/serial/src/test/
    mina/sandbox/jvermillard/serial/src/test/java/
    mina/sandbox/jvermillard/serial/src/test/java/TestSerialLatency.java
    mina/sandbox/jvermillard/serial/src/test/java/archean/
    mina/sandbox/jvermillard/serial/src/test/java/archean/pa/
    mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/
    mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/
    mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/BusMessage.java
    mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/ReadCommand.java
    mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/ReadCommandReply.java
    mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/SerialConsoleDecoder.java
    mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/SerialConsoleEncoder.java
    mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/WriteCommand.java
    mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/WriteCommandReply.java
Removed:
    mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialPortAddress.java
Modified:
    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/SerialSession.java
    mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSessionConfig.java

Modified: 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=diff&rev=502570&r1=502569&r2=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/DefaultSerialSessionConfig.java (original)
+++ mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/DefaultSerialSessionConfig.java Fri Feb  2 02:39:42 2007
@@ -3,6 +3,10 @@
 public class DefaultSerialSessionConfig implements SerialSessionConfig 
 {
 
+	private int inputBufferSize=8;
+	
+	private boolean lowLatency=false;
+	
 	public DefaultSerialSessionConfig() 
 	{
 
@@ -12,5 +16,21 @@
 	public Object clone() 
 	{
 		return new DefaultSerialSessionConfig();
+	}
+
+	public int getInputBufferSize() {
+		return inputBufferSize;
+	}
+
+	public boolean isLowLantecy() {
+		return lowLatency;
+	}
+
+	public void setInputBufferSize(int bufferSize) {
+		this.inputBufferSize=bufferSize;
+	}
+
+	public void setLowLatency(boolean lowLatency) {
+		this.lowLatency=lowLatency;
 	}
 }

Copied: mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialAddress.java (from r495609, 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/SerialAddress.java?view=diff&rev=502570&p1=mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialPortAddress.java&r1=495609&p2=mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialAddress.java&r2=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialPortAddress.java (original)
+++ mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialAddress.java Fri Feb  2 02:39:42 2007
@@ -25,7 +25,7 @@
 
 import javax.comm.SerialPort;
 
-public class SerialPortAddress extends SocketAddress {
+public class SerialAddress extends SocketAddress {
 	
 	private static final long serialVersionUID = 1735370510442384505L;
 
@@ -69,7 +69,7 @@
 	private FlowControl flowControl;
 
 	
-	public SerialPortAddress(String name, int bauds, int dataBits, StopBits stopBits,
+	public SerialAddress(String name, int bauds, int dataBits, StopBits stopBits,
 			Parity parity, FlowControl flowControl) 
 	{
 		super();

Modified: 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=diff&rev=502570&r1=502569&r2=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java (original)
+++ mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialConnector.java Fri Feb  2 02:39:42 2007
@@ -37,7 +37,7 @@
 
 	@Override
 	protected ConnectFuture doConnect(SocketAddress remoteAddress, SocketAddress localAddress) {
-		if( ! (remoteAddress instanceof SerialPortAddress) ) 
+		if( ! (remoteAddress instanceof SerialAddress) ) 
 		{
 			throw new IllegalArgumentException("Bad SocketAddress, need a SerialPortAddress");
 		}
@@ -45,7 +45,7 @@
 		CommPortIdentifier portId;
 		Enumeration portList = CommPortIdentifier.getPortIdentifiers();
 		
-		SerialPortAddress portAddress = (SerialPortAddress) remoteAddress;
+		SerialAddress portAddress = (SerialAddress) remoteAddress;
 		
 		// looping around found ports
 		while (portList.hasMoreElements()) 

Modified: 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=diff&rev=502570&r1=502569&r2=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSession.java (original)
+++ mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSession.java Fri Feb  2 02:39:42 2007
@@ -36,7 +36,7 @@
 
 	private IoService service;
 
-	private SerialPortAddress address;
+	private SerialAddress address;
 
 	private final Queue<WriteRequest> writeRequestQueue;
 
@@ -49,10 +49,10 @@
 	private Logger log;
 	
 	
-	public static final TransportType serialTransportType = new DefaultTransportType( "serial communication", false, SerialPortAddress.class,
+	public static final TransportType serialTransportType = new DefaultTransportType( "serial communication", false, SerialAddress.class,
 				ByteBuffer.class, SerialSessionConfig.class );
 
-	SerialSession(IoService service, SerialPortAddress address, SerialPort port) {
+	SerialSession(IoService service, SerialAddress address, SerialPort port) {
 		this.service = service;
 		this.ioHandler = service.getHandler();
 		this.filterChain = new SerialFilterChain(this);

Modified: 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=diff&rev=502570&r1=502569&r2=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSessionConfig.java (original)
+++ mina/sandbox/jvermillard/serial/src/main/java/org/apache/mina/transport/serial/SerialSessionConfig.java Fri Feb  2 02:39:42 2007
@@ -3,5 +3,12 @@
 import org.apache.mina.common.IoSessionConfig;
 
 public interface SerialSessionConfig extends IoSessionConfig {
-// TODO : low latency and other SerialPort params
+	
+	int getInputBufferSize();
+	
+	void setInputBufferSize(int bufferSize);
+	
+	boolean isLowLantecy();
+	
+	void setLowLatency(boolean lowLatency);
 }

Added: mina/sandbox/jvermillard/serial/src/test/java/TestSerialLatency.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/test/java/TestSerialLatency.java?view=auto&rev=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/test/java/TestSerialLatency.java (added)
+++ mina/sandbox/jvermillard/serial/src/test/java/TestSerialLatency.java Fri Feb  2 02:39:42 2007
@@ -0,0 +1,106 @@
+import org.apache.log4j.BasicConfigurator;
+import org.apache.mina.common.ConnectFuture;
+import org.apache.mina.common.IdleStatus;
+import org.apache.mina.common.IoHandler;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.filter.codec.ProtocolCodecFactory;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.filter.codec.ProtocolDecoder;
+import org.apache.mina.filter.codec.ProtocolEncoder;
+import org.apache.mina.transport.serial.SerialAddress;
+import org.apache.mina.transport.serial.SerialConnector;
+import org.apache.mina.transport.serial.SerialAddress.FlowControl;
+import org.apache.mina.transport.serial.SerialAddress.Parity;
+import org.apache.mina.transport.serial.SerialAddress.StopBits;
+
+import archean.pa.serialconsole.protocol.ReadCommand;
+import archean.pa.serialconsole.protocol.SerialConsoleDecoder;
+import archean.pa.serialconsole.protocol.SerialConsoleEncoder;
+
+
+public class TestSerialLatency {
+	public static void main(String[] args) {
+		BasicConfigurator.configure();
+		SerialConnector connector= new SerialConnector();
+		connector.setHandler(new IoHandler(){
+
+			public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
+				System.err.println("Exception : ");
+				cause.printStackTrace();
+				
+			}
+
+			public void messageReceived(IoSession session, Object message) throws Exception {
+				System.err.println("RCVD : "+message);
+			}
+
+			public void messageSent(IoSession session, Object message) throws Exception {
+				System.err.println("SENT : "+message);
+				
+			}
+
+			public void sessionClosed(IoSession session) throws Exception {
+				System.err.println("Session closed");
+				
+			}
+
+			public void sessionCreated(IoSession session) throws Exception {
+				System.err.println("Session created");
+				session.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ProtocolCodecFactory() {
+					final ProtocolDecoder DECODER=new SerialConsoleDecoder(true);
+					final ProtocolEncoder ENCODER=new SerialConsoleEncoder();
+					
+					public ProtocolDecoder getDecoder() throws Exception {
+						return DECODER;
+					}
+					
+					public ProtocolEncoder getEncoder() throws Exception {
+						return ENCODER;
+					}
+				} ));
+
+			}
+
+			public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
+				// TODO Auto-generated method stub
+				
+			}
+
+			public void sessionOpened(IoSession session) throws Exception {
+				System.err.println("Session open");
+				
+			}
+			
+		});
+		ConnectFuture future=connector.connect(new SerialAddress("/dev/ttyUSB0",38400,8,StopBits.BITS_1,Parity.NONE,FlowControl.NONE));
+		IoSession session=future.getSession();
+
+		try {
+			Thread.sleep(1000);
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		int i=0;
+		while(++i<1000) {
+			session.write(new ReadCommand(1,1,1));
+			try {
+				Thread.sleep(500);
+			} catch (InterruptedException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			
+		}
+//		session.write(ByteBuffer.wrap("Hello it's the serial communication !".getBytes()));
+//		
+//		try {
+//			Thread.sleep(5000);
+//		} catch (InterruptedException e) {
+//			// TODO Auto-generated catch block
+//			e.printStackTrace();
+//		}
+		session.close();
+	}
+}

Added: mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/BusMessage.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/BusMessage.java?view=auto&rev=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/BusMessage.java (added)
+++ mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/BusMessage.java Fri Feb  2 02:39:42 2007
@@ -0,0 +1,23 @@
+/*
+ * Created on 19 janv. 2006
+ *
+ */
+package archean.pa.serialconsole.protocol;
+
+public abstract class BusMessage {
+	private int targetAddress;
+	private int command;
+	
+	public BusMessage(int targetAddress,int command) {
+		this.targetAddress=targetAddress;
+		this.command=command;
+	}
+	
+	public int getTargetAddress() {
+		return targetAddress;
+	}
+	
+	public int getCommand() {
+		return command;
+	}
+}

Added: mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/ReadCommand.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/ReadCommand.java?view=auto&rev=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/ReadCommand.java (added)
+++ mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/ReadCommand.java Fri Feb  2 02:39:42 2007
@@ -0,0 +1,30 @@
+/*
+ * Created on 19 janv. 2006
+ *
+ */
+package archean.pa.serialconsole.protocol;
+
+public class ReadCommand extends BusMessage {
+
+	private int address;
+	private int count;
+	
+	public ReadCommand(int targetAddress,int address, int count) {
+		super(targetAddress, 3);
+		this.address=address;
+		this.count=count;
+	}
+
+	public int getAddress() {
+		return address;
+	}
+
+	public int getCount() {
+		return count;
+	}
+
+	@Override
+	public String toString() {
+		return "READ { device="+getTargetAddress()+", address="+address+", count="+count+"}";
+	}
+}

Added: mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/ReadCommandReply.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/ReadCommandReply.java?view=auto&rev=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/ReadCommandReply.java (added)
+++ mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/ReadCommandReply.java Fri Feb  2 02:39:42 2007
@@ -0,0 +1,34 @@
+/*
+ * Created on 19 janv. 2006
+ *
+ */
+package archean.pa.serialconsole.protocol;
+
+public class ReadCommandReply extends BusMessage {
+	private int[] values;
+
+	public ReadCommandReply(int targetAddress,int[] values) {
+		super(targetAddress, 3);
+		this.values=values;
+	}
+
+	public int[] getValues() {
+		return values;
+	}
+	
+	public String toString() {
+		return "READ REPLY { device="+getTargetAddress()+", values="+dumpValue()+" }";
+	}
+	
+	private String dumpValue() {
+		String res="(";
+		for(int i=0;i<values.length;i++) {
+			if(i>0)
+				res+=", ";
+			res+=values[i];
+		}
+		res+=")";
+		return res;
+	}
+
+}

Added: mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/SerialConsoleDecoder.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/SerialConsoleDecoder.java?view=auto&rev=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/SerialConsoleDecoder.java (added)
+++ mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/SerialConsoleDecoder.java Fri Feb  2 02:39:42 2007
@@ -0,0 +1,161 @@
+/*
+ * Created on 19 janv. 2006
+ *
+ */
+package archean.pa.serialconsole.protocol;
+
+import java.nio.ByteOrder;
+
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
+import org.apache.mina.filter.codec.ProtocolDecoderException;
+import org.apache.mina.filter.codec.ProtocolDecoderOutput;
+
+public class SerialConsoleDecoder extends CumulativeProtocolDecoder {
+
+	private boolean master;
+	
+	public SerialConsoleDecoder(boolean master) {
+		super();
+		this.master=master;
+	}
+	
+	@Override
+	protected boolean doDecode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) throws Exception {
+		System.err.println(">>>> DECODE : "+in.getHexDump());
+
+		in.order(ByteOrder.BIG_ENDIAN);
+        if(in.remaining()==1) {
+            if(in.get(0)==0) {
+                in.get();
+                in.sweep();
+            }
+            
+        }
+        
+		if(in.remaining()<2)
+			return false;
+		switch (in.get(1)) {
+		case 6: // WRITE COMMAND
+			if(in.remaining()<8)
+				return false;
+			/*else if(in.remaining()>8) {
+				// corruption !
+				//	consume
+				while(in.remaining()>0)
+					in.get();
+				throw new ProtocolDecoderException("Corrupted trame length for WRITE command");
+			}*/ else {
+				
+				// Ok !
+				
+				// Check CRC
+				in.position(6);
+				int calcCrc=calculateCRC(in);
+
+				in.rewind();
+						
+				// Unpack 
+				int add=in.getUnsigned(); // drop address
+				in.get(); // drop command
+				BusMessage bm;
+				if(master) {
+					bm=new WriteCommandReply(add,in.getUnsignedShort(),in.getUnsignedShort());
+				} else {
+					bm=new WriteCommand(add,in.getUnsignedShort(),in.getUnsignedShort());
+				}
+				in.order(ByteOrder.LITTLE_ENDIAN);
+				int crc=in.getUnsignedShort();
+
+				if(crc!=calcCrc) {
+					throw new ProtocolDecoderException("Corrupted CRC : "+crc+" in place of "+calcCrc);
+				}
+				out.write(bm);
+				return true;
+			}
+			//break;
+
+		case 3: // READ COMMAND
+			if(in.remaining()< 8)
+				return false;
+			/*else if(in.remaining()> 8) {
+				// corruption !
+				//	consume
+				while(in.remaining()>0)
+					in.get();
+				throw new ProtocolDecoderException("Corrupted trame length for READ command");
+			}*/ else {
+				// Ok !
+				
+				
+				String dump=in.toString();
+				// Check CRC
+				in.position(6);
+				int calcCrc=calculateCRC(in);
+				in.rewind();
+						
+				// Unpack 
+				int add=in.getUnsigned(); // drop address
+				in.get(); // drop command
+				BusMessage bm;
+				if(master) {
+					int count=in.getUnsignedShort();
+					int[] values=new int[count];
+					for(int i=0;i<count;i++) {
+						values[i]=in.getUnsignedShort();
+					}
+					bm=new ReadCommandReply(add,values);
+				} else {
+					bm=new ReadCommand(add,in.getUnsignedShort(),in.getUnsignedShort());
+				}
+				in.order(ByteOrder.LITTLE_ENDIAN);
+				int crc=in.getUnsignedShort();
+
+				
+				if(crc!=calcCrc) {
+					/*int pos=in.position();
+					in.rewind();
+
+					in.position(pos);*/
+					
+					throw new ProtocolDecoderException("Corrupted CRC : "+crc+" in place of "+calcCrc+" // "+dump);
+				}
+				out.write(bm);
+				return true;
+			}
+			// break;
+		default:
+			// consume 
+			while(in.remaining()>0)
+				in.get();
+			return true;
+		}
+	}
+	
+	
+	/**
+	 * rewind the buffer, compute CRC 
+	 * @param buf buffer to compute at the position of the 2 byte CRC slot
+	 */
+	private int calculateCRC(ByteBuffer buf) {
+		int end=buf.position();
+		buf.rewind();
+		if( buf.position()< end) {
+			int CRC = 0xFFFF;
+			//while(buf.remaining()>2) {
+			while(buf.position()< end) {
+				CRC ^= (buf.get() & 0xFF);				
+				for (int j = 0; j < 8; j++) {
+					boolean bitOne = ((CRC & 0x1) == 0x1);
+					CRC >>>= 1;
+					if (bitOne) {
+						CRC ^= 0x0000A001;
+					}
+				}
+			}
+			return CRC;
+		}
+		return -1;
+	}
+}

Added: mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/SerialConsoleEncoder.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/SerialConsoleEncoder.java?view=auto&rev=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/SerialConsoleEncoder.java (added)
+++ mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/SerialConsoleEncoder.java Fri Feb  2 02:39:42 2007
@@ -0,0 +1,102 @@
+/*
+ * Created on 19 janv. 2006
+ *
+ */
+package archean.pa.serialconsole.protocol;
+
+import java.nio.ByteOrder;
+
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.IoSession;
+import org.apache.mina.filter.codec.ProtocolEncoder;
+import org.apache.mina.filter.codec.ProtocolEncoderException;
+import org.apache.mina.filter.codec.ProtocolEncoderOutput;
+
+public class SerialConsoleEncoder implements ProtocolEncoder {
+
+	public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
+		if(message instanceof BusMessage) {
+			if(message instanceof ReadCommand) {
+				ReadCommand msg=(ReadCommand)message;
+				ByteBuffer buf=ByteBuffer.allocate(8);
+				buf.order(ByteOrder.BIG_ENDIAN);
+				buf.put((byte)msg.getTargetAddress());
+				buf.put((byte)msg.getCommand());
+				buf.putShort((short)msg.getAddress());
+				buf.putShort((short)msg.getCount());
+				buf.order(ByteOrder.LITTLE_ENDIAN);
+				encodeCRC(buf);
+				buf.flip();
+				out.write(buf);
+				return;
+			} else if(message instanceof ReadCommandReply) {
+				ReadCommandReply msg=(ReadCommandReply)message;
+				ByteBuffer buf=ByteBuffer.allocate(6+msg.getValues().length*2);
+				buf.order(ByteOrder.BIG_ENDIAN);
+				buf.put((byte)msg.getTargetAddress());
+				buf.put((byte)msg.getCommand());
+				buf.putShort((short)msg.getValues().length);
+				for(int i=0;i<msg.getValues().length;i++)
+					buf.putShort((short)msg.getValues()[i]);
+				buf.order(ByteOrder.LITTLE_ENDIAN);
+				encodeCRC(buf);
+				buf.flip();
+				out.write(buf);
+				return;
+			} else if(message instanceof WriteCommand) {
+				WriteCommand msg=(WriteCommand)message;
+				ByteBuffer buf=ByteBuffer.allocate(8);
+				buf.order(ByteOrder.BIG_ENDIAN);
+				buf.put((byte)msg.getTargetAddress());
+				buf.put((byte)msg.getCommand());
+				buf.putShort((short)msg.getAddress());
+				buf.putShort((short)msg.getValue());
+				buf.order(ByteOrder.LITTLE_ENDIAN);
+				encodeCRC(buf);
+				buf.flip();
+				out.write(buf);
+				return;
+			} else if(message instanceof WriteCommandReply) {
+				WriteCommandReply msg=(WriteCommandReply)message;
+				ByteBuffer buf=ByteBuffer.allocate(8);
+				buf.order(ByteOrder.BIG_ENDIAN);
+				buf.put((byte)msg.getTargetAddress());
+				buf.put((byte)msg.getCommand());
+				buf.putShort((short)msg.getAddress());
+				buf.putShort((short)msg.getCount());
+				buf.order(ByteOrder.LITTLE_ENDIAN);
+				encodeCRC(buf);
+				buf.flip();
+				out.write(buf);
+				return;
+			}
+		} 
+		throw new ProtocolEncoderException("Unknown message type : "+message.getClass().getName());
+	}
+
+	public void dispose(IoSession session) throws Exception {
+	}
+	
+	/**
+	 * rewind the buffer, compute CRC and put it in the next 2 bytes of the current buffer position
+	 * @param buf buffer to compute at the position of the 2 byte CRC slot
+	 */
+	private void encodeCRC(ByteBuffer buf) {
+		int end=buf.position();
+		buf.rewind();
+		if( buf.position()< end) {
+			int CRC = 0xFFFF;
+			while(buf.remaining()>2) {
+				CRC ^= (buf.get() & 0xFF);				
+				for (int j = 0; j < 8; j++) {
+					boolean bitOne = ((CRC & 0x1) == 0x1);
+					CRC >>>= 1;
+					if (bitOne) {
+						CRC ^= 0x0000A001;
+					}
+				}
+			}
+			buf.putShort((short)CRC);
+		}
+	}
+}

Added: mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/WriteCommand.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/WriteCommand.java?view=auto&rev=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/WriteCommand.java (added)
+++ mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/WriteCommand.java Fri Feb  2 02:39:42 2007
@@ -0,0 +1,29 @@
+/*
+ * Created on 19 janv. 2006
+ *
+ */
+package archean.pa.serialconsole.protocol;
+
+public class WriteCommand extends BusMessage {
+	private int address;
+	private int value;
+
+	public WriteCommand(int targetAddress,int address,int value) {
+		super(targetAddress, 6);
+		this.address=address;
+		this.value=value;
+	}
+
+	public int getAddress() {
+		return address;
+	}
+
+	public int getValue() {
+		return value;
+	}
+	@Override
+	public String toString() {
+		return "WRITE { device="+getTargetAddress()+", address="+address+", value="+value+"}";
+	}
+	
+}

Added: mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/WriteCommandReply.java
URL: http://svn.apache.org/viewvc/mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/WriteCommandReply.java?view=auto&rev=502570
==============================================================================
--- mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/WriteCommandReply.java (added)
+++ mina/sandbox/jvermillard/serial/src/test/java/archean/pa/serialconsole/protocol/WriteCommandReply.java Fri Feb  2 02:39:42 2007
@@ -0,0 +1,30 @@
+/*
+ * Created on 19 janv. 2006
+ *
+ */
+package archean.pa.serialconsole.protocol;
+
+public class WriteCommandReply extends BusMessage {
+	private int address;
+	private int count;
+	
+	public WriteCommandReply(int targetAddress,int address,int count) {
+		super(targetAddress, 6);
+		this.address=address;
+		this.count=count;
+	}
+
+	public int getAddress() {
+		return address;
+	}
+
+	public int getCount() {
+		return count;
+	}
+	
+	@Override
+	public String toString() {
+		return "WRITE REPLY { device="+getTargetAddress()+", address="+address+", count="+count+"}";
+	}
+
+}