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 2018/09/07 15:59:05 UTC

[incubator-plc4x] branch feature/api-redesign-chris-c updated: - Some minor updates fixing stuff that wasn't updated as the modules were commented out.

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

cdutz pushed a commit to branch feature/api-redesign-chris-c
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git


The following commit(s) were added to refs/heads/feature/api-redesign-chris-c by this push:
     new 032acf1  - Some minor updates fixing stuff that wasn't updated as the modules were commented out.
032acf1 is described below

commit 032acf14d17e45ab95d75a4bf46490aabae029d1
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Sep 7 17:59:03 2018 +0200

    - Some minor updates fixing stuff that wasn't updated as the modules were commented out.
---
 .../ads/connection/AdsAbstractPlcConnection.java   |   4 +-
 .../ads/protocol/util/LittleEndianDecoder.java     |  12 +--
 .../modbus/connection/BaseModbusPlcConnection.java |  79 +++++---------
 .../java/modbus/netty/Plc4XModbusProtocol.java     |  12 ++-
 .../java/modbus/util/ModbusPlcFieldHandler.java    | 114 +++++++++++++++++++++
 5 files changed, 154 insertions(+), 67 deletions(-)

diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java
index c533b06..4664ea0 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnection.java
@@ -92,7 +92,7 @@ public abstract class AdsAbstractPlcConnection extends AbstractPlcConnection imp
     }
 
     @Override
-    public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
+    public CompletableFuture<PlcReadResponse<?>> read(PlcReadRequest readRequest) {
         mapFields(readRequest);
         CompletableFuture<InternalPlcReadResponse> readFuture = new CompletableFuture<>();
         ChannelFuture channelFuture = channel.writeAndFlush(new PlcRequestContainer<>((InternalPlcReadRequest) readRequest, readFuture));
@@ -111,7 +111,7 @@ public abstract class AdsAbstractPlcConnection extends AbstractPlcConnection imp
     }
 
     @Override
-    public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {
+    public CompletableFuture<PlcWriteResponse<?>> write(PlcWriteRequest writeRequest) {
         mapFields(writeRequest);
         CompletableFuture<InternalPlcWriteResponse> writeFuture = new CompletableFuture<>();
         ChannelFuture channelFuture = channel.writeAndFlush(new PlcRequestContainer<>((InternalPlcWriteRequest) writeRequest, writeFuture));
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
index 38e3d03..22daa07 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
@@ -25,9 +25,9 @@ import org.apache.commons.lang3.NotImplementedException;
 import org.apache.plc4x.java.ads.api.commands.types.TimeStamp;
 import org.apache.plc4x.java.ads.model.AdsDataType;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
-import org.apache.plc4x.java.base.messages.items.BooleanFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultBooleanFieldItem;
 import org.apache.plc4x.java.base.messages.items.FieldItem;
-import org.apache.plc4x.java.base.messages.items.IntegerFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
 
 import java.math.BigInteger;
 import java.util.*;
@@ -71,7 +71,7 @@ public class LittleEndianDecoder {
                     short aByte = wrappedBuffer.readUnsignedByte();
                     values.offer(aByte != 0);
                 }
-                return new BooleanFieldItem(values.toArray(new Boolean[0]));
+                return new DefaultBooleanFieldItem(values.toArray(new Boolean[0]));
             }
             case BIT8: {
                 LinkedList<Boolean> values = new LinkedList<>();
@@ -79,7 +79,7 @@ public class LittleEndianDecoder {
                     short aByte = wrappedBuffer.readUnsignedByte();
                     values.offer(aByte != 0);
                 }
-                return new BooleanFieldItem(values.toArray(new Boolean[0]));
+                return new DefaultBooleanFieldItem(values.toArray(new Boolean[0]));
             }
             case BITARR8: {
                 LinkedList<Long> values = new LinkedList<>();
@@ -87,7 +87,7 @@ public class LittleEndianDecoder {
                     short aByte = wrappedBuffer.readUnsignedByte();
                     values.offer((long) aByte);
                 }
-                return new IntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
             }
             case BITARR16: {
                 LinkedList<Long> values = new LinkedList<>();
@@ -95,7 +95,7 @@ public class LittleEndianDecoder {
                     long aLong = wrappedBuffer.readUnsignedIntLE();
                     values.offer(aLong);
                 }
-                return new IntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
             }
             case BITARR32: {
                 throw new NotImplementedException("not implemented yet " + adsDataType);
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
index 7986f1c..a9db2af 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
@@ -18,34 +18,27 @@ under the License.
 */
 package org.apache.plc4x.java.modbus.connection;
 
-import io.netty.channel.ChannelFuture;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.plc4x.java.api.connection.PlcReader;
 import org.apache.plc4x.java.api.connection.PlcWriter;
-import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 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.api.model.PlcField;
-import org.apache.plc4x.java.api.types.PlcClientDatatype;
 import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
 import org.apache.plc4x.java.base.connection.ChannelFactory;
-import org.apache.plc4x.java.base.connection.PlcFieldHandler;
-import org.apache.plc4x.java.base.messages.DefaultPlcReadRequest;
-import org.apache.plc4x.java.base.messages.DefaultPlcWriteRequest;
-import org.apache.plc4x.java.base.messages.PlcRequestContainer;
-import org.apache.plc4x.java.modbus.model.*;
+import org.apache.plc4x.java.base.messages.*;
+import org.apache.plc4x.java.modbus.util.ModbusPlcFieldHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.concurrent.CompletableFuture;
 
-public abstract class BaseModbusPlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter, PlcFieldHandler {
+public abstract class BaseModbusPlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter {
 
     private static final Logger logger = LoggerFactory.getLogger(BaseModbusPlcConnection.class);
 
-    protected BaseModbusPlcConnection(ChannelFactory channelFactory, String params) {
+    BaseModbusPlcConnection(ChannelFactory channelFactory, String params) {
         super(channelFactory);
 
         if (!StringUtils.isEmpty(params)) {
@@ -67,62 +60,40 @@ public abstract class BaseModbusPlcConnection extends AbstractPlcConnection impl
 
     @Override
     public PlcReadRequest.Builder readRequestBuilder() {
-        return new DefaultPlcReadRequest.DefaultPlcReadRequestBuilder(this);
+        return new DefaultPlcReadRequest.Builder(new ModbusPlcFieldHandler());
     }
 
     @Override
-    public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
-        CompletableFuture<PlcReadResponse> readFuture = new CompletableFuture<>();
-        ChannelFuture channelFuture = channel.writeAndFlush(new PlcRequestContainer<>(readRequest, readFuture));
-        channelFuture.addListener(future -> {
-            if (!future.isSuccess()) {
-                readFuture.completeExceptionally(future.cause());
+    public CompletableFuture<PlcReadResponse<?>> read(PlcReadRequest readRequest) {
+        CompletableFuture<InternalPlcReadResponse> future = new CompletableFuture<>();
+        PlcRequestContainer<InternalPlcReadRequest, InternalPlcReadResponse> container =
+            new PlcRequestContainer<>((InternalPlcReadRequest) readRequest, future);
+        channel.writeAndFlush(container).addListener(f -> {
+            if (!f.isSuccess()) {
+                future.completeExceptionally(f.cause());
             }
         });
-        return readFuture;
+        return future
+            .thenApply(PlcReadResponse.class::cast);
     }
 
     @Override
     public PlcWriteRequest.Builder writeRequestBuilder() {
-        return new DefaultPlcWriteRequest.Builder(this);
+        return new DefaultPlcWriteRequest.Builder(new ModbusPlcFieldHandler());
     }
+
     @Override
-    public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {
-        CompletableFuture<PlcWriteResponse> writeFuture = new CompletableFuture<>();
-        ChannelFuture channelFuture = channel.writeAndFlush(new PlcRequestContainer<>(writeRequest, writeFuture));
-        channelFuture.addListener(future -> {
-            if (!future.isSuccess()) {
-                writeFuture.completeExceptionally(future.cause());
+    public CompletableFuture<PlcWriteResponse<?>> write(PlcWriteRequest writeRequest) {
+        CompletableFuture<InternalPlcWriteResponse> future = new CompletableFuture<>();
+        PlcRequestContainer<InternalPlcWriteRequest, InternalPlcWriteResponse> container =
+            new PlcRequestContainer<>((InternalPlcWriteRequest) writeRequest, future);
+        channel.writeAndFlush(container).addListener(f -> {
+            if (!f.isSuccess()) {
+                future.completeExceptionally(f.cause());
             }
         });
-        return writeFuture;
-    }
-
-    @Override
-    public PlcField createField(String fieldQuery) throws PlcInvalidFieldException {
-        if (MaskWriteRegisterModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return MaskWriteRegisterModbusField.of(fieldQuery);
-        } else if (ReadDiscreteInputsModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return ReadDiscreteInputsModbusField.of(fieldQuery);
-        } else if (ReadHoldingRegistersModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return ReadHoldingRegistersModbusField.of(fieldQuery);
-        } else if (ReadInputRegistersModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return ReadInputRegistersModbusField.of(fieldQuery);
-        } else if (CoilModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return CoilModbusField.of(fieldQuery);
-        } else if (RegisterModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return RegisterModbusField.of(fieldQuery);
-        }
-        throw new PlcInvalidFieldException(fieldQuery);
+        return future
+            .thenApply(PlcWriteResponse.class::cast);
     }
 
-    @Override
-    public byte[][] encode(PlcField field, PlcClientDatatype clientDatatype, Object[] values) {
-        return new byte[0][];
-    }
-
-    @Override
-    public Object[] decode(PlcField field, PlcClientDatatype clientDatatype, byte[][] rawData) {
-        return new Object[0];
-    }
 }
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
index 0c650ea..a862ea0 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
@@ -33,6 +33,8 @@ import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
 import org.apache.plc4x.java.api.exceptions.PlcUnsupportedDataTypeException;
 import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.base.messages.InternalPlcRequest;
+import org.apache.plc4x.java.base.messages.InternalPlcResponse;
 import org.apache.plc4x.java.base.messages.PlcRequestContainer;
 import org.apache.plc4x.java.modbus.model.*;
 import org.slf4j.Logger;
@@ -47,16 +49,16 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
 
 
-public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload, PlcRequestContainer<PlcRequest, PlcResponse>> {
+public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload, PlcRequestContainer<InternalPlcRequest, InternalPlcResponse>> {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(Plc4XModbusProtocol.class);
 
     public final AtomicInteger transactionId = new AtomicInteger();
 
-    private final ConcurrentMap<Short, PlcRequestContainer<PlcRequest, PlcResponse>> requestsMap = new ConcurrentHashMap<>();
+    private final ConcurrentMap<Short, PlcRequestContainer<InternalPlcRequest, InternalPlcResponse>> requestsMap = new ConcurrentHashMap<>();
 
     @Override
-    protected void encode(ChannelHandlerContext ctx, PlcRequestContainer<PlcRequest, PlcResponse> msg, List<Object> out) throws Exception {
+    protected void encode(ChannelHandlerContext ctx, PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) throws Exception {
         LOGGER.trace("(<--OUT): {}, {}, {}", ctx, msg, out);
         // Reset transactionId on overflow
         transactionId.compareAndSet(Short.MAX_VALUE + 1, 0);
@@ -68,7 +70,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         }
     }
 
-    private void encodeWriteRequest(PlcRequestContainer<PlcRequest, PlcResponse> msg, List<Object> out) throws PlcException {
+    private void encodeWriteRequest(PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) throws PlcException {
         PlcWriteRequest request = (PlcWriteRequest) msg.getRequest();
 
         // TODO: support multiple requests
@@ -154,7 +156,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
         out.add(new ModbusTcpPayload(transactionId, unitId, modbusRequest));
     }
 
-    private void encodeReadRequest(PlcRequestContainer<PlcRequest, PlcResponse> msg, List<Object> out) throws PlcException {
+    private void encodeReadRequest(PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) throws PlcException {
         PlcReadRequest request = (PlcReadRequest) msg.getRequest();
         // TODO: support multiple requests
         if(request.getFieldNames().size() != 1) {
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java
new file mode 100644
index 0000000..90a7c61
--- /dev/null
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java
@@ -0,0 +1,114 @@
+/*
+ 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.modbus.util;
+
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.base.connection.PlcFieldHandler;
+import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.modbus.model.*;
+
+public class ModbusPlcFieldHandler implements PlcFieldHandler {
+
+    @Override
+    public PlcField createField(String fieldQuery) throws PlcInvalidFieldException {
+        if (MaskWriteRegisterModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
+            return MaskWriteRegisterModbusField.of(fieldQuery);
+        } else if (ReadDiscreteInputsModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
+            return ReadDiscreteInputsModbusField.of(fieldQuery);
+        } else if (ReadHoldingRegistersModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
+            return ReadHoldingRegistersModbusField.of(fieldQuery);
+        } else if (ReadInputRegistersModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
+            return ReadInputRegistersModbusField.of(fieldQuery);
+        } else if (CoilModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
+            return CoilModbusField.of(fieldQuery);
+        } else if (RegisterModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
+            return RegisterModbusField.of(fieldQuery);
+        }
+        throw new PlcInvalidFieldException(fieldQuery);
+    }
+
+    @Override
+    public FieldItem encodeBoolean(PlcField field, Object[] values) {
+        ModbusField enipField = (ModbusField) field;
+        throw new PlcRuntimeException("Invalid encoder for type " + enipField);
+    }
+
+    @Override
+    public FieldItem encodeByte(PlcField field, Object[] values) {
+        ModbusField enipField = (ModbusField) field;
+        throw new PlcRuntimeException("Invalid encoder for type " + enipField);
+    }
+
+    @Override
+    public FieldItem encodeShort(PlcField field, Object[] values) {
+        ModbusField enipField = (ModbusField) field;
+        throw new PlcRuntimeException("Invalid encoder for type " + enipField);
+    }
+
+    @Override
+    public FieldItem encodeInteger(PlcField field, Object[] values) {
+        ModbusField enipField = (ModbusField) field;
+        throw new PlcRuntimeException("Invalid encoder for type " + enipField);
+    }
+
+    @Override
+    public FieldItem encodeLong(PlcField field, Object[] values) {
+        ModbusField enipField = (ModbusField) field;
+        throw new PlcRuntimeException("Invalid encoder for type " + enipField);
+    }
+
+    @Override
+    public FieldItem encodeFloat(PlcField field, Object[] values) {
+        ModbusField enipField = (ModbusField) field;
+        throw new PlcRuntimeException("Invalid encoder for type " + enipField);
+    }
+
+    @Override
+    public FieldItem encodeDouble(PlcField field, Object[] values) {
+        ModbusField enipField = (ModbusField) field;
+        throw new PlcRuntimeException("Invalid encoder for type " + enipField);
+    }
+
+    @Override
+    public FieldItem encodeString(PlcField field, Object[] values) {
+        ModbusField enipField = (ModbusField) field;
+        throw new PlcRuntimeException("Invalid encoder for type " + enipField);
+    }
+
+    @Override
+    public FieldItem encodeTime(PlcField field, Object[] values) {
+        ModbusField enipField = (ModbusField) field;
+        throw new PlcRuntimeException("Invalid encoder for type " + enipField);
+    }
+
+    @Override
+    public FieldItem encodeDate(PlcField field, Object[] values) {
+        ModbusField enipField = (ModbusField) field;
+        throw new PlcRuntimeException("Invalid encoder for type " + enipField);
+    }
+
+    @Override
+    public FieldItem encodeDateTime(PlcField field, Object[] values) {
+        ModbusField enipField = (ModbusField) field;
+        throw new PlcRuntimeException("Invalid encoder for type " + enipField);
+    }
+
+}