Packages
grizzly
0.6.3
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/command_class/version.ex
defmodule Grizzly.CommandClass.Version do
@moduledoc """
Helpers for working with the command class VERSION
"""
alias Grizzly.CommandClass.Mappings
require Logger
@type library_type ::
:static_controller
| :controller
| :enhanced_slave
| :slave
| :installer
| :routing_slave
| :bridge_controller
| :device_under_test
| :av_remote
| :av_device
@type version_report :: %{
protocol_library: library_type(),
protocol_version: byte(),
protocol_sub_version: byte(),
firmware_version: byte(),
firmware_sub_version: byte()
}
@doc """
Decode version report data
"""
@spec decode_report_data(<<_::16>>) :: %{command_class: atom, version: byte}
def decode_report_data(<<command_class_byte, version>>) do
command_class =
case Mappings.from_byte(command_class_byte) do
{:unk, _} -> :invalid
command_class -> command_class
end
%{
command_class: command_class,
version: version
}
end
@spec decode_version_report(binary()) ::
{:ok, version_report()} | {:error, :invalid_version_report, binary()}
def decode_version_report(
<<protocol_library, protocol_version, protocol_sub_version, firmware_version,
firmware_sub_version, _::binary>> = binary
) do
with {:ok, library_type} <- decode_library_type(protocol_library) do
{:ok,
%{
protocol_library: library_type,
protocol_version: protocol_version,
protocol_sub_version: protocol_sub_version,
firmware_version: firmware_version,
firmware_sub_version: firmware_sub_version
}}
else
{:error, :invalid_library_type, library_type} ->
_ = Logger.warn("Invalid library type: #{inspect(library_type)}")
{:error, :invalid_version_report, binary}
end
end
def decode_version_report(binary), do: {:error, :invalid_version_report, binary}
@doc """
Encode command class
"""
@spec encode_command_class(atom) :: {:ok, byte} | {:error, :invalid_arg, any()}
def encode_command_class(command_class) do
case Mappings.to_byte(command_class) do
{:unk, _} ->
_ = Logger.warn("Unknown command class #{inspect(command_class)}")
{:error, :invalid_arg, command_class}
byte ->
{:ok, byte}
end
end
@doc """
Decode a byte into a library type
"""
@spec decode_library_type(byte()) ::
{:ok, library_type()} | {:error, :invalid_library_type, byte()}
def decode_library_type(0x01), do: {:ok, :static_controller}
def decode_library_type(0x02), do: {:ok, :controller}
def decode_library_type(0x03), do: {:ok, :enhanced_slave}
def decode_library_type(0x04), do: {:ok, :slave}
def decode_library_type(0x05), do: {:ok, :installer}
def decode_library_type(0x06), do: {:ok, :routing_slave}
def decode_library_type(0x07), do: {:ok, :bridge_controller}
def decode_library_type(0x08), do: {:ok, :device_under_test}
def decode_library_type(0x0A), do: {:ok, :av_remote}
def decode_library_type(0x0B), do: {:ok, :av_device}
def decode_library_type(byte), do: {:error, :invalid_library_type, byte}
end