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">