This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/plc4x-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new ae85d07  Site checkin for project PLC4X: Jenkins Tools
ae85d07 is described below

commit ae85d0711dcad46d0dd280586209c97dc6829271
Author: jenkins <[email protected]>
AuthorDate: Thu Sep 16 20:02:30 2021 +0000

    Site checkin for project PLC4X: Jenkins Tools
---
 images/apache-plc4x-can-canopen.png                | Bin 0 -> 20760 bytes
 .../{transports/index.html => protocols/can.html}  |  70 +++--
 users/protocols/canopen.html                       |   4 +-
 users/protocols/{canopen.html => genericcan.html}  | 299 +++------------------
 users/transports/{index.html => can.html}          | 108 ++++++--
 users/transports/index.html                        |   3 +
 6 files changed, 184 insertions(+), 300 deletions(-)

diff --git a/images/apache-plc4x-can-canopen.png 
b/images/apache-plc4x-can-canopen.png
new file mode 100644
index 0000000..07b5ec8
Binary files /dev/null and b/images/apache-plc4x-can-canopen.png differ
diff --git a/users/transports/index.html b/users/protocols/can.html
similarity index 87%
copy from users/transports/index.html
copy to users/protocols/can.html
index b4ac505..d62755b 100644
--- a/users/transports/index.html
+++ b/users/protocols/can.html
@@ -159,7 +159,7 @@
                                 
                                                                     
                                                                 <li 
class="nav-item">
-                            <strong class="nav-link">Transports</strong>
+                            <a href="../../users/transports/index.html" 
class="nav-link">Transports</a>
                                     <ul class="flex-column pl-4 nav">
                                             <li class="nav-item">
                             <a href="../../users/transports/tcp.html" 
class="nav-link">TCP</a>
@@ -287,29 +287,53 @@
         </nav>
                                             <main role="main" 
class="ml-sm-auto px-4 col-sm-pull col-md-9 col-lg-10 h-100">
             <div class="sect1">
-<h2 id="transports">Transports</h2>
+<h2 id="can_bus_driver_adapter">CAN Bus Driver Adapter</h2>
 <div class="sectionbody">
-<div class="ulist">
-<ul>
-<li>
-<p><a href="tcp.html">TCP</a></p>
-</li>
-<li>
-<p><a href="udp.html">UDP</a></p>
-</li>
-<li>
-<p><a href="raw-socket.html">Raw Socket</a></p>
-</li>
-<li>
-<p><a href="serial.html">Serial Port</a></p>
-</li>
-<li>
-<p><a href="socketcan.html">SocketCAN</a></p>
-</li>
-<li>
-<p><a href="pcap-replay.html">PCAP replay</a></p>
-</li>
-</ul>
+<div class="paragraph">
+<p>The CAN Bus driver is a special kind of driver which does not bring any 
logic.
+Its responsibility is to combine <a href="../transports/can.html">CAN 
transport facade</a> and custom application layer protocols.
+In this way, the protocol can use its own "root frame" type which is not 
delivered from CAN bus frame.</p>
+</div>
+<div class="sect2">
+<h3 id="more_details_on_the_driver">More details on the driver</h3>
+<div class="paragraph">
+<p>The <code>CANDriverAdapter</code> is a full implementation of Apache PLC4X 
API.
+Under the hood adapter will forward all operations to delegate driver.
+Work which is done by the adapter is to transform data incoming via CAN 
transport into frame supported by driver.
+In this regard the <code>CANDriverAdapter</code> does not implement any real 
protocol.
+All it does is transformation of incoming frames into frame desired by real 
driver.</p>
+</div>
+<div class="paragraph">
+<p>Below diagram explains how driver adapter works with CANopen.
+Given that this is currently biggest CAN driver implemented in Apache PLC4X we 
will use it as a reference.</p>
+</div>
+<div class="imageblock">
+<div class="content">
+<img src="../../images/users/protocols/apache-plc4x-can-canopen.png" 
alt="apache plc4x can canopen" width="1480" height="224"/>
+</div>
+</div>
+<div class="paragraph">
+<p>Looking at left most side of diagram we can see a CAN transport.
+The transport knows how to receive and send data to the CAN bus.
+Transport can create its own intermediate representation of CAN data frame.
+In case of <code>SocketCAN</code> there is a dedicated type called 
<code>SocketCANFrame</code>.</p>
+</div>
+<div class="paragraph">
+<p>Most of other drivers in Apache PLC4X which rely on TCP, UDP or serial 
transports can unify right above transport.
+Yet due to variety of APIs which are possible to be used with CAN bus such 
early unification at API level is not possible.</p>
+</div>
+<div class="paragraph">
+<p>Place where <code>CANDriverAdapter</code> jumps in is once transport formed 
the frame structure.
+Then, adapter asks the transport to turn that structure into a 
<code>FrameData</code>.
+An instance of <code>FrameData</code> is then passed to an adapter delivered 
by CANopen Driver.
+This adapter can then create a <code>CANopenFrame</code> which is processed by 
desired driver logic.</p>
+</div>
+<div class="paragraph">
+<p>The return side, when desired driver wants to publish information is a bit 
simplified.
+Because <code>FrameData</code> does not be a real type (it is an interface) we 
can skip it.
+With a help of a <code>CANFrameBuilder</code> provided by CAN transport driver 
can easily construct a structure which is supported by it.
+While this makes an API asymmetric it also makes it possible to use any third 
party transport with <code>CANopenDriver</code>.</p>
+</div>
 </div>
 </div>
 </div>
diff --git a/users/protocols/canopen.html b/users/protocols/canopen.html
index 6da7412..a2f8035 100644
--- a/users/protocols/canopen.html
+++ b/users/protocols/canopen.html
@@ -433,13 +433,13 @@ There are multiple articles and sources which attempts to 
give introduction, yet
 <p>CAN 2.0A uses 11 bit identifier and up to 8 bytes of data.</p>
 </li>
 <li>
-<p>CAN 2.0B uses 29 bit identifier and up to 64 bytes of data.</p>
+<p>CAN 2.0B uses 29 bit identifier and up to 8 bytes of data.</p>
 </li>
 </ul>
 </div>
 <div class="paragraph">
 <p>To make things worse with introduction of CAN FD amount of combinations 
increased even more.
-Double check frame format as this integration supports CANopen and does not 
support CANopen FD.</p>
+Double check frame format as this integration supports CANopen and does not 
support CANopen FD nor CAN 2.0B.</p>
 </div>
 <div class="paragraph">
 <p>Further reading on CAN flavors:
diff --git a/users/protocols/canopen.html b/users/protocols/genericcan.html
similarity index 73%
copy from users/protocols/canopen.html
copy to users/protocols/genericcan.html
index 6da7412..3f3d855 100644
--- a/users/protocols/canopen.html
+++ b/users/protocols/genericcan.html
@@ -125,7 +125,7 @@
                             <a href="../../users/protocols/bacnetip.html" 
class="nav-link">BACnet/IP</a>
                             </li>
                                             <li class="nav-item">
-                            <strong class="nav-link">CANopen</strong>
+                            <a href="../../users/protocols/canopen.html" 
class="nav-link">CANopen</a>
                             </li>
                                             <li class="nav-item">
                             <a href="../../users/protocols/deltav.html" 
class="nav-link">DeltaV</a>
@@ -287,12 +287,16 @@
         </nav>
                                             <main role="main" 
class="ml-sm-auto px-4 col-sm-pull col-md-9 col-lg-10 h-100">
             <div class="sect1">
-<h2 id="canopen">CANopen</h2>
+<h2 id="generic_can">Generic CAN</h2>
 <div class="sectionbody">
 <div class="sect2">
-<h3 id="can_in_automation">CAN in Automation</h3>
+<h3 id="can_bus_semantics">CAN Bus semantics</h3>
 <div class="paragraph">
-<p>CANopen is a specific protocol built on top of CAN bus.</p>
+<p>This driver is a generic purpose driver.
+It allows implementing a basic CAN bus listening or writing scenarios.</p>
+</div>
+<div class="paragraph">
+<p>CAN bus open is a specific protocol built on top of CAN bus.</p>
 </div>
 <table class="tableblock frame-all grid-all stretch">
 <colgroup>
@@ -311,13 +315,13 @@
 <tr>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">Code</p></td>
 <td class="tableblock halign-left valign-top" colspan="2"><div 
class="content"><div class="paragraph">
-<p><code>canopen</code></p>
+<p><code>genericcan</code></p>
 </div></div></td>
 </tr>
 <tr>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">Name</p></td>
 <td class="tableblock halign-left valign-top" colspan="2"><div 
class="content"><div class="paragraph">
-<p>CANopen (based on CAN 2.0A) - client side</p>
+<p>Generic CAN</p>
 </div></div></td>
 </tr>
 <tr>
@@ -326,7 +330,7 @@
 <div class="content">
 <pre>&lt;dependency&gt;
   &lt;groupId&gt;org.apache.plc4x&lt;/groupId&gt;
-  &lt;artifactId&gt;plc4j-driver-canopen&lt;/artifactId&gt;
+  &lt;artifactId&gt;plc4j-driver-can&lt;/artifactId&gt;
   &lt;version&gt;{current-last-released-version}&lt;/version&gt;
 &lt;/dependency&gt;</pre>
 </div>
@@ -340,80 +344,36 @@
 </tr>
 <tr>
 <td class="tableblock halign-left valign-top"><p class="tableblock">Compatible 
Transports:</p></td>
-<td class="tableblock halign-left valign-top" colspan="2"><div 
class="content"><div class="ulist">
-<ul>
-<li>
-<p><code>socketcan</code></p>
-</li>
-</ul>
+<td class="tableblock halign-left valign-top" colspan="2"><div 
class="content"><div class="paragraph">
+<p>Any <code>can</code> transport, see <a href="../transports/can.html">CAN 
transport</a></p>
 </div></div></td>
 </tr>
 <tr>
 <td class="tableblock halign-left valign-top" colspan="3"><p 
class="tableblock">Supported Operations</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">CANopen 
PDO</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p><code>read</code> / <code>write</code></p>
-</div></div></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p>PDO messages are broadcasted to the bus and have to be mapped at 
application layer.</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">CANopen 
SDO</p></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">publish</p></td>
 <td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p><code>read</code> / <code>write</code></p>
+<p><code>write</code></p>
 </div></div></td>
 <td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p>SDO are request/response conversations. Both read and write path is 
supported.</p>
+<p>Allows to publish a CAN frame via CAN transport.</p>
 </div></div></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">receive</p></td>
 <td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
 <p><code>subscribe</code></p>
 </div></div></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="ulist">
-<ul>
-<li>
-<p>Receiving PDO messages requires construction of valid subscription.</p>
-</li>
-<li>
-<p>It is possible to subscribe to CANopen NMT messages.</p>
-</li>
-</ul>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top" colspan="3"><p 
class="tableblock">Options</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p><code>heartbeat</code></p>
-</div></div></td>
 <td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p>Forces PLC4X to send CANopen heartbeat (NMT) messages to the bus.</p>
+<p>This operation allows listening for incoming data or requests.</p>
 </div></div></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p><code>nodeId</code></p>
-</div></div></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p>CAN node identifier. Depending on used CAN version it might be 11 or 29 bit 
unsigned int.</p>
-</div></div></td>
+<td class="tableblock halign-left valign-top" colspan="3"><p 
class="tableblock">Options</p></td>
 </tr>
 <tr>
-<td class="tableblock halign-left valign-top"></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p><code>request-timeout</code></p>
-</div></div></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p>Time after which dispatched BUS operation (ie. SDO request) will be marked 
as failed.</p>
-</div></div></td>
+<td class="tableblock halign-center valign-top" colspan="3"><p 
class="tableblock">none</p></td>
 </tr>
 </tbody>
 </table>
@@ -421,59 +381,16 @@
 <div class="sect2">
 <h3 id="more_details_on_the_driver">More details on the driver</h3>
 <div class="paragraph">
-<p>CAN, despite (or due) to its popularity has ambiguous meaning.
-There are multiple articles and sources which attempts to give introduction, 
yet very few of them is consistent between each other.</p>
+<p>Given popularity of CAN in multiple market segments there is variety of 
protocols which can&#8217;t be published.
+Also, for many cases which are data acquisition oriented it is necessary to 
tap only parts of communications.</p>
 </div>
 <div class="paragraph">
-<p>There are two dominant formats of frames - CAN 2.0A and 2.0B:</p>
-</div>
-<div class="ulist">
-<ul>
-<li>
-<p>CAN 2.0A uses 11 bit identifier and up to 8 bytes of data.</p>
-</li>
-<li>
-<p>CAN 2.0B uses 29 bit identifier and up to 64 bytes of data.</p>
-</li>
-</ul>
-</div>
-<div class="paragraph">
-<p>To make things worse with introduction of CAN FD amount of combinations 
increased even more.
-Double check frame format as this integration supports CANopen and does not 
support CANopen FD.</p>
-</div>
-<div class="paragraph">
-<p>Further reading on CAN flavors:
-<a 
href="https://en.wikipedia.org/wiki/CAN_bus";>https://en.wikipedia.org/wiki/CAN_bus</a></p>
-</div>
-<div class="paragraph">
-<p>Default transport used with this protocol is socketcan.
-Currently, only 2.0A format (up to 8 bytes of data) is supported.</p>
-</div>
-<div class="paragraph">
-<p>Implemented driver supports currently socketcan transport.
-Change of transport requires code modifications and injection of new 
"transport" type which will encode CANopen payloads to specific frame 
format.</p>
-</div>
-<div class="paragraph">
-<p>Socketcan seems to be most widespread way to access CAN bus.
-It also masks different hardware variants which might come with their own 
drivers.</p>
-</div>
-<div class="paragraph">
-<p>The CANopen specification defines Object Dictionary (OD).
-This driver does honor OD structure through usage of index and sub index for 
addressing fields.
-It does not ship Electronic Data Sheet (EDS) parser leaving it for 
applications who wish to utilize it.</p>
-</div>
-</div>
-<div class="sect2">
-<h3 id="address_format">Address Format</h3>
-<div class="paragraph">
-<p>CANopen specification defines several groups of addresses dedicated to 
certain kind of operations.
-Critical services and message exchanges related with them have lower 
identifiers making them wining eventual bus access.</p>
-</div>
-<div class="paragraph">
-<p>The array size block is necessary only if application expect same value 
several times.
-If SDO returns for example 4 values of UNSIGNED8 it can be declared as 
<code>&lt;service&gt;:&lt;nodeId&gt;:UNSIGNED8[4]</code> for PDO.
-Equivalent for SDO is 
<code>&lt;service&gt;:&lt;nodeId&gt;:&lt;index&gt;/&lt;subindex&gt;:UNSIGNED8[4]</code>.</p>
+<p>This driver allows to model incoming and outgoing communication using plain 
Apache PLC4X api.
+The written CAN data is constructed from fields submitted via write request 
builder.
+The receiving data is transformed in similar fashion, based on subscribed 
fields.</p>
 </div>
+<div class="sect3">
+<h4 id="address_format">Address format</h4>
 <table class="tableblock frame-all grid-all stretch">
 <colgroup>
 <col style="width: 20%;"/>
@@ -491,138 +408,37 @@ Equivalent for SDO is 
<code>&lt;service&gt;:&lt;nodeId&gt;:&lt;index&gt;/&lt;sub
 </thead>
 <tbody>
 <tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">SDO</p></td>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">n/a</p></td>
 <td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p>SDO:nodeId:index/subindex:type[arraySize]</p>
+<p>nodeId:type[arraySize]</p>
 </div></div></td>
 <td class="tableblock halign-left valign-top"><div class="content"><div 
class="ulist">
 <ul>
 <li>
-<p><code>read</code></p>
-</li>
-<li>
 <p><code>write</code></p>
 </li>
-</ul>
-</div></div></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p>SDO is for request/response communication.
-Both expedited and segmented modes are supported.
-No support for block transfer.</p>
-</div>
-<div class="paragraph">
-<p>Transfer kind is automatically determined based on payload length.
-All numeric values - ndodeId, index, subindex can be specified using 
hexadecimal notation (ie. <code>0xA</code>).</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">PDO</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="ulist">
-<ul>
-<li>
-<p>TRANSMIT_PDO_1:nodeId:type[arraySize]</p>
-</li>
-<li>
-<p>RECEIVE_PDO_1:nodeId:type[arraySize]</p>
-</li>
-<li>
-<p>TRANSMIT_PDO_2:nodeId:type[arraySize]</p>
-</li>
-<li>
-<p>RECEIVE_PDO_2:nodeId:type[arraySize]</p>
-</li>
-<li>
-<p>TRANSMIT_PDO_3:nodeId:type[arraySize]</p>
-</li>
-<li>
-<p>RECEIVE_PDO_3:nodeId:type[arraySize]</p>
-</li>
-<li>
-<p>TRANSMIT_PDO_4:nodeId:type[arraySize]</p>
-</li>
-<li>
-<p>RECEIVE_PDO_4:nodeId:type[arraySize]</p>
-</li>
-</ul>
-</div></div></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="ulist">
-<ul>
 <li>
 <p><code>subscribe</code></p>
 </li>
-<li>
-<p><code>write</code></p>
-</li>
 </ul>
 </div></div></td>
 <td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p>PDO is an asynchronous operation hence receiving of it requires 
subscription.
-Check Apache PLC4X API documentation for more detailed example of how to use 
subscriptions API.
-Subscriber will be notified with value mapped to type defined in field 
syntax.</p>
+<p>There is only one syntax which is currently supported by this driver.</p>
 </div></div></td>
 </tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">NMT</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="ulist">
-<ul>
-<li>
-<p>NMT</p>
-</li>
-<li>
-<p>NMT:nodeId</p>
-</li>
-</ul>
-</div></div></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="ulist">
-<ul>
-<li>
-<p><code>subscribe</code></p>
-</li>
-</ul>
-</div></div></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p>NMT messages are sent using CAN node ID <code>0</code>.
-They have the highest priority on the bus.
-Messages of this kind indicate operating state of an node (booted, 
operational).</p>
-</div>
+</tbody>
+</table>
 <div class="paragraph">
-<p>Subscriptions to this service receive structure with two fields: 
<code>node</code> (USINT) and <code>state</code> (USINT).
-If subscription sets <code>nodeId</code> to 0 it will receive state updates 
for all bus participants.</p>
-</div></div></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">HEARTBEAT</p></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="ulist">
-<ul>
-<li>
-<p>HEARTBEAT</p>
-</li>
-<li>
-<p>HEARTBEAT:nodeId</p>
-</li>
-</ul>
-</div></div></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="ulist">
-<ul>
-<li>
-<p><code>subscribe</code></p>
-</li>
-</ul>
-</div></div></td>
-<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
-<p>HEARTBEAT messages have the lowest priority on the bus.
-They have the highest priority on the bus.
-Messages of this kind indicate operating state of an node (booted, 
operational).</p>
+<p>Pay attention.
+You can use multiple fields to write and subscribe actual data.
+All fields must sum to up to 64 bits.
+If you subscribe less, then remaining data is discarded and not available via 
PLC4X api.</p>
 </div>
 <div class="paragraph">
-<p>Subscriptions to this service receive structure with two fields: 
<code>node</code> (USINT) and <code>state</code> (USINT).
-If subscription sets <code>nodeId</code> to 0 it will receive state updates 
for all bus participants.</p>
-</div></div></td>
-</tr>
-</tbody>
-</table>
+<p>The data will be sent in the same order as fields.</p>
+</div>
 <div class="paragraph">
-<p>Below table contains type mapping defined in CANopen specification.</p>
+<p>Below table contains type mapping defined in Generic CAN driver.</p>
 </div>
 <table class="tableblock frame-all grid-all stretch">
 <colgroup>
@@ -731,45 +547,12 @@ If subscription sets <code>nodeId</code> to 0 it will 
receive state updates for
 <td class="tableblock halign-left valign-top"><p class="tableblock">64</p></td>
 <td class="tableblock halign-left valign-top"><p 
class="tableblock">LREAL</p></td>
 </tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">RECORD</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">8 * 
size</p></td>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">BYTE</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">OCTET_STRING</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">8 * 
size</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">STRING 
(UTF-8)</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">VISIBLE_STRING</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">8 * 
size</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">STRING 
(UTF-8)</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">TIME_OF_DAY</p></td>
-<td class="tableblock halign-center valign-top" colspan="2"><p 
class="tableblock">unsupported</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">TIME_DIFFERENCE</p></td>
-<td class="tableblock halign-center valign-top" colspan="2"><p 
class="tableblock">unsupported</p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p 
class="tableblock">UNICODE_STRING</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">8 * 
size</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">STRING 
(UTF-8)</p></td>
-</tr>
 </tbody>
 </table>
 <div class="paragraph">
-<p>All string types are decoded using UTF-8 encoding regardless of their kind 
(octet, visible, unicode).
-In case if device returns text using different encoding it is recommended to 
use <code>RECORD</code> type and construct text manually above PLC4X.</p>
+<p>The type table is similar to CANopen.
+Main difference is lack of support for string types.</p>
 </div>
-<div class="paragraph">
-<p>The size in case of variable length structures is automatically assumed to 
full length of SDO answer.
-In case of writing length of field can be ommited.
-For example request <code>write(SDO:1:2/3:RECORD, payload)</code> will try to 
write whole payload to specified address.
-Same applies to responses sent by devies as requester often might not know 
full length of reply payload.</p>
 </div>
 </div>
 </div>
diff --git a/users/transports/index.html b/users/transports/can.html
similarity index 83%
copy from users/transports/index.html
copy to users/transports/can.html
index b4ac505..5dfaf27 100644
--- a/users/transports/index.html
+++ b/users/transports/can.html
@@ -159,7 +159,7 @@
                                 
                                                                     
                                                                 <li 
class="nav-item">
-                            <strong class="nav-link">Transports</strong>
+                            <a href="../../users/transports/index.html" 
class="nav-link">Transports</a>
                                     <ul class="flex-column pl-4 nav">
                                             <li class="nav-item">
                             <a href="../../users/transports/tcp.html" 
class="nav-link">TCP</a>
@@ -287,28 +287,102 @@
         </nav>
                                             <main role="main" 
class="ml-sm-auto px-4 col-sm-pull col-md-9 col-lg-10 h-100">
             <div class="sect1">
-<h2 id="transports">Transports</h2>
+<h2 id="can">CAN</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>A CAN transport is a special category of transport which can bring CAN 
frame data to various drivers.
+All of these transports are meant to follow basic CAN frame data semantics.</p>
+</div>
+<div class="paragraph">
+<p>Each CAN transport must provide a <code>CANFrameBuilder</code> interface 
realization.
+This builder can be used by drivers which implement application layer 
protocols on top of CAN bus.
+The builder allow constructing requests which should be passed to the bus 
operations.</p>
+</div>
+<div class="paragraph">
+<p>Note this API is available since Apache PLC4X 0.9.</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 22.2222%;"/>
+<col style="width: 22.2222%;"/>
+<col style="width: 55.5556%;"/>
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Name</th>
+<th class="tableblock halign-left valign-top">Value</th>
+<th class="tableblock halign-left valign-top">Description</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">Code</p></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
+<p>not available</p>
+</div></div></td>
+<td class="tableblock halign-left valign-top"><div class="content"><div 
class="paragraph">
+<p>This transport ships only additional API on top of existing Apache PLC4X 
Transport API.</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">Name</p></td>
+<td class="tableblock halign-left valign-top" colspan="2"><div 
class="content"><div class="paragraph">
+<p>CAN</p>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Maven 
Dependency</p></td>
+<td class="tableblock halign-left valign-top" colspan="2"><div 
class="content"><div class="listingblock">
+<div class="content">
+<pre>&lt;dependency&gt;
+  &lt;groupId&gt;org.apache.plc4x&lt;/groupId&gt;
+  &lt;artifactId&gt;plc4j-transport-can&lt;/artifactId&gt;
+  &lt;version&gt;{current-last-released-version}&lt;/version&gt;
+&lt;/dependency&gt;</pre>
+</div>
+</div></div></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p 
class="tableblock">Options:</p></td>
+<td class="tableblock halign-left valign-top" colspan="2"><div 
class="content"><div class="paragraph">
+<p><strong>none</strong>, an abstract transport</p>
+</div></div></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Main purpose of this transport is basic unification of various CAN bus APIs.
+There is no unified way to access CAN (beside SocketCAN for linux) across 
multiple platforms.
+We brought this simplistic facade-alike API to serve very basic project needs.
+Its main purpose is to let transport implementer bridge with actual transport 
or another library.
+With as little effort as possible.</p>
+</div>
+<div class="paragraph">
+<p>Major advantage of CAN transport facade is possibility to implement 
application layer protocols in a fully portable way.
+This flexibility is not guaranteed with SocketCAN alone.</p>
+</div>
+<div class="paragraph">
+<p>The CAN transport responsibility is to bring CAN data to driver implementer.
+This API does not enforce, require or promote a low level bus operations.
+In this regard, these operations can be made by library available for specific 
CAN adapter in use.</p>
+</div>
+<div class="sect2">
+<h3 id="developer_notes">Developer notes</h3>
+<div class="paragraph">
+<p>Usage of CAN transport APIs is recommended for portability reasons.
+Please have a look on <a href="../protocols/can.html">CAN</a> describe usage 
of CAN driver adapter with CAN transport facade.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="compatible_can_transports">Compatible CAN transports</h2>
 <div class="sectionbody">
 <div class="ulist">
 <ul>
 <li>
-<p><a href="tcp.html">TCP</a></p>
-</li>
-<li>
-<p><a href="udp.html">UDP</a></p>
-</li>
-<li>
-<p><a href="raw-socket.html">Raw Socket</a></p>
-</li>
-<li>
-<p><a href="serial.html">Serial Port</a></p>
-</li>
-<li>
 <p><a href="socketcan.html">SocketCAN</a></p>
 </li>
-<li>
-<p><a href="pcap-replay.html">PCAP replay</a></p>
-</li>
 </ul>
 </div>
 </div>
diff --git a/users/transports/index.html b/users/transports/index.html
index b4ac505..2f45996 100644
--- a/users/transports/index.html
+++ b/users/transports/index.html
@@ -304,6 +304,9 @@
 <p><a href="serial.html">Serial Port</a></p>
 </li>
 <li>
+<p><a href="can.html">CAN bus</a></p>
+</li>
+<li>
 <p><a href="socketcan.html">SocketCAN</a></p>
 </li>
 <li>

Reply via email to