Packages
grizzly
5.2.4
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/firmware_updates/firmware_update_runner/image.ex
defmodule Grizzly.FirmwareUpdates.FirmwareUpdateRunner.Image do
@moduledoc false
@type t :: %__MODULE__{path: String.t(), fragments: [binary]}
require Logger
defstruct path: nil,
fragments: []
@spec new(String.t()) :: t()
def new(path) do
%__MODULE__{path: path}
end
@doc "Fragment the entire image or (ASSUMPTION) the yet-to-be-uploaded portion of the image"
def fragment_image(
%__MODULE__{fragments: fragments} = image,
max_fragment_size,
next_fragment_index
) do
if next_fragment_index == 1 do
fragments = break_into_fragments(image.path, max_fragment_size)
%__MODULE__{image | fragments: fragments}
else
# enums are zero-indexed, zwave is one-indexed
{uploaded_fragments, remaining_fragments} = Enum.split(fragments, next_fragment_index - 1)
new_remaining_fragments =
Enum.reduce(remaining_fragments, <<>>, &(&2 <> &1))
|> Enum.chunk_every(max_fragment_size)
|> Enum.into([])
%__MODULE__{image | fragments: uploaded_fragments ++ new_remaining_fragments}
end
end
@spec data(Grizzly.FirmwareUpdates.FirmwareUpdateRunner.Image.t(), non_neg_integer) ::
{false, binary} | {true, binary}
def data(
%__MODULE__{fragments: fragments},
fragment_index
) do
# fragment indexing by ZWave is 1-based
fragment = Enum.at(fragments, fragment_index - 1)
last? = fragment_index == Enum.count(fragments)
{last?, fragment}
end
def fragment_count(%__MODULE__{fragments: fragments}) do
Enum.count(fragments)
end
defp break_into_fragments(path, fragment_size) do
File.stream!(path, [], fragment_size)
|> Enum.into([])
end
end