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:11 UTC

[plc4x] 16/19: 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 695c0b651b7fdb98e0d8eea11289504c710151a4
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