Packages
grizzly
0.14.0
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/multi_command_encapsulated.ex
defmodule Grizzly.ZWave.Commands.MultiCommandEncapsulated do
@moduledoc """
The Multi Command Encapsulated Command used to contain multiple Commands.
Params:
* `:commands` - the commands encapsulated in this one
"""
@behaviour Grizzly.ZWave.Command
alias Grizzly.ZWave.{Command, Decoder}
alias Grizzly.ZWave.CommandClasses.MultiCommand
@type param :: {:commands, [Command.t()]}
@impl true
def new(params) do
command = %Command{
name: :multi_command_encapsulated,
command_byte: 0x01,
command_class: MultiCommand,
params: params,
impl: __MODULE__
}
{:ok, command}
end
@impl true
def encode_params(command) do
commands = Command.param!(command, :commands)
count = Enum.count(commands)
encoded_commands = for command <- commands, into: <<>>, do: encode_command(command)
<<count>> <> encoded_commands
end
@impl true
def decode_params(<<_number_of_commands, commands_binary::binary>>) do
commands = decode_commands(commands_binary) |> Enum.reverse()
{:ok, [commands: commands]}
end
defp encode_command(command) do
command_class_byte = apply(command.command_class, :byte, [])
command_byte = command.command_byte
encoded_params = apply(command.impl, :encode_params, [command])
encoded_command = <<command_class_byte, command_byte>> <> encoded_params
<<byte_size(encoded_command)>> <> encoded_command
end
defp decode_commands(<<>>), do: []
defp decode_commands(<<length, command_binary::binary-size(length), others::binary>>) do
command = decode_command(command_binary)
[command | decode_commands(others)]
end
defp decode_command(
<<_command_class_byte, _command_byte, _encoded_params::binary>> = command_binary
) do
{:ok, command} = Decoder.from_binary(command_binary)
command
end
end