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/22 11:55:23 UTC
[plc4x] 14/22: CANopen adjustments.
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 38a973b24235caf6b7cf38e89f8bc247508680d8
Author: Ćukasz Dywicki <lu...@code-house.org>
AuthorDate: Thu Sep 3 13:46:10 2020 +0200
CANopen adjustments.
---
.../src/main/resources/protocols/can/canopen.mspec | 144 ++++++++++++++-------
sandbox/test-java-can-driver/pom.xml | 5 +
.../java/can/protocol/CANOpenProtocolLogic.java | 12 +-
.../testsuite/CANOpenPayloadTestSuite.xml | 71 ++++++----
4 files changed, 153 insertions(+), 79 deletions(-)
diff --git a/protocols/can/src/main/resources/protocols/can/canopen.mspec b/protocols/can/src/main/resources/protocols/can/canopen.mspec
index c929ae4..bb825f3 100644
--- a/protocols/can/src/main/resources/protocols/can/canopen.mspec
+++ b/protocols/can/src/main/resources/protocols/can/canopen.mspec
@@ -17,21 +17,22 @@
* under the License.
*/
-[enum uint 4 'CANOpenService' [bit 'sdo', bit 'pdo', bit 'transmit', bit 'receive']
- ['0b0000' BROADCAST ['false', 'false', 'false', 'false'] ]
- ['0b0001' SYNC ['false', 'false', 'false', 'false'] ]
- ['0b0010' TIME ['false', 'false', 'false', 'false'] ]
- ['0b1110' NMT ['false', 'false', 'false', 'false'] ]
- ['0b1100' SDO_REQUEST ['true', 'false', 'false', 'true' ] ]
- ['0b1011' SDO_RESPONSE ['true', 'false', 'true', 'false'] ]
- ['0b0011' TPDO_1 ['false', 'true', 'true', 'false'] ]
- ['0b0100' RPDO_1 ['false', 'true', 'false', 'true' ] ]
- ['0b0101' TPDO_2 ['false', 'true', 'true', 'false'] ]
- ['0b0110' RPDO_2 ['false', 'true', 'false', 'true' ] ]
- ['0b0111' TPDO_3 ['false', 'true', 'true', 'false'] ]
- ['0b1000' RPDO_3 ['false', 'true', 'false', 'true' ] ]
- ['0b1001' TPDO_4 ['false', 'true', 'true', 'false'] ]
- ['0b1010' RPDO_4 ['false', 'true', 'false', 'true' ] ]
+[enum uint 4 'CANOpenService' [uint 8 'min', uint 8 'max', bit 'pdo']
+ ['0b0000' NMT ['0', '0' , 'false' ] ]
+ ['0b0001' SYNC ['0x80', '0x80' , 'false' ] ]
+ ['0b0001' EMCY ['0x81', '0xFF' , 'false' ] ]
+ ['0b0010' TIME ['0x100', '0x100', 'false' ] ]
+ ['0b0011' TRANSMIT_PDO_1 ['0x181', '0x1FF', 'true' ] ]
+ ['0b0100' RECEIVE_PDO_1 ['0x201', '0x27F', 'true' ] ]
+ ['0b0101' TRANSMIT_PDO_2 ['0x281', '0x2FF', 'true' ] ]
+ ['0b0110' RECEIVE_PDO_2 ['0x301', '0x37F', 'true' ] ]
+ ['0b0111' TRANSMIT_PDO_3 ['0x381', '0x3FF', 'true' ] ]
+ ['0b1000' RECEIVE_PDO_3 ['0x401', '0x47F', 'true' ] ]
+ ['0b1001' TRANSMIT_PDO_4 ['0x481', '0x4FF', 'true' ] ]
+ ['0b1010' RECEIVE_PDO_4 ['0x501', '0x57F', 'true' ] ]
+ ['0b1011' TRANSMIT_SDO ['0x581', '0x5FF', 'false' ] ]
+ ['0b1100' RECEIVE_SDO ['0x601', '0x67F', 'false' ] ]
+ ['0b1110' HEARTBEAT ['0x701', '0x77F', 'false' ] ]
]
[enum uint 8 'NMTStateRequest'
@@ -51,7 +52,7 @@
[discriminatedType 'CANOpenPayload' [CANOpenService 'function']
[typeSwitch 'function'
- ['CANOpenService.BROADCAST' CANOpenBroadcastPayload
+ ['CANOpenService.NMT' CANOpenNetworkPayload
[enum NMTStateRequest 'request']
[reserved uint 1 '0x00']
[simple uint 7 'node']
@@ -59,56 +60,103 @@
['CANOpenService.TIME' CANOpenTimeSynchronization
[simple TimeOfDay 'timeOfDay']
]
- ['CANOpenService.NMT' CANOpenNetworkPayload
- [enum NMTState 'state']
- ]
- ['CANOpenService.SDO_REQUEST' CANOpenSDORequest
- [enum SDOCommand 'command']
- [reserved uint 1 '0x00']
- [implicit uint 2 'size' 'COUNT(data)']
- [simple bit 'expedited'] // segmented
- [simple bit 'placement']
- [simple uint 16 'index']
- [simple uint 8 'subindex']
- [array uint 8 'data' COUNT 'size']
- ]
- ['CANOpenService.SDO_RESPONSE' CANOpenSDOResponse
- [enum SDOCommand 'command']
- [reserved uint 1 '0x00']
- [implicit uint 2 'size' 'COUNT(data)']
- [simple bit 'expedited'] // segmented
- [simple bit 'placement']
- [simple uint 16 'index']
- [simple uint 8 'subindex']
- [array uint 8 'data' COUNT 'size']
- ]
- ['CANOpenService.RPDO_1' CANOpenRPDO
+ ['CANOpenService.RECEIVE_PDO_1' CANOpenPDOPayload
[simple CANOpenPDO 'pdo' ['1', 'true']]
]
- ['CANOpenService.TPDO_1' CANOpenTPDO
+ ['CANOpenService.TRANSMIT_PDO_1' CANOpenPDOPayload
[simple CANOpenPDO 'pdo' ['1', 'false']]
]
- ['CANOpenService.RPDO_2' CANOpenRPDO
+ ['CANOpenService.RECEIVE_PDO_2' CANOpenPDOPayload
[simple CANOpenPDO 'pdo' ['2', 'true']]
]
- ['CANOpenService.TPDO_2' CANOpenTPDO
+ ['CANOpenService.TRANSMIT_PDO_2' CANOpenPDOPayload
[simple CANOpenPDO 'pdo' ['1', 'false']]
]
- ['CANOpenService.RPDO_3' CANOpenRPDO
+ ['CANOpenService.RECEIVE_PDO_3' CANOpenPDOPayload
[simple CANOpenPDO 'pdo' ['3', 'true']]
]
- ['CANOpenService.TPDO_3' CANOpenTPDO
+ ['CANOpenService.TRANSMIT_PDO_3' CANOpenPDOPayload
[simple CANOpenPDO 'pdo' ['1', 'false']]
]
- ['CANOpenService.RPDO_4' CANOpenRPDO
+ ['CANOpenService.RECEIVE_PDO_4' CANOpenPDOPayload
[simple CANOpenPDO 'pdo' ['4', 'true']]
]
- ['CANOpenService.TPDO_4' CANOpenTPDO
+ ['CANOpenService.TRANSMIT_PDO_4' CANOpenPDOPayload
[simple CANOpenPDO 'pdo' ['1', 'false']]
]
+ ['CANOpenService.TRANSMIT_SDO' CANOpenSDORequest
+ [enum SDOCommand 'command']
+ [simple SDORequest 'request' ['command']]
+ ]
+ ['CANOpenService.RECEIVE_SDO' CANOpenSDOResponse
+ [enum SDOCommand 'command']
+ [simple SDOResponse 'response' ['command']]
+ ]
+ ['CANOpenService.HEARTBEAT' CANOpenHeartbeatPayload
+ [enum NMTState 'state']
+ ]
+ ]
+]
+
+[type 'SDORequest' [SDOCommand 'command']
+ [typeSwitch 'command'
+ ['SDOCommand.INITIALIZE_DOWNLOAD' SDOInitializeDownloadRequest
+ [reserved uint 1 '0x00']
+ [implicit uint 2 'size' 'expedited && indicated ? 4 - COUNT(data) : 0']
+ [simple bit 'expedited']
+ [simple bit 'indicated']
+ [simple Multiplexer 'address']
+ [array int 8 'data' COUNT '(expedited && indicated) ? 4 - size : 0']
+ [padding uint 8 'alignment' '0x00' '4 - (COUNT(data))']
+ ]
+ ['SDOCommand.SEGMENT_DOWNLOAD' SDOSegmentDownloadRequest
+ [simple bit 'toggle']
+ [implicit uint 3 'size' '7 - COUNT(data)']
+ [simple bit 'last']
+ [array int 8 'data' COUNT '7 - data']
+ [padding uint 8 'alignment' '0x00' '7 - (COUNT(data))']
+ ]
+ ['SDOCommand.INITIALIZE_UPLOAD' SDOInitializeUploadRequest
+ [reserved uint 5 '0x00']
+ [simple Multiplexer 'address']
+ [reserved int 32 '0x00'] // padding
+ ]
+ ]
+]
+
+[type 'SDOResponse' [SDOCommand 'command']
+ [typeSwitch 'command'
+ ['SDOCommand.SEGMENT_UPLOAD' SDOSegmentUploadResponse
+ [reserved uint 5 '0x00']
+ [simple Multiplexer 'address']
+ [reserved int 32 '0x00'] // padding
+ ]
+ ['SDOCommand.INITIALIZE_DOWNLOAD' SDOInitializeDownloadResponse
+ [simple bit 'toggle']
+ [reserved uint 4 '0x00']
+ [reserved int 32 '0x00'] // padding
+ ]
+ ['SDOCommand.INITIALIZE_UPLOAD' SDOInitializeUploadResponse
+ [simple SDOSegment 'segment']
+ ]
]
]
+[type 'SDOSegment'
+ [reserved uint 1 '0x00']
+ [implicit uint 2 'size' 'expedited && indicated ? 4 - COUNT(data) : 0']
+ [simple bit 'expedited']
+ [simple bit 'indicated']
+ [simple Multiplexer 'address']
+ [array int 8 'data' COUNT '(expedited && indicated) ? 4 - size : 0']
+ [padding uint 8 'alignment' '0x00' '4 - (COUNT(data))']
+]
+
+[type 'Multiplexer'
+ [simple uint 16 'index']
+ [simple uint 8 'subindex']
+]
+
[enum uint 3 'SDOCommand'
['0x00' SEGMENT_DOWNLOAD]
['0x01' INITIALIZE_DOWNLOAD]
@@ -120,7 +168,7 @@
]
[type 'CANOpenPDO' [uint 2 'index', bit 'receive']
-
+ [array int 8 'data' COUNT '8']
]
[type 'TimeOfDay'
diff --git a/sandbox/test-java-can-driver/pom.xml b/sandbox/test-java-can-driver/pom.xml
index 50e48e7..e3e72c4 100644
--- a/sandbox/test-java-can-driver/pom.xml
+++ b/sandbox/test-java-can-driver/pom.xml
@@ -73,6 +73,11 @@
</dependency>
<dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-configuration2</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.plc4x</groupId>
<artifactId>plc4j-transport-socketcan</artifactId>
<version>0.8.0-SNAPSHOT</version>
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 0090e0e..c193ec3 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
@@ -19,8 +19,10 @@ 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.CANOpenHeartbeatPayload;
import org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload;
import org.apache.plc4x.java.canopen.readwrite.CANOpenPayload;
+import org.apache.plc4x.java.canopen.readwrite.io.CANOpenHeartbeatPayloadIO;
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;
@@ -58,7 +60,7 @@ public class CANOpenProtocolLogic extends Plc4xProtocolBase<SocketCANFrame> impl
public void onConnect(ConversationContext<SocketCANFrame> context) {
try {
if (configuration.isHeartbeat()) {
- context.sendToWire(createFrame(new CANOpenNetworkPayload(NMTState.BOOTED_UP)));
+ context.sendToWire(createFrame(new CANOpenHeartbeatPayload(NMTState.BOOTED_UP)));
context.fireConnected();
this.heartbeat = new Timer();
@@ -66,7 +68,7 @@ public class CANOpenProtocolLogic extends Plc4xProtocolBase<SocketCANFrame> impl
@Override
public void run() {
try {
- context.sendToWire(createFrame(new CANOpenNetworkPayload(NMTState.OPERATIONAL)));
+ context.sendToWire(createFrame(new CANOpenHeartbeatPayload(NMTState.OPERATIONAL)));
} catch (ParseException e) {
e.printStackTrace();
}
@@ -78,10 +80,10 @@ public class CANOpenProtocolLogic extends Plc4xProtocolBase<SocketCANFrame> impl
}
}
- private SocketCANFrame createFrame(CANOpenNetworkPayload state) throws ParseException {
+ private SocketCANFrame createFrame(CANOpenHeartbeatPayload state) throws ParseException {
WriteBuffer buffer = new WriteBuffer(state.getLengthInBytes());
- CANOpenNetworkPayloadIO.staticSerialize(buffer, state);
- return new SocketCANFrame(cobId(CANOpenService.NMT), buffer.getData());
+ CANOpenHeartbeatPayloadIO.staticSerialize(buffer, state);
+ return new SocketCANFrame(cobId(CANOpenService.HEARTBEAT), buffer.getData());
}
@Override
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 3188005..8537aee 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
@@ -67,12 +67,12 @@
<raw>00</raw>
<root-type>CANOpenPayload</root-type>
<parser-arguments>
- <arg1>NMT</arg1>
+ <arg1>HEARTBEAT</arg1>
</parser-arguments>
<xml>
- <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
+ <CANOpenHeartbeatPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenHeartbeatPayload">
<state>BOOTED_UP</state>
- </CANOpenNetworkPayload>
+ </CANOpenHeartbeatPayload>
</xml>
</testcase>
@@ -81,12 +81,12 @@
<raw>7F</raw>
<root-type>CANOpenPayload</root-type>
<parser-arguments>
- <arg1>NMT</arg1>
+ <arg1>HEARTBEAT</arg1>
</parser-arguments>
<xml>
- <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
+ <CANOpenHeartbeatPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenHeartbeatPayload">
<state>PRE_OPERATIONAL</state>
- </CANOpenNetworkPayload>
+ </CANOpenHeartbeatPayload>
</xml>
</testcase>
@@ -95,21 +95,21 @@
<raw>05</raw>
<root-type>CANOpenPayload</root-type>
<parser-arguments>
- <arg1>NMT</arg1>
+ <arg1>HEARTBEAT</arg1>
</parser-arguments>
<xml>
- <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
+ <CANOpenHeartbeatPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenHeartbeatPayload">
<state>OPERATIONAL</state>
- </CANOpenNetworkPayload>
+ </CANOpenHeartbeatPayload>
</xml>
</testcase>
<testcase>
- <name>SDO request, payload: 4317100000000000</name>
- <raw>4317100000000000</raw>
+ <name>SDO request, payload: 43171000</name>
+ <raw>43171000</raw>
<root-type>CANOpenPayload</root-type>
<parser-arguments>
- <arg1>SDO_REQUEST</arg1>
+ <arg1>RECEIVE_SDO</arg1>
</parser-arguments>
<xml>
<CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
@@ -124,11 +124,11 @@
</testcase>
<testcase>
- <name>SDO request, payload: 00171000A00F0000</name>
- <raw>00171000A00F0000</raw>
+ <name>SDO request, payload: 00171000<!--A00F0000--></name>
+ <raw>00171000<!--A00F0000--></raw>
<root-type>CANOpenPayload</root-type>
<parser-arguments>
- <arg1>SDO_REQUEST</arg1>
+ <arg1>RECEIVE_SDO</arg1>
</parser-arguments>
<xml>
<CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
@@ -147,7 +147,7 @@
<raw>2B171000D00F</raw>
<root-type>CANOpenPayload</root-type>
<parser-arguments>
- <arg1>SDO_REQUEST</arg1>
+ <arg1>RECEIVE_SDO</arg1>
</parser-arguments>
<xml>
<CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
@@ -165,11 +165,11 @@
</testcase>
<testcase>
- <name>SDO write result, payload: 60171000D0F00000</name>
- <raw>00171000A00F0000</raw>
+ <name>SDO write result, payload: 60171000<!--A00F0000--></name>
+ <raw>00171000<!--A00F0000--></raw>
<root-type>CANOpenPayload</root-type>
<parser-arguments>
- <arg1>SDO_REQUEST</arg1>
+ <arg1>TRANSMIT_SDO</arg1>
</parser-arguments>
<xml>
<CANOpenSDORequest className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDORequest">
@@ -185,16 +185,21 @@
<!-- samples -->
<testcase>
- <name>SDO response, payload: 6000200000</name>
- <raw>6000200000</raw>
+ <name>SDO response, payload: 60002000</name>
+ <raw>60002000</raw>
<root-type>CANOpenPayload</root-type>
<parser-arguments>
- <arg1>SDO_RESPONSE</arg1>
+ <arg1>TRANSMIT_SDO</arg1>
</parser-arguments>
<xml>
- <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
- <state>PRE_OPERATIONAL</state>
- </CANOpenNetworkPayload>
+ <CANOpenSDOResponse className="org.apache.plc4x.java.canopen.readwrite.CANOpenSDOResponse">
+ <command>SEGMENT_UPLOAD</command>
+ <expedited>false</expedited>
+ <placement>false</placement>
+ <index>8192</index>
+ <subindex>0</subindex>
+ <data/>
+ </CANOpenSDOResponse>
</xml>
</testcase>
@@ -203,14 +208,28 @@
<raw>78563412</raw>
<root-type>CANOpenPayload</root-type>
<parser-arguments>
- <arg1>SDO_RESPONSE</arg1>
+ <arg1>RECEIVE_SDO</arg1>
</parser-arguments>
<xml>
<CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
<state>PRE_OPERATIONAL</state>
</CANOpenNetworkPayload>
</xml>
+ </testcase>
+
+ <testcase>
+ <name>PDO, payload: F9013E014C015C01</name>
+ <raw>F9013E014C015C01</raw>
+ <root-type>CANOpenPayload</root-type>
+ <parser-arguments>
+ <arg1>TRANSMIT_PDO_1</arg1>
+ </parser-arguments>
+ <xml>
+ <CANOpenNetworkPayload className="org.apache.plc4x.java.canopen.readwrite.CANOpenNetworkPayload">
+ <state>PRE_OPERATIONAL</state>
+ </CANOpenNetworkPayload>
+ </xml>
</testcase>
</test:testsuite>
\ No newline at end of file