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


Reply via email to