You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2019/08/13 08:42:38 UTC
[plc4x] branch feature/implement-df1-driver updated: [DF1]
Implemented some handling in Plc4XDf1Protocol.java
This is an automated email from the ASF dual-hosted git repository.
jfeinauer pushed a commit to branch feature/implement-df1-driver
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/feature/implement-df1-driver by this push:
new 7961434 [DF1] Implemented some handling in Plc4XDf1Protocol.java
7961434 is described below
commit 79614346010be443e41754e8f150c0ed126ddc79
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Tue Aug 13 10:42:17 2019 +0200
[DF1] Implemented some handling in Plc4XDf1Protocol.java
---
.../org/apache/plc4x/java/df1/DF1PlcDriver.java | 1 +
.../plc4x/java/df1/protocol/Plc4XDf1Protocol.java | 64 +++++++++++++++++++++-
2 files changed, 63 insertions(+), 2 deletions(-)
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 e7d8d64..c21b538 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
@@ -30,6 +30,7 @@ import java.util.regex.Pattern;
public class DF1PlcDriver implements PlcDriver {
+ // TODO there is only serial, I guess?
public static final Pattern INET_ADDRESS_PATTERN = Pattern.compile("tcp://(?<host>[\\w.]+)(:(?<port>\\d*))?");
public static final Pattern SERIAL_PATTERN = Pattern.compile("serial://(?<serialDefinition>/?[a-zA-Z0-9/]*)");
public static final Pattern DF1_URI_PATTERN = Pattern.compile("^df1:(" + INET_ADDRESS_PATTERN + "|" + SERIAL_PATTERN + ")/?" + "(?<params>\\?.*)?");
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 d8be305..7072047 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,15 +19,31 @@
package org.apache.plc4x.java.df1.protocol;
import io.netty.channel.ChannelHandlerContext;
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.commons.lang3.tuple.Pair;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcRequest;
+import org.apache.plc4x.java.api.messages.PlcResponse;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest;
import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
import org.apache.plc4x.java.base.PlcMessageToMessageCodec;
+import org.apache.plc4x.java.base.messages.DefaultPlcReadResponse;
+import org.apache.plc4x.java.base.messages.InternalPlcReadRequest;
+import org.apache.plc4x.java.base.messages.InternalPlcRequest;
import org.apache.plc4x.java.base.messages.PlcRequestContainer;
-import org.apache.plc4x.java.df1.*;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
+import org.apache.plc4x.java.df1.DF1Command;
+import org.apache.plc4x.java.df1.DF1UnprotectedReadRequest;
+import org.apache.plc4x.java.df1.Df1Field;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class Plc4XDf1Protocol extends PlcMessageToMessageCodec<DF1Command, PlcRequestContainer> {
@@ -35,9 +51,11 @@ public class Plc4XDf1Protocol extends PlcMessageToMessageCodec<DF1Command, PlcRe
private static final Logger logger = LoggerFactory.getLogger(Plc4XDf1Protocol.class);
private final AtomicInteger transactionId = new AtomicInteger(0);
+ private Map<Integer, PlcRequestContainer> requests = new ConcurrentHashMap<>();
@Override
protected void encode(ChannelHandlerContext ctx, PlcRequestContainer msg, List<Object> out) throws Exception {
+ logger.trace("Received Request {} to send out", msg);
if (msg.getRequest() instanceof PlcReadRequest) {
for (PlcField field : ((PlcReadRequest) msg.getRequest()).getFields()) {
if (!(field instanceof Df1Field)) {
@@ -57,7 +75,49 @@ public class Plc4XDf1Protocol extends PlcMessageToMessageCodec<DF1Command, PlcRe
@Override
protected void decode(ChannelHandlerContext ctx, DF1Command msg, List<Object> out) throws Exception {
- System.out.println("Hello");
+ logger.trace("Received DF1 Command incoming {}", msg);
+ // TODO fetch right transaction id from msg
+ int transactionId = -1;
+ if (!requests.containsKey(transactionId)) {
+ logger.warn("Received a response to unknown transaction id {}", transactionId);
+ ctx.fireExceptionCaught(new RuntimeException("Received a response to unknown transaction id"));
+ ctx.close();
+ return;
+ }
+ // As every response has a matching request, get this request based on the tpdu.
+ PlcRequestContainer requestContainer = requests.remove(transactionId);
+ PlcRequest request = requestContainer.getRequest();
+
+ // Handle the response.
+ PlcResponse response = null;
+ if (request instanceof PlcReadRequest) {
+ // TODO handle read response
+ /*
+ Things to do
+ - check response code (if there is something like that?
+ - cast the bytes to right datatype
+ - create Response
+ */
+ // We can do this as we have only one field in DF1
+ final String field = ((PlcReadRequest) request).getFieldNames().iterator().next();
+ // TODO can there be another code than ok?
+ final PlcResponseCode responseCode = PlcResponseCode.OK;
+ // TODO the field item has to be of suitable type
+ final BaseDefaultFieldItem responseItem = new DefaultIntegerFieldItem(-1);
+ response = new DefaultPlcReadResponse(((InternalPlcReadRequest) request),
+ Collections.singletonMap(field,
+ Pair.of(responseCode, responseItem)));
+ } else if (request instanceof PlcWriteRequest) {
+ logger.warn("Writing is currently not implemented but received a write response?!");
+ ctx.close();
+ throw new NotImplementedException("This is currently not implemented!");
+ }
+
+ // Confirm the response being handled.
+ if (response != null) {
+ requestContainer.getResponseFuture().complete(response);
+ }
}
+
}