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