You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by ld...@apache.org on 2020/10/07 10:02:04 UTC

[plc4x] 09/19: More work on socketcan transport.

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

ldywicki pushed a commit to branch feature/socketcan
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 846e03c372ac58499b168344ac7f29fbb6a8d489
Author: Ɓukasz Dywicki <lu...@code-house.org>
AuthorDate: Fri Aug 28 12:05:30 2020 +0200

    More work on socketcan transport.
---
 .../socketcan/netty/SocketCANChannel.java          |  3 +-
 .../main/resources/protocols/can/socketcan.mspec   |  1 +
 .../apache/plc4x/java/can/CANOpenPlcDriver.java    |  4 +-
 .../java/can/configuration/CANConfiguration.java   | 11 +++++
 .../java/can/protocol/CANOpenProtocolLogic.java    | 49 +++++++++++++++++++++-
 .../services/org.apache.plc4x.java.api.PlcDriver   |  1 +
 .../test/java/org/apache/plc4x/java/can/Main.java  |  2 +-
 .../testsuite/CANOpenPayloadTestSuite.xml          | 29 ++++++++-----
 .../resources/testsuite/SocketCANTestSuite.xml     |  4 +-
 9 files changed, 86 insertions(+), 18 deletions(-)

diff --git a/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/netty/SocketCANChannel.java b/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/netty/SocketCANChannel.java
index 764d1f5..305d452 100644
--- a/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/netty/SocketCANChannel.java
+++ b/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/netty/SocketCANChannel.java
@@ -243,7 +243,8 @@ public class SocketCANChannel extends OioByteStreamChannel {
 
         @Override
         public void write(byte[] b, int off, int len) throws IOException {
-            ByteBuffer buffer = ByteBuffer.wrap(b, off, len);
+            ByteBuffer buffer = ByteBuffer.allocateDirect(len - off);
+            buffer.put(b, off, len);
             CanFrame frame = CanFrame.create(buffer);
             rawCanChannel.write(frame);
         }
diff --git a/protocols/can/src/main/resources/protocols/can/socketcan.mspec b/protocols/can/src/main/resources/protocols/can/socketcan.mspec
index e2e9e3b..e657a9d 100644
--- a/protocols/can/src/main/resources/protocols/can/socketcan.mspec
+++ b/protocols/can/src/main/resources/protocols/can/socketcan.mspec
@@ -58,6 +58,7 @@
     [reserved uint 8 '0x0'] // padding 1
     [reserved uint 8 '0x0'] // padding 2
     [array int 8 'data' COUNT 'size']
+    [padding  uint 8 'pad' '0x00' '8 - (COUNT(data))']
 ]
 
 [type 'SocketCAN20AFrame'
diff --git a/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/CANOpenPlcDriver.java b/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/CANOpenPlcDriver.java
index b1c6fe6..4255ff2 100644
--- a/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/CANOpenPlcDriver.java
+++ b/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/CANOpenPlcDriver.java
@@ -42,12 +42,12 @@ public class CANOpenPlcDriver extends GeneratedDriverBase<SocketCANFrame> {
 
     @Override
     public String getProtocolCode() {
-        return "can";
+        return "canopen";
     }
 
     @Override
     public String getProtocolName() {
-        return "Controller Area Network";
+        return "CANopen";
     }
 
     @Override
diff --git a/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/configuration/CANConfiguration.java b/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/configuration/CANConfiguration.java
index 1a86e45..925ca15 100644
--- a/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/configuration/CANConfiguration.java
+++ b/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/configuration/CANConfiguration.java
@@ -19,8 +19,19 @@ under the License.
 package org.apache.plc4x.java.can.configuration;
 
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.transport.socketcan.CANTransportConfiguration;
 
 public class CANConfiguration implements Configuration, CANTransportConfiguration {
 
+    @ConfigurationParameter
+    private int nodeId;
+
+    public int getNodeId() {
+        return nodeId;
+    }
+
+    public void setNodeId(int nodeId) {
+        this.nodeId = nodeId;
+    }
 }
diff --git a/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/protocol/CANOpenProtocolLogic.java b/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/protocol/CANOpenProtocolLogic.java
index e6f18ca..555ef92 100644
--- a/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/protocol/CANOpenProtocolLogic.java
+++ b/sandbox/test-java-can-driver/src/main/java/org/apache/plc4x/java/can/protocol/CANOpenProtocolLogic.java
@@ -18,23 +18,62 @@ under the License.
 */
 package org.apache.plc4x.java.can.protocol;
 
+import org.apache.plc4x.java.can.configuration.CANConfiguration;
+import org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload;
 import org.apache.plc4x.java.canopen.readwrite.CANOpenPayload;
+import org.apache.plc4x.java.canopen.readwrite.io.CANOpenNetworkPayloadIO;
 import org.apache.plc4x.java.canopen.readwrite.io.CANOpenPayloadIO;
 import org.apache.plc4x.java.canopen.readwrite.types.CANOpenService;
+import org.apache.plc4x.java.canopen.readwrite.types.NMTState;
 import org.apache.plc4x.java.socketcan.readwrite.SocketCANFrame;
 import org.apache.plc4x.java.spi.ConversationContext;
 import org.apache.plc4x.java.spi.Plc4xProtocolBase;
+import org.apache.plc4x.java.spi.configuration.HasConfiguration;
+import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.transaction.RequestTransactionManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class CANOpenProtocolLogic extends Plc4xProtocolBase<SocketCANFrame> {
+import java.util.Timer;
+import java.util.TimerTask;
+
+public class CANOpenProtocolLogic extends Plc4xProtocolBase<SocketCANFrame> implements HasConfiguration<CANConfiguration> {
 
     private Logger logger = LoggerFactory.getLogger(CANOpenProtocolLogic.class);
 
+    private CANConfiguration configuration;
+    private RequestTransactionManager tm;
+
+    @Override
+    public void setConfiguration(CANConfiguration configuration) {
+        this.configuration = configuration;
+        // Set the transaction manager to allow only one message at a time.
+        this.tm = new RequestTransactionManager(1);
+    }
+
     @Override
     public void onConnect(ConversationContext<SocketCANFrame> context) {
-        context.fireConnected();
+        CANOpenNetworkPayload state = new CANOpenNetworkPayload(NMTState.BOOTED_UP);
+        WriteBuffer buffer = new WriteBuffer(1);
+        try {
+            CANOpenNetworkPayloadIO.staticSerialize(buffer, state);
+            context.sendToWire(new SocketCANFrame(cobId(CANOpenService.NMT), buffer.getData()));
+            context.fireConnected();
+
+            Timer heartbeat = new Timer();
+            heartbeat.scheduleAtFixedRate(new TimerTask() {
+                @Override
+                public void run() {
+                    CANOpenNetworkPayload state = new CANOpenNetworkPayload(NMTState.OPERATIONAL);
+                    WriteBuffer buffer = new WriteBuffer(1);
+                    context.sendToWire(new SocketCANFrame(cobId(CANOpenService.NMT), buffer.getData()));
+                }
+            }, 5000, 5000);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
     }
 
     @Override
@@ -46,6 +85,8 @@ public class CANOpenProtocolLogic extends Plc4xProtocolBase<SocketCANFrame> {
         if (service != null) {
             ReadBuffer buffer = new ReadBuffer(msg.getData());
             CANOpenPayload payload = CANOpenPayloadIO.staticParse(buffer, service);
+
+
         }
     }
 
@@ -59,4 +100,8 @@ public class CANOpenProtocolLogic extends Plc4xProtocolBase<SocketCANFrame> {
 
     }
 
+    private int cobId(CANOpenService service) {
+        return service.getValue() & configuration.getNodeId();
+    }
+
 }
diff --git a/sandbox/test-java-can-driver/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver b/sandbox/test-java-can-driver/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
index cb3d2ec..3bbef56 100644
--- a/sandbox/test-java-can-driver/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
+++ b/sandbox/test-java-can-driver/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
@@ -17,3 +17,4 @@
 # under the License.
 #
 org.apache.plc4x.java.can.CANPlcDriver
+org.apache.plc4x.java.can.CANOpenPlcDriver
diff --git a/sandbox/test-java-can-driver/src/test/java/org/apache/plc4x/java/can/Main.java b/sandbox/test-java-can-driver/src/test/java/org/apache/plc4x/java/can/Main.java
index 622f602..e8279b6 100644
--- a/sandbox/test-java-can-driver/src/test/java/org/apache/plc4x/java/can/Main.java
+++ b/sandbox/test-java-can-driver/src/test/java/org/apache/plc4x/java/can/Main.java
@@ -29,7 +29,7 @@ public class Main {
     public static void main(String[] args) throws Exception {
         PlcDriverManager driverManager = new PlcDriverManager();
 
-        PlcConnection connection = driverManager.getConnection("can:javacan://vcan0");
+        PlcConnection connection = driverManager.getConnection("canopen:javacan://vcan0?nodeId=15");
 
     }
 
diff --git a/sandbox/test-java-can-driver/src/test/resources/testsuite/CANOpenPayloadTestSuite.xml b/sandbox/test-java-can-driver/src/test/resources/testsuite/CANOpenPayloadTestSuite.xml
index b5676d9..773f608 100644
--- a/sandbox/test-java-can-driver/src/test/resources/testsuite/CANOpenPayloadTestSuite.xml
+++ b/sandbox/test-java-can-driver/src/test/resources/testsuite/CANOpenPayloadTestSuite.xml
@@ -22,21 +22,30 @@
   <name>Tests of socketcan/CANopen frames.</name>
 
   <testcase>
-    <name>Network heartbeat payload: 0000</name>
-    <raw>0000</raw>
+    <name>Network heartbeat payload: 00</name>
+    <raw>00</raw>
     <root-type>CANOpenPayload</root-type>
     <parser-arguments>
       <arg1>NMT</arg1>
     </parser-arguments>
     <xml>
-      <SocketCANFrame className="org.apache.plc4x.java.canopen.readwrite.CANOpenPayload">
-        <function>15</function>
-        <identifier>5</identifier>
-        <extended>false</extended>
-        <remote>false</remote>
-        <error>false</error>
-        <data>ESIzRFVmd4g=</data>
-      </SocketCANFrame>
+      <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
+        <state>BOOTED_UP</state>
+      </CANOpenNetworkPayload>
+    </xml>
+  </testcase>
+
+  <testcase>
+    <name>Network heartbeat payload: 7F</name>
+    <raw>7F</raw>
+    <root-type>CANOpenPayload</root-type>
+    <parser-arguments>
+      <arg1>NMT</arg1>
+    </parser-arguments>
+    <xml>
+      <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
+        <state>PRE_OPERATIONAL</state>
+      </CANOpenNetworkPayload>
     </xml>
   </testcase>
 
diff --git a/sandbox/test-java-can-driver/src/test/resources/testsuite/SocketCANTestSuite.xml b/sandbox/test-java-can-driver/src/test/resources/testsuite/SocketCANTestSuite.xml
index 03eaaf1..84fc15e 100644
--- a/sandbox/test-java-can-driver/src/test/resources/testsuite/SocketCANTestSuite.xml
+++ b/sandbox/test-java-can-driver/src/test/resources/testsuite/SocketCANTestSuite.xml
@@ -39,7 +39,7 @@
 
   <testcase>
     <name>Standard frame with no payload: 5A1#</name>
-    <raw>a105000000000000</raw>
+    <raw>a1050000000000000000000000000000</raw>
     <root-type>SocketCANFrame</root-type>
     <xml>
       <SocketCANFrame className="org.apache.plc4x.java.socketcan.readwrite.SocketCANFrame">
@@ -55,7 +55,7 @@
 
   <testcase>
     <name>Remote transmission request: 5A1#R</name>
-    <raw>a105004000000000</raw>
+    <raw>a1050040000000000000000000000000</raw>
     <root-type>SocketCANFrame</root-type>
     <xml>
       <SocketCANFrame className="org.apache.plc4x.java.socketcan.readwrite.SocketCANFrame">