This is an automated email from the ASF dual-hosted git repository. ldywicki pushed a commit to branch feature/socketcan-0.8-preparations in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 57cd3114ebec7ff79c0f70f401dc8230f1593b7c Author: Ćukasz Dywicki <[email protected]> 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
