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();
}));