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:50 UTC

[plc4x] 06/06: - Updated the current Netty driver prototype to work with the latest code generation updates.

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 817085a1793afd95c06c6eb1ac139bd5e1519886
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Wed Aug 7 16:58:30 2019 +0200

    - Updated the current Netty driver prototype to work with the latest code generation updates.
---
 plc4j/protocols/pom.xml                            |  2 +-
 .../java/org/apache/plc4x/java/df1/Df1Field.java   | 18 ++++++++++
 .../java/df1/connection/SerialDf1Connection.java   | 40 ++++++++++++++++++++--
 .../plc4x/java/df1/protocol/Df1Protocol.java       | 32 ++++++++---------
 .../plc4x/java/df1/protocol/Plc4XDf1Protocol.java  |  7 ++--
 .../apache/plc4x/java/df1/DF1PlcDriverTest.java    | 26 +++++++++++---
 6 files changed, 96 insertions(+), 29 deletions(-)

diff --git a/plc4j/protocols/pom.xml b/plc4j/protocols/pom.xml
index 6f776b7..1543985 100644
--- a/plc4j/protocols/pom.xml
+++ b/plc4j/protocols/pom.xml
@@ -36,7 +36,7 @@
   <modules>
     <module>driver-bases</module>
 
-    <module>ads</module>
+    <!--module>ads</module-->
     <module>delta-v</module>
     <module>ethernet-ip</module>
     <module>iso-on-tcp</module>
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
index 43c8e4e..7ca0536 100644
--- 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
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.plc4x.java.df1;
 
 import org.apache.plc4x.java.api.model.PlcField;
diff --git a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/connection/SerialDf1Connection.java b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/connection/SerialDf1Connection.java
index de8803e..4a07499 100644
--- a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/connection/SerialDf1Connection.java
+++ b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/connection/SerialDf1Connection.java
@@ -19,23 +19,59 @@
 package org.apache.plc4x.java.df1.connection;
 
 import io.netty.channel.*;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
+import org.apache.plc4x.java.base.connection.ChannelFactory;
 import org.apache.plc4x.java.base.connection.SerialChannelFactory;
 import org.apache.plc4x.java.base.events.ConnectedEvent;
 import org.apache.plc4x.java.base.messages.*;
 import org.apache.plc4x.java.df1.protocol.Df1Protocol;
 import org.apache.plc4x.java.df1.protocol.Plc4XDf1Protocol;
 import org.apache.plc4x.java.df1.util.Df1FieldHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.concurrent.CompletableFuture;
 
 public class SerialDf1Connection extends BaseDf1Connection implements PlcReader, PlcWriter {
 
+    private static final Logger logger = LoggerFactory.getLogger(SerialDf1Connection.class);
+
+    private short localAddr;
+    private short remoteAddr;
+
     public SerialDf1Connection(String comPortName, String params) {
-        super(new SerialChannelFactory(comPortName));
+        this(new SerialChannelFactory(comPortName), params);
+    }
+
+    public SerialDf1Connection(ChannelFactory channelFactory, String params) {
+        super(channelFactory, false);
+        this.localAddr = (short) 0x00;
+        this.remoteAddr = (short) 0x09;
+
+        // Override some of the settings, if they are asked for.
+        if (!StringUtils.isEmpty(params)) {
+            for (String param : params.split("&")) {
+                String[] paramElements = param.split("=");
+                String paramName = paramElements[0];
+                if (paramElements.length == 2) {
+                    String paramValue = paramElements[1];
+                    switch (paramName) {
+                        case "local-addr":
+                            this.localAddr = Short.parseShort(paramValue);
+                            break;
+                        case "remote-addr":
+                            this.remoteAddr = Short.parseShort(paramValue);
+                            break;
+                        default:
+                            logger.debug("Unknown parameter {} with value {}", paramName, paramValue);
+                    }
+                }
+            }
+        }
     }
 
     @Override
@@ -65,7 +101,7 @@ public class SerialDf1Connection extends BaseDf1Connection implements PlcReader,
                         }
                     }
                 });
-                pipeline.addLast(new Df1Protocol());
+                pipeline.addLast(new Df1Protocol(localAddr, remoteAddr));
                 pipeline.addLast(new Plc4XDf1Protocol());
             }
         };
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 92ae07d..9818ceb 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
@@ -23,6 +23,7 @@ import io.netty.buffer.ByteBufUtil;
 import io.netty.channel.ChannelHandlerContext;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
 import org.apache.plc4x.java.base.PlcByteToMessageCodec;
+import org.apache.plc4x.java.df1.DF1Command;
 import org.apache.plc4x.java.df1.DF1Symbol;
 import org.apache.plc4x.java.df1.DF1SymbolMessageFrame;
 import org.apache.plc4x.java.df1.DF1UnprotectedReadRequest;
@@ -36,17 +37,18 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class Df1Protocol extends PlcByteToMessageCodec<DF1Symbol> {
+public class Df1Protocol extends PlcByteToMessageCodec<DF1Command> {
 
     private static final Logger logger = LoggerFactory.getLogger(Df1Protocol.class);
 
+    private final short localAddr;
+    private final short remoteAddr;
     private final DF1SymbolIO df1SymbolIO;
 
-    private Map<Integer, Short> readRequestSizes;
-
-    public Df1Protocol() {
+    public Df1Protocol(short localAddr, short remoteAddr) {
+        this.localAddr = localAddr;
+        this.remoteAddr = remoteAddr;
         df1SymbolIO = new DF1SymbolIO();
-        readRequestSizes = new HashMap<>();
     }
 
     @Override
@@ -54,21 +56,14 @@ public class Df1Protocol extends PlcByteToMessageCodec<DF1Symbol> {
     }
 
     @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 DF1SymbolMessageFrame) {
-            DF1SymbolMessageFrame frame = (DF1SymbolMessageFrame) msg;
-            if(frame.getCommand() instanceof DF1UnprotectedReadRequest) {
-                DF1UnprotectedReadRequest unprotectedReadRequest = (DF1UnprotectedReadRequest) frame.getCommand();
-                int transactionCounter = unprotectedReadRequest.getTransactionCounter();
-                readRequestSizes.put(transactionCounter, unprotectedReadRequest.getSize());
-            }
-        }
+    protected void encode(ChannelHandlerContext ctx, DF1Command msg, ByteBuf out) throws Exception {
+        // Create a new df1 frame for transmitting the command
+        DF1SymbolMessageFrame frame = new DF1SymbolMessageFrame(remoteAddr, localAddr, msg);
 
         // Serialize the message
         // TODO: Create the buffer with the correct size.
         WriteBuffer writeBuffer = new WriteBuffer(100);
-        df1SymbolIO.serialize(writeBuffer, msg);
+        df1SymbolIO.serialize(writeBuffer, frame);
         byte[] data = writeBuffer.getData();
 
         // Send the serialized data
@@ -106,7 +101,7 @@ public class Df1Protocol extends PlcByteToMessageCodec<DF1Symbol> {
                             break;
                         }
                         case (short) 0x41: {
-                            int transactionCounter = in.getUnsignedShort(6);
+                            /*int transactionCounter = in.getUnsignedShort(6);
                             if(!readRequestSizes.containsKey(transactionCounter)) {
                                 logger.warn("Unknown transaction counter: {}", transactionCounter);
                                 if (logger.isDebugEnabled()) {
@@ -119,7 +114,8 @@ public class Df1Protocol extends PlcByteToMessageCodec<DF1Symbol> {
                             size = readRequestSizes.remove(transactionCounter);
                             if(in.readableBytes() < 8 + size) {
                                 return;
-                            }
+                            }*/
+                            // TODO: Let's just assume all is good for now ...
                             break;
                         }
                     }
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 98a7a38..d8be305 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
@@ -30,7 +30,7 @@ import org.slf4j.LoggerFactory;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
-public class Plc4XDf1Protocol extends PlcMessageToMessageCodec<DF1Symbol, PlcRequestContainer> {
+public class Plc4XDf1Protocol extends PlcMessageToMessageCodec<DF1Command, PlcRequestContainer> {
 
     private static final Logger logger = LoggerFactory.getLogger(Plc4XDf1Protocol.class);
 
@@ -48,8 +48,7 @@ public class Plc4XDf1Protocol extends PlcMessageToMessageCodec<DF1Symbol, PlcReq
                 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);
+                out.add(new DF1UnprotectedReadRequest((short) 0x00, transactionId, address, size));
             }
         } else {
             throw new IllegalStateException("This should not happen!");
@@ -57,7 +56,7 @@ public class Plc4XDf1Protocol extends PlcMessageToMessageCodec<DF1Symbol, PlcReq
     }
 
     @Override
-    protected void decode(ChannelHandlerContext ctx, DF1Symbol msg, List<Object> out) throws Exception {
+    protected void decode(ChannelHandlerContext ctx, DF1Command msg, List<Object> out) throws Exception {
         System.out.println("Hello");
     }
 
diff --git a/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/java/df1/DF1PlcDriverTest.java b/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/java/df1/DF1PlcDriverTest.java
index ae9e470..fa58a5e 100644
--- a/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/java/df1/DF1PlcDriverTest.java
+++ b/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/java/df1/DF1PlcDriverTest.java
@@ -1,12 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.plc4x.java.df1;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
 
 import java.util.regex.Matcher;
 
 import static org.apache.plc4x.java.df1.DF1PlcDriver.DF1_URI_PATTERN;
 import static org.apache.plc4x.java.df1.DF1PlcDriver.SERIAL_PATTERN;
-import static org.junit.Assert.*;
 
 public class DF1PlcDriverTest {
 
@@ -14,13 +32,13 @@ public class DF1PlcDriverTest {
     public void matchExpression() {
         Matcher matcher = SERIAL_PATTERN.matcher("serial:///COM4");
 
-        assertTrue(matcher.matches());
+        Assertions.assertTrue(matcher.matches());
     }
 
     @Test
     public void matchExpression2() {
         Matcher matcher = DF1_URI_PATTERN.matcher("df1:serial:///COM4");
 
-        assertTrue(matcher.matches());
+        Assertions.assertTrue(matcher.matches());
     }
 }
\ No newline at end of file