You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2019/08/07 14:58:46 UTC

[plc4x] 02/06: Plc4XDf1Protocol

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 <v....@pragmaticminds.de>
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) {