# `IEC60870.Types.Qualifiers`
[🔗](https://github.com/Ultraluv/ex_iec60870/blob/main/lib/iec60870/types/qualifiers.ex#L1)

Quality descriptors, qualifiers, and value scaling helpers for IEC 60870-5-101/104.
Matches `cs101_information_objects.h` and `cs101_information_objects.c`.

# `afq_neg_ack_file`

# `afq_neg_ack_section`

# `afq_not_used`

# `afq_pos_ack_file`

# `afq_pos_ack_section`

# `coi_local_manual_reset`

# `coi_local_switch_on`

# `coi_remote_reset`

# `decode_double_point`

```elixir
@spec decode_double_point(0..3) :: :intermediate | :off | :on | :indeterminate
```

# `decode_event_state`

```elixir
@spec decode_event_state(0..3) :: :indeterminate_0 | :off | :on | :indeterminate_3
```

# `decode_qds`

# `decode_scd`

```elixir
@spec decode_scd(&lt;&lt;_::32&gt;&gt;) :: {non_neg_integer(), non_neg_integer()}
```

# `decode_single_event`

```elixir
@spec decode_single_event(byte()) :: {atom(), byte()}
```

# `decode_step_command`

```elixir
@spec decode_step_command(0..3) :: :invalid_0 | :lower | :higher | :invalid_3
```

# `encode_double_point`

```elixir
@spec encode_double_point(atom() | 0..3) :: 0..3
```

Encodes double-point value (:indeterminate, :off, :on, :intermediate) to 2-bit integer.

# `encode_event_state`

```elixir
@spec encode_event_state(atom() | 0..3) :: 0..3
```

# `encode_qds`

Encodes Quality Descriptor for Events of Protection Equipment (QDS).

# `encode_quality`

```elixir
@spec encode_quality(non_neg_integer() | [atom()]) :: byte()
```

Packs a list of quality atoms or an integer bitmask into a `uint8` quality byte.
Supported flags: `:overflow`, `:reserved`, `:elapsed_time_invalid`, `:blocked`, `:substituted`, `:non_topical`, `:invalid`, `:good`.

# `encode_scd`

```elixir
@spec encode_scd(non_neg_integer(), non_neg_integer()) :: &lt;&lt;_::32&gt;&gt;
```

# `encode_single_event`

```elixir
@spec encode_single_event(atom() | 0..3, byte()) :: byte()
```

# `encode_step_command`

```elixir
@spec encode_step_command(atom() | 0..3) :: 0..3
```

Encodes regulating step command to byte.

# `file_error_checksum_failed`

# `file_error_default`

# `file_error_req_memory_not_available`

# `file_error_unexpected_comm_service`

# `file_error_unexpected_name_of_file`

# `file_error_unexpected_name_of_section`

# `float_to_normalized`

# `has_quality_flag?`

```elixir
@spec has_quality_flag?(byte(), atom()) :: boolean()
```

Checks whether a specific quality flag is set in a quality byte.

# `lsq_file_transfer_with_deact`

# `lsq_file_transfer_without_deact`

# `lsq_not_used`

# `lsq_section_transfer_with_deact`

# `lsq_section_transfer_without_deact`

# `nof_default`

# `nof_disturbance_data`

# `nof_sequences_of_analogue_values`

# `nof_sequences_of_events`

# `nof_transparent_file`

# `normalized_to_float`

# `normalized_to_scaled`

```elixir
@spec normalized_to_scaled(number()) :: -32768..32767
```

# `output_ci_cl1`

# `output_ci_cl2`

# `output_ci_cl3`

# `output_ci_gc`

# `qcc_frz_counter_reset`

# `qcc_frz_freeze_with_reset`

# `qcc_frz_freeze_without_reset`

# `qcc_frz_read`

# `qcc_rqt_general`

# `qcc_rqt_group`

# `qoc_long_pulse_duration`

# `qoc_no_additional_definition`

# `qoc_persistent_output`

# `qoc_short_pulse_duration`

# `qoi_group`

# `qoi_station`

# `qpa_de_act_object_parameter`

# `qpa_de_act_object_transmission`

# `qpa_de_act_prev_loaded_parameter`

# `qpa_not_used`

# `qpm_high_limit_for_transmission`

# `qpm_low_limit_for_transmission`

# `qpm_not_used`

# `qpm_smoothing_factor`

# `qpm_threshold_value`

# `qrp_general_reset`

# `qrp_not_used`

# `qrp_reset_pending_info_with_time_tag`

# `quality_blocked`

# `quality_elapsed_time_invalid`

# `quality_good`

# `quality_invalid`

# `quality_non_topical`

# `quality_overflow`

# `quality_reserved`

# `quality_substituted`

# `scaled_to_normalized`

```elixir
@spec scaled_to_normalized(integer()) :: float()
```

# `scd_get_cd`

```elixir
@spec scd_get_cd(non_neg_integer() | {non_neg_integer(), non_neg_integer()}, 0..15) ::
  boolean()
```

Checks whether bit `i` (`0..15`) is set in `cdn` (`StatusAndStatusChangeDetection_getCD`).

# `scd_get_st`

```elixir
@spec scd_get_st(non_neg_integer() | {non_neg_integer(), non_neg_integer()}, 0..15) ::
  boolean()
```

Checks whether bit `i` (`0..15`) is set in `stn` (`StatusAndStatusChangeDetection_getST`).

# `scq_deactivate_file`

# `scq_deactivate_section`

# `scq_default`

# `scq_delete_file`

# `scq_request_file`

# `scq_request_section`

# `scq_select_file`

# `scq_select_section`

# `sof_fa`

# `sof_for`

# `sof_lfd`

# `sof_status_mask`

# `start_event_gs`

# `start_event_none`

# `start_event_res1`

# `start_event_res2`

# `start_event_sie`

# `start_event_sl1`

# `start_event_sl2`

# `start_event_sl3`

# `start_event_srd`

---

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