Current section
Files
Jump to
Current section
Files
lib/bacnet/protocol/services/error/create_object_error.ex
defmodule BACnet.Protocol.Services.Error.CreateObjectError do
# TODO: Docs
alias BACnet.Protocol.APDU.Error
alias BACnet.Protocol.Constants
require Constants
# first_failed_element_number = 0 => request invalid not due to "Initial Value" parameters
@type t :: %__MODULE__{
error_class: Constants.error_class() | non_neg_integer(),
error_code: Constants.error_code() | non_neg_integer(),
first_failed_element_number: non_neg_integer()
}
@fields [:error_class, :error_code, :first_failed_element_number]
@enforce_keys @fields
defstruct @fields
@service_name Constants.macro_assert_name(
:confirmed_service_choice,
:create_object
)
@spec from_apdu(Error.t()) :: {:ok, t()} | {:error, term()}
def from_apdu(error)
def from_apdu(%Error{service: @service_name, payload: [unsigned_integer: element]} = error) do
err = %__MODULE__{
error_class: error.class,
error_code: error.code,
first_failed_element_number: element
}
{:ok, err}
end
def from_apdu(_error) do
{:error, :invalid_service_error}
end
@spec to_apdu(t(), 0..255) :: {:ok, Error.t()} | {:error, term()}
def to_apdu(error, invoke_id \\ 0)
def to_apdu(%__MODULE__{} = error, invoke_id) when invoke_id in 0..255 do
new_error = %Error{
invoke_id: invoke_id,
service: @service_name,
class: error.error_class,
code: error.error_code,
payload: [unsigned_element: error.first_failed_element_number]
}
{:ok, new_error}
end
def to_apdu(_error, _invoke_id) do
{:error, :invalid_parameter}
end
end