# OpenLCP support for Art-Net

The Art-Net 4 Release 1.4dd2 (1/2/2021) describes three members of an Art-Net network:
-   **Controller** : A lighting console.
-   **Node** : A DMX to / from Art-Net device.
-   **Media Server** : A Media Server.

The ArtPollReply Styles (Table 4) enumerates those, plus an additional 4 device types:
- **Route** : A network routing device.
- **Backup** : A backup device.
- **Config** : A configuration or diagnostic tool
- **Visual** : A visualizer

The behaviors of Route, Backup, Config, and Visual devices is not specified.  The behaviors of Controller, Node, and Media Server are defined, and summarized in a table below.

In OpenLCP, the base class for all Art-Net devices is the ARTNET::Device class.  ARTNET::Controller and ARTNET::Node inherit from ARTNET::Device virtually, allowing custom implementations that may need to inherit from ARTNET::Controller _and_ ARTNET::Node to do so with a common base ARTNET::Device.

- ARTNET::Device carries the implementation for:
  - Rx
    - ArtPoll
    - ArtTimeCode
    - ArtCommand
    - ArtTrigger
    - ArtDmx
    - ArtNzs
    - ArtVlc
    - ArtRdm
    - ArtRdmSub
  - Tx
    - ArtPollReply
    - ArtDiagData
    - ArtTimeCode
    - ArtCommand
    - ArtTrigger
    - ArtDmx (Peer to Peer)
    - ArtNzs
    - ArtVlc
    - ArtRdm
    - ArtRdmSub


- ARTNET::Controller extends ARTNET::Device with:
  - Rx
    - ArtPollReply
    - ArtIpProgReply
    - ArtDiagData
    - ArtFirmwareReply
    - ArtTodData
  - Tx
    - ArtPoll
    - ArtIpProg
    - ArtAddress
    - ArtDmx (Controller to Peer)
    - ArtSync
    - ArtInput
    - ArtFirmwareMaster
    - ArtTodRequest
    - ArtTodControl


- ARTNET::Node extends ARTNET::Device with:
  - Rx
    - ArtIpProg
    - ArtAddress
    - ArtSync
    - ArtInput
    - ArtFirmwareMaster
    - ArtTodRequest
    - ArtTodControl
  - Tx
    - ArtIpProgReply
    - ArtFirmwareReply
    - ArtTodData


## Art-Net Table of Behaviors
<table>
<tr>
    <th rowspan=3>OpCode</th>
    <th colspan=3>Controller</th>
    <th colspan=3>Node</th>
    <th colspan=3>Media Server</th>
</tr>
<tr>
    <th rowspan=2>RX Behavior</th><th colspan=2>TX</th>
    <th rowspan=2>RX Behavior</th><th colspan=2>TX</th>
    <th rowspan=2>RX Behavior</th><th colspan=2>TX</th>
</tr>
<tr>
    <th>uni</th><th>brd</th>
    <th>uni</th><th>brd</th>
    <th>uni</th><th>brd</th>
</tr>
<tr>
    <td>ArtPoll</td>
    <td>ArtPollReply</td><td></td><td>TX</td>
    <td>ArtPollReply</td><td></td><td></td>
    <td>ArtPollReply</td><td></td><td></td>
</tr>
<tr>
    <td>ArtPollReply</td>
    <td></td><td></td><td>TX</td>
    <td></td><td></td><td>TX</td>
    <td></td><td></td><td>TX</td>
</tr>
<tr>
    <td>ArtIpProg</td>
    <td></td><td>TX</td><td></td>
    <td>ArtIpProgReply</td><td></td><td></td>
    <td>ArtIpProgReply</td><td></td><td></td>
</tr>
<tr>
    <td>ArtIpProgReply</td>
    <td></td><td></td><td></td>
    <td></td><td>TX</td><td></td>
    <td></td><td>TX</td><td></td>
</tr>
<tr>
    <td>ArtAddress</td>
    <td></td><td>TX</td><td></td>
    <td>ArtPollReply</td><td></td><td></td>
    <td>ArtPollReply</td><td></td><td></td>
</tr>
<tr>
    <td>ArtDiagData</td>
    <td></td><td colspan=2>per ArtPoll</td>
    <td></td><td colspan=2>per ArtPoll</td>
    <td></td><td colspan=2>per ArtPoll</td>
</tr>
<tr>
    <td>ArtTimeCode</td>
    <td colspan=9>Application Specific</td>
</tr>
<tr>
    <td>ArtCommand</td>
    <td colspan=9>Application Specific</td>
</tr>
<tr>
    <td>ArtTrigger</td>
    <td colspan=9>Application Specific</td>
</tr>
<tr>
    <td>ArtDmx</td>
    <td>Application Specific</td><td>TX</td><td></td>
    <td>Application Specific</td><td>TX</td><td></td>
    <td>Application Specific</td><td>TX</td><td></td>
</tr>
<tr>
    <td>ArtSync</td>
    <td></td><td></td><td>TX</td>
    <td>Sync</td><td></td><td></td>
    <td>Sync</td><td></td><td></td>
</tr>
<tr>
    <td>ArtNzs</td>
    <td>Application Specific</td><td>TX</td><td></td>
    <td>Application Specific</td><td>TX</td><td></td>
    <td>Application Specific</td><td>TX</td><td></td>
</tr>
<tr>
    <td>ArtVlc</td>
    <td colspan=9>As ArtNzs</td>
</tr>
<tr>
    <td>ArtInput</td>
    <td></td><td>TX</td><td></td>
    <td>ArtPollReply</td><td></td><td></td>
    <td>ArtPollReply</td><td></td><td></td>
</tr>
<tr>
    <td>ArtFirmwareMaster</td>
    <td></td><td>TX</td><td></td>
    <td>OpFirmwareReply</td><td></td><td></td>
    <td>OpFirmwareReply</td><td></td><td></td>
</tr>
<tr>
    <td>ArtFirmwareReply</td>
    <td>Next OpFirmwareMaster</td><td></td><td></td>
    <td></td><td>TX</td><td></td>
    <td></td><td>TX</td><td></td>
</tr>
<tr>
    <td>ArtTodRequest</td>
    <td></td><td></td><td>TX</td>
    <td>ArtTodData</td><td></td><td></td>
    <td></td><td></td><td></td>
</tr>
<tr>
    <td>ArtTodData</td>
    <td></td><td></td><td></td>
    <td></td><td></td><td></td>
    <td></td><td></td><td></td>
</tr>
<tr>
    <td>ArtTodControl</td>
    <td></td><td></td><td>TX</td>
    <td>ArtTodData</td><td></td><td></td>
    <td></td><td></td><td></td>
</tr>
<tr>
    <td>ArtRdm</td>
    <td></td><td>TX</td><td>tx</td>
    <td></td><td>TX</td><td>tx</td>
    <td></td><td>TX</td><td>tx</td>
</tr>
<tr>
    <td>ArtRdmSub</td>
    <td></td><td>TX</td><td></td>
    <td></td><td>TX</td><td></td>
    <td></td><td></td><td></td>
</tr>
</table>

Art-Net™ is a trade mark of Artistic Licence Holdings Ltd. The Art-Net protocol and associated documentation is copyright Artistic Licence Holdings Ltd.
