Packages
grizzly
0.9.0-rc.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/runtime.ex
defmodule Grizzly.Runtime do
@moduledoc """
Cofiguration params:
* `:auto_start` - setup runtime when Grizzly application starts
* `:on_ready` - a `{module, function, args}` to call after the runtime
seems to be up and running correctly
* `:run_zipgateway_bin` - if you run `zipgateway` outside of Grizzly you can
set this to false
Example:
```elixir
config :grizzly,
runtime: [
auto_start: true,
on_ready: {MyModule, :grizzly_ready, []},
run_zipgateway_bin: true
]
```
You're using Grizzly on a Nerves system, this config is probably what you
want:
```elixir
config :grizzly,
runtime: [
on_ready: {MyFirmwareProject.ZWave, :ready, []}
]
```
The other defaults should work.
"""
use GenServer
alias Grizzly.{ZIPGateway, Connection}
@type opt :: {:auto_start, boolean()} | {:on_ready, mfa()} | {:run_zipgateway_bin, boolean()}
defmodule State do
@moduledoc false
# TODO use status?
defstruct opts: [], on_ready: nil, status: nil
end
@spec start_link([opt]) :: GenServer.on_start()
def start_link(opts) do
GenServer.start_link(__MODULE__, opts, name: __MODULE__)
end
@impl true
def init(opts) do
case Keyword.get(opts, :auto_start, true) do
true ->
{:ok, %State{opts: opts}, {:continue, next_continue(opts)}}
false ->
{:ok, %State{opts: opts}}
end
end
@impl true
def handle_continue(:run_zipgateway_bin, state) do
# start the zipgateway binary
:ok = ZIPGateway.run_zipgateway()
# wait a little as it can take some time for zipgateway
# to get complete setup
:timer.sleep(500)
{:noreply, state, {:continue, :try_connect}}
end
def handle_continue(:try_connect, state) do
case Connection.open(1) do
{:ok, _} ->
:ok = maybe_run_on_ready(state.opts)
{:noreply, state}
{:error, :timeout} ->
# give a little breathing space
:timer.sleep(250)
# try again
{:noreply, state, {:continue, :try_connect}}
end
end
defp maybe_run_on_ready(opts) do
case Keyword.get(opts, :on_ready) do
nil ->
:ok
{m, f, a} ->
apply(m, f, a)
:ok
end
end
defp next_continue(opts) do
if Keyword.get(opts, :run_zipgateway_bin, true) do
:run_zipgateway_bin
else
:try_connect
end
end
end