This is an automated email from the ASF dual-hosted git repository. cdutz pushed a commit to branch feature/implement-df1-driver in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit ef3edeacffc3cc7c8f5b2e9b4a62c1a004cce887 Author: v.emmert <[email protected]> AuthorDate: Wed Aug 7 16:00:18 2019 +0200 Plc4XDf1Protocol --- .../java/base/connection/SerialChannelFactory.java | 5 ++-- pom.xml | 5 ++-- sandbox/test-java-df1-driver/pom.xml | 17 ++++++++++- .../org/apache/plc4x/java/df1/DF1PlcDriver.java | 2 +- .../java/org/apache/plc4x/java/df1/Df1Field.java | 33 ++++++++++++++++++++++ .../plc4x/java/df1/protocol/Df1Protocol.java | 10 +++++++ .../plc4x/java/df1/protocol/Plc4XDf1Protocol.java | 30 ++++++++++++++++++-- .../plc4x/java/df1/util/Df1FieldHandler.java | 3 +- .../plc4x/protocol/df1/BenchmarkManualDf1.java | 7 +++-- .../apache/plc4x/protocol/df1/EndToEndTest.java | 4 +-- 10 files changed, 102 insertions(+), 14 deletions(-) diff --git a/plc4j/protocols/driver-bases/serial/src/main/java/org/apache/plc4x/java/base/connection/SerialChannelFactory.java b/plc4j/protocols/driver-bases/serial/src/main/java/org/apache/plc4x/java/base/connection/SerialChannelFactory.java index 6f93828..79185de 100644 --- a/plc4j/protocols/driver-bases/serial/src/main/java/org/apache/plc4x/java/base/connection/SerialChannelFactory.java +++ b/plc4j/protocols/driver-bases/serial/src/main/java/org/apache/plc4x/java/base/connection/SerialChannelFactory.java @@ -25,6 +25,7 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelOption; import io.netty.channel.jsc.JSerialCommChannel; import io.netty.channel.jsc.JSerialCommDeviceAddress; +import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.oio.OioEventLoopGroup; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; @@ -45,8 +46,8 @@ public class SerialChannelFactory implements ChannelFactory { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(new OioEventLoopGroup()); bootstrap.channel(JSerialCommChannel.class); - bootstrap.option(ChannelOption.SO_KEEPALIVE, true); - bootstrap.option(ChannelOption.TCP_NODELAY, true); +// bootstrap.option(ChannelOption.SO_KEEPALIVE, true); +// bootstrap.option(ChannelOption.TCP_NODELAY, true); bootstrap.handler(channelHandler); // Start the client. ChannelFuture f = bootstrap.connect(address).sync(); diff --git a/pom.xml b/pom.xml index eae37c6..73c14ae 100644 --- a/pom.xml +++ b/pom.xml @@ -145,7 +145,7 @@ <lucene.version>8.0.0</lucene.version> <metrics-core.version>3.1.2</metrics-core.version> <mockito.version>2.24.5</mockito.version> - <netty.version>4.1.35.Final</netty.version> + <netty.version>4.1.13.Final</netty.version> <netty-transport-jserialcomm.version>1.0.0</netty-transport-jserialcomm.version> <owasp-dependency-check.version>5.0.0-M1</owasp-dependency-check.version> <pcap4j.version>1.7.3</pcap4j.version> @@ -1196,6 +1196,7 @@ However this config section is used by the asciidoctor site plugin extension. So plead ignore this error, it's actually ok. --> + <!-- <asciidoc> <attributes> <source-highlighter>prettify</source-highlighter> @@ -1205,7 +1206,7 @@ <requires> <require>asciidoctor-diagram</require> </requires> - </asciidoc> + </asciidoc>--> </configuration> <dependencies> <!-- All dependencies needed by the reflow skin --> diff --git a/sandbox/test-java-df1-driver/pom.xml b/sandbox/test-java-df1-driver/pom.xml index 7159072..4d6d1ff 100644 --- a/sandbox/test-java-df1-driver/pom.xml +++ b/sandbox/test-java-df1-driver/pom.xml @@ -121,9 +121,24 @@ <dependency> <groupId>com.fazecast</groupId> <artifactId>jSerialComm</artifactId> - <version>2.5.1</version> + <version>1.3.11</version> </dependency> + <!-- Logging + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>log4j-over-slf4j</artifactId> + <version>1.7.25</version> + </dependency> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + </dependency>--> + <dependency> <groupId>org.apache.plc4x</groupId> <artifactId>plc4x-protocols-df1</artifactId> diff --git a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/DF1PlcDriver.java b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/DF1PlcDriver.java index 1988e72..e7d8d64 100644 --- a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/DF1PlcDriver.java +++ b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/DF1PlcDriver.java @@ -67,7 +67,7 @@ public class DF1PlcDriver implements PlcDriver { @Override public PlcConnection connect(String url, PlcAuthentication authentication) throws PlcConnectionException { - throw new PlcConnectionException("DF1 connections don't support authentication."); + throw new PlcConnectionException("DF1 connections doesn't support authentication."); } } diff --git a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/Df1Field.java b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/Df1Field.java new file mode 100644 index 0000000..43c8e4e --- /dev/null +++ b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/Df1Field.java @@ -0,0 +1,33 @@ +package org.apache.plc4x.java.df1; + +import org.apache.plc4x.java.api.model.PlcField; +import org.apache.plc4x.java.df1.fields.DataType; + +public class Df1Field implements PlcField { + + private final int address; + private final int size; + private final DataType dataType; + + public Df1Field(int address, int size, DataType dataType) { + this.address = address; + this.size = size; + this.dataType = dataType; + } + + public int getAddress() { + return address; + } + + public int getSize() { + return size; + } + + public DataType getDataType() { + return dataType; + } + + public static PlcField of(String fieldQuery) { + return new Df1Field(11, 2, DataType.INTEGER); + } +} diff --git a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/protocol/Df1Protocol.java b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/protocol/Df1Protocol.java index bbeece2..1015a7e 100644 --- a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/protocol/Df1Protocol.java +++ b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/protocol/Df1Protocol.java @@ -50,6 +50,10 @@ public class Df1Protocol extends PlcByteToMessageCodec<DF1Symbol> { } @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + } + + @Override protected void encode(ChannelHandlerContext ctx, DF1Symbol msg, ByteBuf out) throws Exception { // Remember the size of the request as we need this to decode the response. if(msg instanceof DF1SymbolMessageFrameStart) { @@ -140,4 +144,10 @@ public class Df1Protocol extends PlcByteToMessageCodec<DF1Symbol> { out.add(resp); } + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + //super.exceptionCaught(ctx, cause); + } } diff --git a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/protocol/Plc4XDf1Protocol.java b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/protocol/Plc4XDf1Protocol.java index 9a35c53..98a7a38 100644 --- a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/protocol/Plc4XDf1Protocol.java +++ b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/protocol/Plc4XDf1Protocol.java @@ -19,22 +19,46 @@ package org.apache.plc4x.java.df1.protocol; import io.netty.channel.ChannelHandlerContext; +import org.apache.plc4x.java.api.messages.PlcReadRequest; +import org.apache.plc4x.java.api.model.PlcField; import org.apache.plc4x.java.base.PlcMessageToMessageCodec; import org.apache.plc4x.java.base.messages.PlcRequestContainer; -import org.apache.plc4x.java.df1.DF1Symbol; +import org.apache.plc4x.java.df1.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; public class Plc4XDf1Protocol extends PlcMessageToMessageCodec<DF1Symbol, PlcRequestContainer> { + private static final Logger logger = LoggerFactory.getLogger(Plc4XDf1Protocol.class); + + private final AtomicInteger transactionId = new AtomicInteger(0); + @Override protected void encode(ChannelHandlerContext ctx, PlcRequestContainer msg, List<Object> out) throws Exception { - + if (msg.getRequest() instanceof PlcReadRequest) { + for (PlcField field : ((PlcReadRequest) msg.getRequest()).getFields()) { + if (!(field instanceof Df1Field)) { + throw new IllegalArgumentException("Invalid field type found inside Df1 Request"); + } + int address = ((Df1Field) field).getAddress(); + short size = (short) ((Df1Field) field).getAddress(); + int transactionId = this.transactionId.getAndIncrement(); + logger.debug("Creating request for offset {}, with length {} and transaction id {}", address, size, transactionId); + // TODO: differentiate commands + DF1SymbolMessageFrameStart frameStart = new DF1SymbolMessageFrameStart((short) 0x09, (short) 0x00, new DF1ReadRequest((short) 0x00, transactionId, address, size)); + out.add(frameStart); + } + } else { + throw new IllegalStateException("This should not happen!"); + } } @Override protected void decode(ChannelHandlerContext ctx, DF1Symbol msg, List<Object> out) throws Exception { - + System.out.println("Hello"); } } diff --git a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/util/Df1FieldHandler.java b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/util/Df1FieldHandler.java index 52e8bfc..4b92194 100644 --- a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/util/Df1FieldHandler.java +++ b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/util/Df1FieldHandler.java @@ -22,12 +22,13 @@ import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException; import org.apache.plc4x.java.api.model.PlcField; import org.apache.plc4x.java.base.connection.DefaultPlcFieldHandler; import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem; +import org.apache.plc4x.java.df1.Df1Field; public class Df1FieldHandler extends DefaultPlcFieldHandler { @Override public PlcField createField(String fieldQuery) throws PlcInvalidFieldException { - return null; + return Df1Field.of(fieldQuery); } @Override diff --git a/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/BenchmarkManualDf1.java b/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/BenchmarkManualDf1.java index 3174170..fdc26b3 100644 --- a/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/BenchmarkManualDf1.java +++ b/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/BenchmarkManualDf1.java @@ -98,14 +98,13 @@ public class BenchmarkManualDf1 { // comPort.setComPortTimeouts(SerialPort.TIMEOUT_NONBLOCKING, 0, 0); System.out.print(comPort.getSystemPortName() + " | "); - System.out.print(comPort.getPortDescription() + " | "); + //System.out.print(comPort.getPortDescription() + " | "); System.out.print(comPort.getDescriptivePortName() + " | Baud rate: "); System.out.println(comPort.getBaudRate()); // System.out.println(comPort.getReadTimeout()); // System.out.println(comPort.getWriteTimeout()); - System.exit(0); // DF1SymbolIO df1message = new DF1SymbolIO(); @@ -159,6 +158,10 @@ public class BenchmarkManualDf1 { comPort.writeBytes(c_ETX, 1); + comPort.closePort(); + System.exit(0); + + // int[] crcmsg = {c_DST[0], c_SRC[0], c_CMD[0], c_STS[0], c_TNS[0], c_TNS[1], c_ADR[0], c_ADR[1], c_SZE[0], c_ETX[0]}; // fullduplex CRC int[] crcmsg = {c_DST[0], c_SRC[0], c_CMD[0], c_STS[0], c_TNS[0], c_TNS[1], c_FNC[0], c_ETX[0]}; // diagnostic status request // int[] crcmsg = {0x11, 0x02, 0x09, 0x00, 0x01, 0x00, 0x41, 0x00, 0x12, 0x00, 0x0c, 0x03}; // halfduplex CRC diff --git a/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/EndToEndTest.java b/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/EndToEndTest.java index 3a5f96d..4a52437 100644 --- a/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/EndToEndTest.java +++ b/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/EndToEndTest.java @@ -26,7 +26,6 @@ import org.apache.plc4x.java.api.messages.PlcReadRequest; import org.apache.plc4x.java.api.messages.PlcReadResponse; import java.util.concurrent.TimeUnit; - /** * TODO write comment * @@ -40,11 +39,12 @@ public class EndToEndTest { try (PlcConnection plcConnection = new PlcDriverManager().getConnection("df1:serial:///COM4")) { PlcReadRequest request = plcConnection.readRequestBuilder() .addItem("erstes", "17:INTEGER") + .addItem("zweites", "17:INTEGER") .build(); PlcReadResponse response = request.execute().get(1, TimeUnit.SECONDS); - System.out.println(request); + System.out.println(response); } catch (PlcConnectionException e) { e.printStackTrace(); } catch (Exception e) {
