Packages
grizzly
5.1.2
9.1.4
9.1.2
9.1.1
9.1.0
9.0.0
8.15.3
8.15.2
8.15.1
8.15.0
8.14.0
8.13.0
8.12.0
8.11.3
8.11.2
8.11.1
8.11.0
8.10.0
8.9.0
8.8.1
8.8.0
8.7.1
8.7.0
8.6.12
8.6.11
8.6.10
8.6.9
8.6.8
8.6.7
retired
8.6.6
8.6.5
8.6.4
8.6.3
8.6.2
8.6.1
8.6.0
8.5.3
8.5.2
8.5.1
8.5.0
8.4.0
8.3.0
8.2.3
8.2.2
8.2.1
8.2.0
8.1.0
8.0.1
8.0.0
7.4.3
7.4.2
7.4.1
7.4.0
7.3.0
7.2.0
7.1.4
7.1.3
7.1.2
7.1.1
7.1.0
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.8.8
6.8.7
6.8.6
6.8.5
6.8.4
6.8.3
6.8.2
6.8.1
6.8.0
6.7.1
6.7.0
6.6.1
6.6.0
6.5.1
6.5.0
6.4.0
6.3.0
6.2.0
6.1.1
6.1.0
6.0.1
6.0.0
5.4.1
5.4.0
5.3.0
5.2.8
5.2.7
5.2.6
5.2.5
5.2.4
5.2.3
5.2.2
5.2.1
5.2.0
5.1.2
5.1.1
5.1.0
5.0.2
5.0.1
5.0.0
4.0.1
4.0.0
3.0.0
2.1.0
2.0.0
1.0.1
1.0.0
0.22.7
0.22.6
0.22.5
0.22.4
0.22.3
0.22.2
0.22.1
0.22.0
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.1
0.19.0
0.18.3
0.18.2
0.18.1
0.18.0
0.17.7
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.2
0.16.1
0.16.0
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.0
0.9.0-rc.4
0.9.0-rc.3
0.9.0-rc.2
0.9.0-rc.1
0.9.0-rc.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.3
0.4.2
Elixir Z-Wave library
Current section
Files
Jump to
Current section
Files
lib/grizzly/zwave/commands/node_add_dsk_set.ex
defmodule Grizzly.ZWave.Commands.NodeAddDSKSet do
@moduledoc """
Command to set the DSK for a including node
Params:
* `:seq_number` - the sequence number for the command (required)
* `:accept` - the including controller accepts the inclusion process
and should proceed with adding the including node (required)
* `input_dsk_length` - the length of the DSK provided (required)
* `input_dsk` - the DSK pin for the including node (required)
"""
@behaviour Grizzly.ZWave.Command
alias Grizzly.ZWave
alias Grizzly.ZWave.{Command, DSK}
alias Grizzly.ZWave.CommandClasses.NetworkManagementInclusion
@type param ::
{:seq_number, ZWave.seq_number()}
| {:accept, boolean()}
| {:input_dsk_length, 0..0xF}
| {:input_dsk, DSK.t()}
@impl true
@spec new([param()]) :: {:ok, Command.t()}
def new(params) do
# TODO validate params
command = %Command{
name: :node_add_dsk_set,
command_byte: 0x14,
command_class: NetworkManagementInclusion,
params: params,
impl: __MODULE__
}
{:ok, command}
end
@impl true
@spec encode_params(Command.t()) :: binary()
def encode_params(command) do
seq_number = Command.param!(command, :seq_number)
accept = Command.param!(command, :accept)
input_dsk_length = Command.param!(command, :input_dsk_length)
input_dsk = Command.param(command, :input_dsk)
dsk = dsk_to_binary(input_dsk, input_dsk_length)
<<seq_number, bool_to_bit(accept)::size(1), 0::size(3), input_dsk_length::size(4)>> <> dsk
end
@impl true
@spec decode_params(binary()) :: {:ok, [param()]}
def decode_params(
<<seq_number, accept::size(1), _::size(3), input_dsk_length::size(4),
input_dsk::binary-size(input_dsk_length)-unit(8)>>
) do
{:ok,
[
seq_number: seq_number,
accept: bit_to_bool(accept),
input_dsk_length: input_dsk_length,
input_dsk: DSK.new(input_dsk)
]}
end
defp bool_to_bit(true), do: 1
defp bool_to_bit(false), do: 0
defp bit_to_bool(1), do: true
defp bit_to_bool(0), do: false
defp dsk_to_binary(nil, dsk_len) when dsk_len == 0 do
<<>>
end
defp dsk_to_binary(0, dsk_len) when dsk_len == 0 do
<<>>
end
defp dsk_to_binary(%DSK{} = dsk, dsk_len) do
:binary.part(dsk.raw, 0, dsk_len)
end
end