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 2020/09/29 20:09:17 UTC

[plc4x] branch develop updated: - Added a getInt() method that just relays to getInteger() to avoid problems with generated code (Hack for now) - Fixed a bug in the KNX driver's write support (Protocol Logig as well as the FieldHandler.

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 62547f6  - Added a getInt() method that just relays to getInteger() to avoid problems with generated code (Hack for now) - Fixed a bug in the KNX driver's write support (Protocol Logig as well as the FieldHandler.
62547f6 is described below

commit 62547f65a11936644b4dedb673b68cf7484263c5
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Sep 29 22:09:04 2020 +0200

    - Added a getInt() method that just relays to getInteger() to avoid problems with generated code (Hack for now)
    - Fixed a bug in the KNX driver's write support (Protocol Logig as well as the FieldHandler.
---
 .../plc4x/language/c/CLanguageTemplateHelper.java  |  1 -
 .../resources/templates/java/data-io-template.ftlh |  3 +-
 .../org/apache/plc4x/java/api/value/PlcNull.java   |  5 +++
 .../org/apache/plc4x/java/api/value/PlcValue.java  |  2 +
 .../plc4x/java/api/value/PlcValueAdapter.java      |  9 +++++
 .../java/knxnetip/field/KnxNetIpFieldHandler.java  | 43 ++++++++++++----------
 .../knxnetip/protocol/KnxNetIpProtocolLogic.java   | 29 +++++++--------
 7 files changed, 53 insertions(+), 39 deletions(-)

diff --git a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
index 8bcbb38..8c48fdf 100644
--- a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
+++ b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
@@ -18,7 +18,6 @@ under the License.
 */
 package org.apache.plc4x.language.c;
 
-import jdk.nashorn.internal.runtime.regexp.joni.constants.StringType;
 import org.apache.commons.lang3.math.NumberUtils;
 import org.apache.plc4x.plugins.codegenerator.protocol.freemarker.BaseFreemarkerLanguageTemplateHelper;
 import org.apache.plc4x.plugins.codegenerator.protocol.freemarker.FreemarkerException;
diff --git a/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
index bcaf6ae..195253b 100644
--- a/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
@@ -288,8 +288,7 @@ public class ${type.name}IO {
             ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) _value.getStruct().get("${field.name}").get${helper.getLanguageTypeNameForField(field)?cap_first}();
                         <#else>
                             <#if field.name == "value">
-            Plc${case.name} plcVal = (Plc${case.name}) _value;
-            ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) plcVal.get${case.name}();
+            ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${helper.getLanguageTypeNameForField(field)?cap_first}();
                             <#else>
                                 <#-- Just for now -->
             ${helper.getLanguageTypeNameForField(field)} ${field.name} = ${helper.getNullValueForTypeReference(field.type)};
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcNull.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcNull.java
index 5a140cf..24c8bc7 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcNull.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcNull.java
@@ -105,6 +105,11 @@ public class PlcNull implements PlcValue {
     }
 
     @Override
+    public int getInt() {
+        return 0;
+    }
+
+    @Override
     public boolean isLong() {
         return false;
     }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValue.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValue.java
index 10af797..d851ce4 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValue.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValue.java
@@ -74,6 +74,8 @@ public interface PlcValue {
 
     int getInteger();
 
+    int getInt();
+
     boolean isLong();
 
     long getLong();
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueAdapter.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueAdapter.java
index 4c9af79..36bb5a7 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueAdapter.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueAdapter.java
@@ -121,6 +121,15 @@ public class PlcValueAdapter implements PlcValue {
         throw new PlcIncompatibleDatatypeException("");
     }
 
+    /**
+     * int vs. Integer is the only primitive type where the complex type doesn't have just a capitalized first letter.
+     * @return well ... an Integer ... ahem ... int ...
+     */
+    @Override
+    public int getInt() {
+        return getInteger();
+    }
+
     @Override
     @JsonIgnore
     public boolean isLong() {
diff --git a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/field/KnxNetIpFieldHandler.java b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/field/KnxNetIpFieldHandler.java
index 2bcb443..76b0ad0 100644
--- a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/field/KnxNetIpFieldHandler.java
+++ b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/field/KnxNetIpFieldHandler.java
@@ -24,6 +24,9 @@ import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.api.value.PlcValues;
 import org.apache.plc4x.java.spi.connection.DefaultPlcFieldHandler;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
 public class KnxNetIpFieldHandler extends DefaultPlcFieldHandler {
 
     @Override
@@ -37,81 +40,81 @@ public class KnxNetIpFieldHandler extends DefaultPlcFieldHandler {
     @Override
     public PlcValue encodeBoolean(PlcField field, Object[] values) {
         if(values.length == 1) {
-            return PlcValues.of(values[0]);
+            return PlcValues.of((Boolean) values[0]);
         }
-        return PlcValues.of(values);
+        return PlcValues.of((Boolean[]) values);
     }
 
     @Override
     public PlcValue encodeByte(PlcField field, Object[] values) {
         if(values.length == 1) {
-            return PlcValues.of(values[0]);
+            return PlcValues.of((Byte) values[0]);
         }
-        return PlcValues.of(values);
+        return PlcValues.of((Byte[]) values);
     }
 
     @Override
     public PlcValue encodeShort(PlcField field, Object[] values) {
         if(values.length == 1) {
-            return PlcValues.of(values[0]);
+            return PlcValues.of((Short) values[0]);
         }
-        return PlcValues.of(values);
+        return PlcValues.of((Short[]) values);
     }
 
     @Override
     public PlcValue encodeInteger(PlcField field, Object[] values) {
         if(values.length == 1) {
-            return PlcValues.of(values[0]);
+            return PlcValues.of((Integer) values[0]);
         }
-        return PlcValues.of(values);
+        return PlcValues.of((Integer[]) values);
     }
 
     @Override
     public PlcValue encodeBigInteger(PlcField field, Object[] values) {
         if(values.length == 1) {
-            return PlcValues.of(values[0]);
+            return PlcValues.of((BigInteger) values[0]);
         }
-        return PlcValues.of(values);
+        return PlcValues.of((BigInteger[]) values);
     }
 
     @Override
     public PlcValue encodeLong(PlcField field, Object[] values) {
         if(values.length == 1) {
-            return PlcValues.of(values[0]);
+            return PlcValues.of((Long) values[0]);
         }
-        return PlcValues.of(values);
+        return PlcValues.of((Long[]) values);
     }
 
     @Override
     public PlcValue encodeFloat(PlcField field, Object[] values) {
         if(values.length == 1) {
-            return PlcValues.of(values[0]);
+            return PlcValues.of((Float) values[0]);
         }
-        return PlcValues.of(values);
+        return PlcValues.of((Float[]) values);
     }
 
     @Override
     public PlcValue encodeBigDecimal(PlcField field, Object[] values) {
         if(values.length == 1) {
-            return PlcValues.of(values[0]);
+            return PlcValues.of((BigDecimal) values[0]);
         }
-        return PlcValues.of(values);
+        return PlcValues.of((BigDecimal[]) values);
     }
 
     @Override
     public PlcValue encodeDouble(PlcField field, Object[] values) {
         if(values.length == 1) {
-            return PlcValues.of(values[0]);
+            return PlcValues.of((Double) values[0]);
         }
-        return PlcValues.of(values);
+        return PlcValues.of((Double[]) values);
     }
 
     @Override
     public PlcValue encodeString(PlcField field, Object[] values) {
         if(values.length == 1) {
-            return PlcValues.of(values[0]);
+            return PlcValues.of((String) values[0]);
         }
-        return PlcValues.of(values);
+        return PlcValues.of((String[]) values);
     }
 
 }
diff --git a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java
index b8f8f9d..4384047 100644
--- a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java
+++ b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java
@@ -357,29 +357,26 @@ public class KnxNetIpProtocolLogic extends Plc4xProtocolBase<KNXNetIPMessage> im
                 .expectResponse(KNXNetIPMessage.class, REQUEST_TIMEOUT)
                 .onTimeout(future::completeExceptionally)
                 .onError((tr, e) -> future.completeExceptionally(e))
-                // Technically this is not 100% correct, as actually an Ack would be received
-                // which is instantly followed by this request. However the Ack was always OK
-                // no matter what I threw at the Gateway, so we'll make the code a lot simpler
-                // and assume the Request is the response to our request.
-                .check(tr -> tr instanceof TunnelingRequest)
-                .unwrap(tr -> ((TunnelingRequest) tr))
-                .check(tr -> tr.getCemi() instanceof CEMIDataCon)
-                .check(tr -> (tr.getTunnelingRequestDataBlock().getCommunicationChannelId() == communicationChannelId) &&
-                    (tr.getTunnelingRequestDataBlock().getSequenceCounter() == knxRequest.getTunnelingRequestDataBlock().getSequenceCounter()))
+                .check(tr -> tr instanceof TunnelingResponse)
+                .unwrap(tr -> ((TunnelingResponse) tr))
+                .check(tr -> tr.getTunnelingResponseDataBlock().getCommunicationChannelId() == knxRequest.getTunnelingRequestDataBlock().getCommunicationChannelId())
+                .check(tr -> tr.getTunnelingResponseDataBlock().getSequenceCounter() == knxRequest.getTunnelingRequestDataBlock().getSequenceCounter())
                 .handle(tr -> {
-                    // In this case all wen't well.
-                    PlcResponseCode responseCode = PlcResponseCode.OK;
+                    PlcResponseCode responseCode;
+                    // In this case all went well.
+                    if(tr.getTunnelingResponseDataBlock().getStatus() == Status.NO_ERROR) {
+                        responseCode = PlcResponseCode.OK;
+                    }
+                    // TODO: Should probably differentiate a bit on this and not treat everything as internal error.
+                    else {
+                        responseCode = PlcResponseCode.INTERNAL_ERROR;
+                    }
                     // Prepare the response.
                     PlcWriteResponse response = new DefaultPlcWriteResponse(request,
                         Collections.singletonMap(fieldName, responseCode));
 
                     future.complete(response);
 
-                    // Send Ack back.
-                    TunnelingResponse ack = new TunnelingResponse(new TunnelingResponseDataBlock(communicationChannelId,
-                        tr.getTunnelingRequestDataBlock().getSequenceCounter(), Status.NO_ERROR));
-                    transaction.submit(() -> context.sendToWire(ack));
-
                     // Finish the request-transaction.
                     transaction.endRequest();
                 }));