# `Nanodrop.USB`

Behaviour for USB operations.

This module defines callbacks for USB communication and provides a default
implementation using the `usb` library. In tests, this can be replaced with
a mock using Mox.

# `device`

```elixir
@type device() :: reference()
```

# `device_descriptor`

```elixir
@type device_descriptor() :: %{
  vendor_id: non_neg_integer(),
  product_id: non_neg_integer()
}
```

# `device_handle`

```elixir
@type device_handle() :: reference()
```

# `claim_interface`

```elixir
@callback claim_interface(device_handle(), non_neg_integer()) :: :ok | {:error, term()}
```

# `close_device`

```elixir
@callback close_device(device_handle()) :: :ok | {:error, term()}
```

# `get_bus_number`

```elixir
@callback get_bus_number(device()) :: {:ok, non_neg_integer()} | {:error, term()}
```

# `get_device_address`

```elixir
@callback get_device_address(device()) :: {:ok, non_neg_integer()} | {:error, term()}
```

# `get_device_descriptor`

```elixir
@callback get_device_descriptor(device()) :: {:ok, device_descriptor()} | {:error, term()}
```

# `get_device_list`

```elixir
@callback get_device_list() :: {:ok, [device()]} | {:error, term()}
```

# `open_device`

```elixir
@callback open_device(device()) :: {:ok, device_handle()} | {:error, term()}
```

# `read_bulk`

```elixir
@callback read_bulk(device_handle(), byte(), non_neg_integer(), timeout()) ::
  {:ok, binary()} | {:error, term()}
```

# `write_bulk`

```elixir
@callback write_bulk(device_handle(), byte(), binary(), timeout()) ::
  {:ok, non_neg_integer()} | {:error, term()}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
