Packages
grizzly
8.7.1
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_handlers/aggregate_report.ex
defmodule Grizzly.CommandHandlers.AggregateReport do
@moduledoc """
Handler for working with reports that could take many report frames to
complete
This handler will handle aggregating the responses into one report command
for ease of consumption by callers.
"""
@behaviour Grizzly.CommandHandler
alias Grizzly.ZWave.Command
@type state :: %{complete_report: atom(), aggregate_param: atom(), aggregates: [any()]}
@type opt :: {:complete_report, atom(), aggregate_param: atom()}
@impl Grizzly.CommandHandler
def init(_, opts) do
report_name = Keyword.fetch!(opts, :complete_report)
aggregate_param = Keyword.fetch!(opts, :aggregate_param)
{:ok, %{complete_report: report_name, aggregate_param: aggregate_param, aggregates: []}}
end
@impl Grizzly.CommandHandler
def handle_ack(state), do: {:continue, state}
@impl Grizzly.CommandHandler
def handle_command(command, state) do
if command.name == state.complete_report do
do_handle_command(command, state)
else
{:continue, state}
end
end
defp aggregate(command, state) do
%{aggregate_param: aggregate_param, aggregates: aggregates} = state
new_aggregate_values = Command.param!(command, aggregate_param)
%{state | aggregates: do_aggregate(aggregates, new_aggregate_values)}
end
defp prepare_aggregate_data(command, state) do
%{aggregate_param: aggregate_param, aggregates: aggregates} = state
final_values = Command.param!(command, aggregate_param)
Command.put_param(command, aggregate_param, do_aggregate(aggregates, final_values))
end
defp do_aggregate(aggregates, new_aggregate_values) when is_list(aggregates),
do: aggregates ++ new_aggregate_values
defp do_aggregate(aggregates, new_aggregate_values) when is_binary(aggregates),
do: aggregates <> new_aggregate_values
defp do_handle_command(command, state) do
rtf = Command.param!(command, :reports_to_follow)
if rtf == 0 do
{:complete, prepare_aggregate_data(command, state)}
else
{:continue, aggregate(command, state)}
end
end
end