README.md

# 🦘 cangaroo

[![Package Version](https://img.shields.io/hexpm/v/cangaroo)](https://hex.pm/packages/cangaroo)
[![Hex Docs](https://img.shields.io/badge/hex-docs-ffaff3)](https://hexdocs.pm/cangaroo/)

cangaroo provides Gleam bindings to the [Excansock](https://github.com/pavels/excansock) Elixir library, enabling Gleam applications to communicate with SocketCAN devices on Linux.

```sh
gleam add cangaroo@1
```

### Start GenServer and open socket

```gleam
import cangaroo
import gleam/io

pub fn main() {
  let assert Ok(client) = cangaroo.start_link("can0")

  io.println("Connected!")
}
```

### Sending frames

```gleam
import cangaroo
import cangaroo/types.{CanFrame}

pub fn main() {
  let assert Ok(client) = cangaroo.start_link("can0")

  let frame = CanFrame(id: 0x123, data: <<0x01, 0x02, 0x03, 0x04>>)

  let assert Ok(Nil) = cangaroo.send(client, frame)
}
```

### Receiving frames

```gleam
import cangaroo
import cangaroo/types
import gleam/erlang/process

pub fn main() {
  let assert Ok(client) = cangaroo.start_link("can0")

  let messages = types.messages(client)

  let selector =
    process.new_selector()
    |> process.select(for: messages)

  let frame = process.selector_receive_forever(from: selector)
  // do something with the frame
}
```

## Running tests

Run as root to setup the virtual can interface.

```sh
sudo gleam test
```