Packages
grizzly
0.20.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/command.ex
defmodule Grizzly.ZWave.Command do
@moduledoc """
Data struct and behaviour for working with Z-Wave commands
"""
alias Grizzly.ZWave.{CommandClass, DecodeError}
@type delay_seconds :: non_neg_integer()
@type params :: Keyword.t()
@type t() :: %__MODULE__{
name: atom(),
command_class: CommandClass.t(),
# Allow for the NoOperation command which has no command byte, only a command class byte
command_byte: byte() | nil,
params: params(),
impl: module()
}
@enforce_keys [
:name,
:command_class,
:command_byte,
:impl
]
defstruct name: nil,
command_byte: nil,
command_class: nil,
params: [],
impl: nil
@doc """
Make a new `Command.t()` from the params provided
Param validation should take place here.
"""
@callback new(params :: keyword()) :: {:ok, t()} | {:error, reason :: any()}
@doc """
Encode the command parameters
"""
@callback encode_params(t()) :: binary()
@doc """
Decode the binary string of command params
"""
@callback decode_params(binary()) :: {:ok, keyword()} | {:error, DecodeError.t()}
@doc """
Encode the `Command.t()` into it's binary representation
"""
@spec to_binary(t()) :: binary()
def to_binary(command) do
command_class_byte = command.command_class.byte()
if command.command_byte != nil do
params_bin = encode_params(command)
<<command_class_byte, command.command_byte>> <> params_bin
else
# NoOperation command, for example, has no command byte or parameters
<<command_class_byte>>
end
end
@doc """
Get the command param value out the params list
"""
@spec param(t(), atom(), term()) :: term() | nil
def param(command, param, default \\ nil) do
if command do
Keyword.get(command.params, param) || default
else
default
end
end
@doc """
Just like `param/3` but will raise if the the param is not in the param list
"""
@spec param!(t(), atom()) :: term() | no_return()
def param!(command, param) do
try do
Keyword.fetch!(command.params, param)
rescue
KeyError ->
raise KeyError,
"""
It looks like you tried to get the #{inspect(param)} from your command.
Here is a list of available params for your command:
""" <> list_of_command_params(command)
end
end
@doc """
Put the param value into the params list, updating pervious value if there is
one
"""
@spec put_param(t(), atom(), any()) :: t()
def put_param(command, param, new_value) do
new_params = Keyword.put(command.params, param, new_value)
%__MODULE__{command | params: new_params}
end
@spec encode_params(t()) :: binary()
def encode_params(command) do
if command.params == [] do
<<>>
else
command.impl.encode_params(command)
end
end
defp list_of_command_params(command) do
Enum.reduce(command.params, "", fn {param_name, _}, str_list ->
str_list <> " * #{inspect(param_name)}\n"
end)
end
end