Packages

This mix is to be used to control J1605 switch hub, which contains 16 switches.

Current section

Files

Jump to
j1605 lib j1605 supervisor.ex
Raw

lib/j1605/supervisor.ex

defmodule J1605.Supervisor do
use Supervisor
alias J1605.Device
def start_link(arg) do
Supervisor.start_link(__MODULE__, arg, name: __MODULE__)
end
@impl true
def init(arg) do
with {:ok, config} <- Access.fetch(arg, :device),
{:ok, address} <- Access.fetch(config, :address),
{:ok, port} <- Access.fetch(config, :port),
time_to_wait <- Access.get(config, :time_to_wait, 0),
{:ok, address} <- parse_ipv4_address(address) do
Supervisor.init(
[
{Device, {address, port, time_to_wait}},
{Registry,
keys: :duplicate, name: J1605.Registry, partitions: System.schedulers_online()}
],
strategy: :one_for_one
)
end
end
defp parse_ipv4_address(address) when is_binary(address) do
address |> String.to_charlist() |> parse_ipv4_address()
end
defp parse_ipv4_address(address) do
with {:ok, address} <- :inet.parse_ipv4_address(address) do
{:ok, address}
else
_ -> {:error, :invalid_address}
end
end
end