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 e9fe1c486e09fe4594cfa1608154e575374cffa8 Author: Ćukasz Dywicki <[email protected]> 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">
