# CAN Driver

`jumpstarter-driver-can` provides functionality for interacting with CAN bus
connections based on the [python-can](https://python-can.readthedocs.io/en/stable/index.html)
library.

## Installation

```{code-block} console
:substitutions:
$ pip3 install --extra-index-url {{index_url}} jumpstarter-driver-can
```

## Configuration

### Can

A generic CAN bus driver.

Available on any platform, supports many different CAN interfaces through the `python-can` library.

Example configuration:

```yaml
export:
  can:
    type: jumpstarter_driver_can.Can
    config:
      channel: 1
      interface: "virtual"
```

| Parameter     | Description | Type | Required | Default |
| --------------| ----------- | ---- | -------- | ------- |
| interface     | Refer to the [python-can](https://python-can.readthedocs.io/en/stable/interfaces.html) list of interfaces | str  | yes      |         |
| channel       | channel to be used, refer to the interface documentation | int or str | yes |     |

### IsoTpPython

A Pure python ISO-TP socket driver

Available on any platform (does not require Linux ISO-TP kernel module), moderate
performance and reliability, wide support for non-standard hardware interfaces

Example configuration:

```yaml
export:
  can:
    type: jumpstarter_driver_can.IsoTpPython
    config:
      channel: 0
      interface: "virtual"
      address:
        rxid: 1
        txid: 2
      params:
        max_frame_size: 2048
        blocking_send: false
        can_fd: true

```

| Parameter     | Description | Type | Required | Default |
| --------------| ----------- | ---- | -------- | ------- |
| interface     | Refer to the [python-can](https://python-can.readthedocs.io/en/stable/interfaces.html) list of interfaces | `str` | no |  |
| channel       | channel to be used, refer to the interface documentation | `int` or `str` | no |  |
| address       | Refer to the [isotp.Address](https://can-isotp.readthedocs.io/en/latest/isotp/addressing.html#isotp.Address) documentation | `isotp.Address` | yes |  |
| params        | IsoTp parameters, refer to the [IsoTpParams](#isotpparams) section table | `IsoTpParams` | no | see table |
| read_timeout  | Read timeout for the bus in seconds | `float` | no | 0.05 |

### IsoTpSocket

Linux kernel ISO-TP socket driver

Available on any platform, moderate performance and reliability, wide support for non-standard hardware interfaces

Example configuration:

```yaml
export:
  can:
    type: jumpstarter_driver_can.IsoTpSocket
    config:
      channel: "vcan0"
      address:
        rxid: 1
        txid: 2
      params:
        max_frame_size: 2048
        blocking_send: false
        can_fd: true

```

| Parameter     | Description | Type | Required | Default |
| --------------| ----------- | ---- | -------- | ------- |
| channel       | CAN bus to be used i.e. `vcan0`, `vcan1`, etc.. |  `str` | yes |  |
| address       | Refer to the [isotp.Address](https://can-isotp.readthedocs.io/en/latest/isotp/addressing.html#isotp.Address) documentation | isotp.Address | yes | |
| params        | IsoTp parameters, refer to the [IsoTpParams](#isotpparams) section table | `IsoTpParams` | no | see table |

### IsoTpParams
| Parameter                   | Description                                                                                           | Type             | Required | Default    |
|-----------------------------|-------------------------------------------------------------------------------------------------------|------------------|----------|------------|
| `stmin`                     | Minimum Separation Time minimum in milliseconds between consecutive frames.                           | `int`            | No       | `0`        |
| `blocksize`                 | Number of consecutive frames that can be sent before waiting for a flow control frame.                | `int`            | No       | `8`        |
| `tx_data_length`            | Default length of data in a transmitted CAN frame (CAN 2.0) or initial frame (CAN FD).                | `int`            | No       | `8`        |
| `tx_data_min_length`        | Minimum length of data in a transmitted CAN frame; pads with `tx_padding` if shorter.                 | `int` \| `None`  | No       | `None`     |
| `override_receiver_stmin`   | Override the STmin value (in seconds) received from the receiver; `None` means do not override.       | `float` \| `None`| No       | `None`     |
| `rx_flowcontrol_timeout`    | Timeout in milliseconds for receiving a flow control frame after sending a first frame or a block.    | `int`            | No       | `1000`     |
| `rx_consecutive_frame_timeout`| Timeout in milliseconds for receiving a consecutive frame in a multi-frame message.                 | `int`            | No       | `1000`     |
| `tx_padding`                | Byte value used for padding if the data length is less than `tx_data_min_length` or for CAN FD.       | `int` \| `None`  | No       | `None`     |
| `wftmax`                    | Maximum number of Wait Frame Transmissions (WFTMax) allowed before aborting. `0` means WFTs are not used.| `int`         | No       | `0`        |
| `max_frame_size`            | Maximum size of a single ISO-TP frame that can be processed.                                          | `int`            | No       | `4095`     |
| `can_fd`                    | If `True`, enables CAN FD (Flexible Data-Rate) specific ISO-TP handling.                              | `bool`           | No       | `False`    |
| `bitrate_switch`            | If `True` and `can_fd` is `True`, enables bitrate switching for CAN FD frames.                        | `bool`           | No       | `False`    |
| `default_target_address_type` | Default target address type: `0` for Physical (1-to-1), `1` for Functional (1-to-n).                | `int`            | No       | `0`        |
| `rate_limit_enable`         | If `True`, enables rate limiting for outgoing frames.                                                 | `bool`           | No       | `False`    |
| `rate_limit_max_bitrate`    | Maximum bitrate in bits per second for rate limiting if enabled.                                      | `int`            | No       | `10000000` |
| `rate_limit_window_size`    | Time window in seconds over which the rate limit is calculated.                                       | `float`          | No       | `0.2`      |
| `listen_mode`               | If `True`, the stack operates in listen-only mode (does not send any frames).                         | `bool`           | No       | `False`    |
| `blocking_send`             | If `True`, send operations will block until the message is fully transmitted or an error occurs.      | `bool`           | No       | `False`    |

## API Reference

```{eval-rst}
.. autoclass:: jumpstarter_driver_can.driver.Can()
    :members:

.. autoclass:: jumpstarter_driver_can.client.CanClient()
    :members:

.. autoclass:: jumpstarter_driver_can.driver.IsoTpPython()
    :members:

.. autoclass:: jumpstarter_driver_can.driver.IsoTpSocket()
    :members:

.. autoclass:: jumpstarter_driver_can.client.IsoTpClient()
    :members:
```
