Packages
grizzly
0.8.6
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/configuration/bulk_get.ex
defmodule Grizzly.CommandClass.Configuration.BulkGet do
@moduledoc """
Command module for working with the Configuration command class BULK_GET command
Command Options:
* `:start` - the starting number of the configuration params
* `:number` - the number of params to get
* `:seq_number` the sequence number used by Z/IP packet
* `:parameter_values` - a list of the parameter values that are returned from Z-Wave
* `:acked` - if there the command has successfully acked by Z-Wave
* `:retries` - the number of attempts to send the command (default 2)
"""
@behaviour Grizzly.Command
alias Grizzly.Packet
alias Grizzly.Command.{EncodeError, Encoding}
require Logger
@type t :: %__MODULE__{
start: integer,
number: byte,
seq_number: Grizzly.seq_number(),
parameter_values: [],
acked: boolean,
retries: non_neg_integer()
}
@type opt ::
{:start, integer}
| {:number, byte}
| {:seq_number, Grizzly.seq_number()}
| {:retries, non_neg_integer()}
defstruct start: nil,
number: nil,
seq_number: nil,
acked: false,
parameter_values: [],
retries: 2
@spec init([opt]) :: {:ok, t}
def init(opts) do
{:ok, struct(__MODULE__, opts)}
end
@spec encode(t) :: {:ok, binary} | {:error, EncodeError.t()}
def encode(%__MODULE__{seq_number: seq_number, start: start, number: number} = command) do
with {:ok, _encoded} <-
Encoding.encode_and_validate_args(command, %{
start: {:bytes, 2},
number: :byte
}) do
binary =
Packet.header(seq_number) <>
<<0x70, 0x08, start::size(2)-big-integer-signed-unit(8), number>>
{:ok, binary}
end
end
@spec handle_response(t(), Packet.t()) ::
{:continue, t()}
| {:done, {:error, :nack_response}}
| {:done, {:ok, %{start: any, values: any}}}
| {:queued, t()}
| {:retry, t()}
def handle_response(
%__MODULE__{seq_number: seq_number, retries: 0},
%Packet{
seq_number: seq_number,
types: [:nack_response]
}
),
do: {:done, {:error, :nack_response}}
def handle_response(
%__MODULE__{seq_number: seq_number, retries: n} = command,
%Packet{
seq_number: seq_number,
types: [:nack_response]
}
),
do: {:retry, %{command | retries: n - 1}}
def handle_response(
%__MODULE__{seq_number: seq_number} = command,
%Packet{
seq_number: seq_number,
types: [:nack_response, :nack_waiting]
} = packet
) do
if Packet.sleeping_delay?(packet) do
{:queued, command}
else
{:continue, command}
end
end
def handle_response(
%__MODULE__{acked: false, seq_number: seq_number} = command,
%Packet{
seq_number: seq_number,
types: [:ack_response]
}
) do
{:continue, %__MODULE__{command | acked: true}}
end
def handle_response(
%__MODULE__{parameter_values: parameter_values, acked: true},
%Packet{
body:
%{
command_class: Grizzly.CommandClass.Configuration,
command: :bulk_report,
to_follow: 0,
parameter_offset: parameter_offset,
values: values
} = body
}
) do
_ = Logger.debug("Handling last bulk report #{inspect(body)}")
{:done, {:ok, %{start: parameter_offset, values: parameter_values ++ values}}}
end
def handle_response(
%__MODULE__{parameter_values: parameter_values, acked: true} = command,
%Packet{
body:
%{
command_class: Configuration,
command: :bulk_report,
to_follow: n,
parameter_offset: _parameter_offset,
values: values
} = body
}
) do
_ = Logger.debug("Handling partial bulk report #{inspect(body)} (#{n} to follow)")
{:continue, %__MODULE__{command | parameter_values: parameter_values ++ values}}
end
def handle_response(command, _packet) do
{:continue, command}
end
end