# Cantastic
Cantastic is an Elixir library to interact with CAN/Bus via lib_socket_can (Linux only).
It does all the heavy lifting of parsing the incoming frames and sending the outgoing ones at the right frequencies.
/!\ This library is still at a very early development stage. Do NOT use it in production projects yet.
## Installation
in the `mix.exs` file:
```elixir
def deps do
[{:cantastic, "~> 0.1.0"}]
end
```
## OTP App Configuration
### Example
```elixir
config :cantastic,
can_networks: "ovcs:can0,leaf_drive:can1,polo_drive:can2",
setup_can_interfaces: true,
otp_app: :vms_core,
priv_can_config_path: "polo_2007.yml",
enable_socketcand: true,
socketcand_ip_interface: "wlan0"
```
## Description
Cantastic is supports the following configuration options:
| Key | Description | Default value |
|-----|-------------|---------------|
| `:can_networks` | A comma separated list of can network names and related interfaces. | N/A
| `:setup_can_interfaces`| Wheher Cantastic should setup the CAN interfaces. It requires the Elixir user to have the approriate rights (usually the case for Nerves hosts). | `false` |
| `:otp_app` | The name of the OTP app owning the priv directory where the can config file is stored | N/A
| `:priv_can_config_path` | The relative path where the Yaml config file is located | N/A
| `:enable_socketcand` | Wheter Cantastic should start the socketcand server on all configured interfaces. This allows to remotely access the CAN interfaces for debugging.| `false` |
| `:socketcand_ip_interface` | The IP interface on which socketcand should listen to. | `"eth0"` |
## CAN configuration file
Cantastic requires you to define a YAML describing the frames to be sent and received and how to structure them.
This allows you to declaratively define your CAN networks in a clear and maintainable format.
### Example
```yaml
---
can_networks:
ovcs:
bitrate: 500000
emitted_frames:
- name: contactors_status_request
id: 0x100
frequency: 20
signals:
- name: main_negative_contactor_enabled
kind: enum
value_start: 0
value_length: 8
mapping:
0x00: false
0x01: true
- name: main_positive_contactor_enabled
kind: enum
value_start: 8
value_length: 8
mapping:
0x00: false
0x01: true
received_frames:
- name: car_controls_status
id: 0x200
frequency: 10
signals:
- name: raw_max_throttle
kind: integer
value_start: 0
value_length: 16
- name: raw_throttle
kind: integer
value_start: 16
value_length: 16
- name: requested_gear
kind: enum
value_start: 48
value_length: 8
mapping:
0x00: drive
0x01: neutral
0x02: reverse
0x03: parking
```
## Description
TODO