# `IEC60870.CS101.Slave`
[🔗](https://github.com/Ultraluv/ex_iec60870/blob/main/lib/iec60870/cs101/slave.ex#L1)

IEC 60870-5-101 Slave (`cs101_slave.c`), supporting both `:unbalanced` and `:balanced` link layer modes.

Features:
- Separate Class 1 (high-priority / command confirmations / events) and Class 2 (periodic / background) FIFO queues
- Compatible with `IEC60870.CS104.MasterConnection` helpers (`send_asdu/2`, `send_act_con/3`, `send_act_term/2`) so application handlers can be shared between 101 and 104 Slaves
- Standard application callbacks (`interrogation_handler`, `counter_interrogation_handler`, `read_handler`, `clock_sync_handler`, `reset_process_handler`, `delay_acquisition_handler`, `reset_cu_handler`, `asdu_handler`)

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `enqueue_user_data_class_1`

```elixir
@spec enqueue_user_data_class_1(GenServer.server(), IEC60870.ASDU.t()) :: :ok
```

Enqueues an ASDU into the Class 1 (high-priority) queue.
Safe to call from inside Slave callbacks or external processes.

# `enqueue_user_data_class_2`

```elixir
@spec enqueue_user_data_class_2(GenServer.server(), IEC60870.ASDU.t()) :: :ok
```

Enqueues an ASDU into the Class 2 (low-priority) queue.
Safe to call from inside Slave callbacks or external processes.

# `flush_queues`

```elixir
@spec flush_queues(GenServer.server()) :: :ok
```

# `get_app_layer_parameters`

```elixir
@spec get_app_layer_parameters(GenServer.server()) :: IEC60870.AppLayerParameters.t()
```

# `get_link_layer_parameters`

```elixir
@spec get_link_layer_parameters(GenServer.server()) ::
  IEC60870.LinkLayerParameters.t()
```

# `is_class_1_queue_full?`

```elixir
@spec is_class_1_queue_full?(GenServer.server()) :: boolean()
```

# `is_class_2_queue_full?`

```elixir
@spec is_class_2_queue_full?(GenServer.server()) :: boolean()
```

# `send_act_con`

```elixir
@spec send_act_con(GenServer.server(), IEC60870.ASDU.t(), boolean()) :: :ok
```

# `send_act_term`

```elixir
@spec send_act_term(GenServer.server(), IEC60870.ASDU.t()) :: :ok
```

# `set_dir`

```elixir
@spec set_dir(GenServer.server(), boolean()) :: :ok
```

Sets DIR bit in balanced link layer mode.

# `set_idle_timeout`

```elixir
@spec set_idle_timeout(GenServer.server(), pos_integer()) :: :ok
```

Sets idle timeout in milliseconds.

# `set_link_layer_address`

```elixir
@spec set_link_layer_address(GenServer.server(), non_neg_integer()) :: :ok
```

Sets local link layer address.

# `set_link_layer_address_other_station`

```elixir
@spec set_link_layer_address_other_station(GenServer.server(), non_neg_integer()) ::
  :ok
```

Sets peer station link address.

# `start`

```elixir
@spec start(GenServer.server()) :: :ok
```

# `start_link`

# `stop`

```elixir
@spec stop(GenServer.server()) :: :ok
```

---

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