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/03/09 11:33:57 UTC

[plc4x] 03/03: - Made the serial chanel configurable (baud-rate, data-bits, stop-bits, parity)

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

commit e73e7c375001c753dd1a485336fb970e03510396
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Mon Mar 9 12:33:33 2020 +0100

    - Made the serial chanel configurable (baud-rate, data-bits, stop-bits, parity)
---
 .../java/api/model/PlcSubscriptionHandle.java      |   1 +
 .../knxnetip/protocol/KnxNetIpProtocolLogic.java   |   1 +
 .../plc4x/java/transport/serial/SerialChannel.java |  10 +-
 .../java/transport/serial/SerialChannelConfig.java | 109 +++++++++++++++++++++
 .../transport/serial/SerialChannelFactory.java     |   4 +
 .../transport/serial/SerialChannelHandler.java     |   8 +-
 .../transport/serial/SerialChannelOptions.java     |  49 +++++++++
 .../transport/serial/SerialPollingSelector.java    |  18 ++--
 .../serial/SerialTransportConfiguration.java       |  15 +++
 9 files changed, 196 insertions(+), 19 deletions(-)

diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java
index 285ded8..7bfdfd5 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java
@@ -34,4 +34,5 @@ import java.util.function.Consumer;
 public interface PlcSubscriptionHandle {
 
     PlcConsumerRegistration register(Consumer<PlcSubscriptionEvent> consumer);
+
 }
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 fe11eb8..4163760 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
@@ -367,6 +367,7 @@ public class KnxNetIpProtocolLogic extends Plc4xProtocolBase<KNXNetIPMessage> im
 
     protected void publishEvent(GroupAddress groupAddress, PlcValue plcValue) {
         // Create a subscription event from the input.
+        // TODO: Check this ... this is sort of not really right ...
         final PlcSubscriptionEvent event = new DefaultPlcSubscriptionEvent(Instant.now(),
             Collections.singletonMap("knxData", Pair.of(PlcResponseCode.OK, plcValue)));
 
diff --git a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannel.java b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannel.java
index c331d5a..b9d5ee6 100644
--- a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannel.java
+++ b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannel.java
@@ -50,7 +50,7 @@ import java.util.concurrent.RejectedExecutionException;
 public class SerialChannel extends AbstractNioByteChannel implements DuplexChannel {
 
     private static final Logger logger = LoggerFactory.getLogger(SerialChannel.class);
-    private final ChannelConfig config;
+    private final SerialChannelConfig config;
 
     private final VoidChannelPromise unsafeVoidPromise = new VoidChannelPromise(this, false);
     private boolean readPending = false; // Did we receive an EOF?
@@ -74,7 +74,7 @@ public class SerialChannel extends AbstractNioByteChannel implements DuplexChann
      */
     protected SerialChannel(Channel parent, SelectableChannel ch) {
         super(parent, ch);
-        config = new DefaultChannelConfig(this);
+        config = new SerialChannelConfig(this);
         pipeline = newChannelPipeline();
     }
 
@@ -169,7 +169,7 @@ public class SerialChannel extends AbstractNioByteChannel implements DuplexChann
             if (((SerialSocketAddress) remoteAddress).getIdentifier().startsWith("TEST")) {
                 comPort = SerialChannelHandler.DummyHandler.INSTANCE;
             } else {
-                comPort = new SerialChannelHandler.SerialPortHandler(remoteAddress);
+                comPort = new SerialChannelHandler.SerialPortHandler(remoteAddress, config);
             }
             logger.debug("Using Com Port {}, trying to open port", comPort.getIdentifier());
             if (comPort.open()) {
@@ -409,8 +409,8 @@ public class SerialChannel extends AbstractNioByteChannel implements DuplexChann
             SerialChannel.this.remoteAddress = remoteAddress;
             eventLoop().execute(() -> {
                 try {
-                    final boolean sucess = doConnect(remoteAddress, localAddress);
-                    if (sucess) {
+                    final boolean success = doConnect(remoteAddress, localAddress);
+                    if (success) {
                         // Send a message to the pipeline
                         pipeline().fireChannelActive();
                         // Finally, close the promise
diff --git a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelConfig.java b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelConfig.java
new file mode 100644
index 0000000..ec1d04b
--- /dev/null
+++ b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelConfig.java
@@ -0,0 +1,109 @@
+/*
+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.transport.serial;
+
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelConfig;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.DefaultChannelConfig;
+
+import java.util.Map;
+
+public class SerialChannelConfig extends DefaultChannelConfig implements ChannelConfig {
+
+    private int baudRate;
+    private int dataBits;
+    private int stopBits;
+    private int parityBits;
+
+    public SerialChannelConfig(Channel channel) {
+        super(channel);
+    }
+
+    @Override
+    public Map<ChannelOption<?>, Object> getOptions() {
+        return getOptions(super.getOptions(),
+            SerialChannelOptions.BAUD_RATE, SerialChannelOptions.DATA_BITS,
+            SerialChannelOptions.STOP_BITS, SerialChannelOptions.PARITY_BITS);
+    }
+
+    @Override
+    public <T> boolean setOption(ChannelOption<T> option, T value) {
+        if(option == SerialChannelOptions.BAUD_RATE) {
+            if(value instanceof Integer) {
+                baudRate = (Integer) value;
+                return true;
+            }
+            return false;
+        } else if(option == SerialChannelOptions.DATA_BITS) {
+            if(value instanceof Integer) {
+                dataBits = (Integer) value;
+                return true;
+            }
+            return false;
+        } else if(option == SerialChannelOptions.STOP_BITS) {
+            if(value instanceof Integer) {
+                stopBits = (Integer) value;
+                return true;
+            }
+            return false;
+        } else if(option == SerialChannelOptions.PARITY_BITS) {
+            if(value instanceof Integer) {
+                parityBits = (Integer) value;
+                return true;
+            }
+            return false;
+        } else {
+            return super.setOption(option, value);
+        }
+    }
+
+    public int getBaudRate() {
+        return baudRate;
+    }
+
+    public void setBaudRate(int baudRate) {
+        this.baudRate = baudRate;
+    }
+
+    public int getDataBits() {
+        return dataBits;
+    }
+
+    public void setDataBits(int dataBits) {
+        this.dataBits = dataBits;
+    }
+
+    public int getStopBits() {
+        return stopBits;
+    }
+
+    public void setStopBits(int stopBits) {
+        this.stopBits = stopBits;
+    }
+
+    public int getParityBits() {
+        return parityBits;
+    }
+
+    public void setParityBits(int parityBits) {
+        this.parityBits = parityBits;
+    }
+
+}
diff --git a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelFactory.java b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelFactory.java
index 846d458..2ca6155 100644
--- a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelFactory.java
+++ b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelFactory.java
@@ -54,6 +54,10 @@ public class SerialChannelFactory extends NettyChannelFactory implements HasConf
     public void configureBootstrap(Bootstrap bootstrap) {
         if(configuration != null) {
             logger.info("Configuring Bootstrap with {}", configuration);
+            bootstrap.option(SerialChannelOptions.BAUD_RATE, configuration.getBaudRate());
+            bootstrap.option(SerialChannelOptions.DATA_BITS, configuration.getNumDataBits());
+            bootstrap.option(SerialChannelOptions.STOP_BITS, configuration.getNumStopBits());
+            bootstrap.option(SerialChannelOptions.PARITY_BITS, configuration.getParityBits());
         }
     }
 
diff --git a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelHandler.java b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelHandler.java
index 6b5bb2b..91c0e65 100644
--- a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelHandler.java
+++ b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelHandler.java
@@ -116,17 +116,21 @@ public abstract class SerialChannelHandler {
 
     public static class SerialPortHandler extends SerialChannelHandler {
 
+        private SerialChannelConfig config;
         private SerialPort comPort;
 
-        public SerialPortHandler(SocketAddress address) {
+        public SerialPortHandler(SocketAddress address, SerialChannelConfig config) {
             super(address);
+            this.config = config;
+            // Get the serial port described by the path/name in the address.
             comPort = SerialPort.getCommPort(((SerialSocketAddress) address).getIdentifier());
         }
 
         @Override
         public boolean open() {
             if (comPort.openPort()) {
-                comPort.setComPortParameters(19200, 8, SerialPort.ONE_STOP_BIT, SerialPort.NO_PARITY);
+                comPort.setComPortParameters(config.getBaudRate(), config.getDataBits(),
+                    config.getStopBits(), config.getParityBits());
                 return true;
             }
             return false;
diff --git a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelOptions.java b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelOptions.java
new file mode 100644
index 0000000..f6ff45f
--- /dev/null
+++ b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialChannelOptions.java
@@ -0,0 +1,49 @@
+/*
+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.transport.serial;
+
+import io.netty.channel.ChannelOption;
+
+public class SerialChannelOptions {
+
+    /**
+     * Option to configure the baud rate.
+     */
+    public static final ChannelOption<Integer> BAUD_RATE =
+        ChannelOption.valueOf(Integer.class, "BAUD_RATE");
+
+    /**
+     * Option to configure the number of data bits.
+     */
+    public static final ChannelOption<Integer> DATA_BITS =
+        ChannelOption.valueOf(Integer.class, "DATA_BITS");
+
+    /**
+     * Option to configure the number of stop bits.
+     */
+    public static final ChannelOption<Integer> STOP_BITS =
+        ChannelOption.valueOf(Integer.class, "STOP_BITS");
+
+    /**
+     * Option to configure the number of parity bits.
+     */
+    public static final ChannelOption<Integer> PARITY_BITS =
+        ChannelOption.valueOf(Integer.class, "PARITY_BITS");
+
+}
diff --git a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialPollingSelector.java b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialPollingSelector.java
index 854d8a9..26f1af1 100644
--- a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialPollingSelector.java
+++ b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialPollingSelector.java
@@ -25,7 +25,6 @@ import org.apache.commons.lang3.NotImplementedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
 import java.nio.channels.spi.AbstractSelectableChannel;
@@ -94,7 +93,7 @@ class SerialPollingSelector extends AbstractSelector {
     }
 
     @Override
-    public int selectNow() throws IOException {
+    public int selectNow() {
         // throw new NotImplementedException("");
         logger.debug("selectNow()");
         // check if one channel is active
@@ -102,18 +101,13 @@ class SerialPollingSelector extends AbstractSelector {
     }
 
     @Override
-    public int select(long timeout) throws IOException {
-        logger.debug("select({})", timeout);
-        if (events.size() > 0) {
+    public int select(long timeout) {
+        if (!events.isEmpty()) {
             return events.size();
         }
         this.selectPromise = new DefaultPromise<>(executor);
         try {
-            if (selectPromise.await(timeout)) {
-                logger.debug("Promise was cancelled, new Events should be there.");
-            } else {
-                logger.debug("Promise timed out, expecting no new events.");
-            }
+            selectPromise.await(timeout);
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
             throw new RuntimeException("Was interrupted", e);
@@ -122,7 +116,7 @@ class SerialPollingSelector extends AbstractSelector {
     }
 
     @Override
-    public int select() throws IOException {
+    public int select() {
         throw new NotImplementedException("");
     }
 
@@ -151,7 +145,7 @@ class SerialPollingSelector extends AbstractSelector {
     }
 
     @Override
-    protected void implCloseSelector() throws IOException {
+    protected void implCloseSelector() {
         // TODO should we do something here?
     }
 
diff --git a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialTransportConfiguration.java b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialTransportConfiguration.java
index 9c7478f..15b44b8 100644
--- a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialTransportConfiguration.java
+++ b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialTransportConfiguration.java
@@ -18,8 +18,23 @@ under the License.
 */
 package org.apache.plc4x.java.transport.serial;
 
+import com.fazecast.jSerialComm.SerialPort;
 import org.apache.plc4x.java.spi.transport.TransportConfiguration;
 
 public interface SerialTransportConfiguration extends TransportConfiguration {
 
+    int getBaudRate();
+
+    default int getNumDataBits() {
+        return 8;
+    }
+
+    default int getNumStopBits() {
+        return SerialPort.ONE_STOP_BIT;
+    }
+
+    default int getParityBits() {
+        return SerialPort.NO_PARITY;
+    }
+
 }