Packages
grizzly
6.7.0
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/virtual_devices_registry.ex
defmodule Grizzly.VirtualDevicesRegistry do
@moduledoc false
alias Grizzly.VirtualDevices
alias Grizzly.VirtualDevices.Device
alias Grizzly.ZWave.DeviceClass
@typedoc """
"""
@type device_entry() :: %{
device_impl: Device.t(),
device_class: DeviceClass.t(),
device_opts: [Device.device_opt()],
id: VirtualDevices.id(),
pid: pid()
}
@type start_opts() :: [
{:keys, :unique},
{:name, module()},
meta: [{:inclusion_handler, Grizzly.handler()}]
]
@doc """
Function to return the options for starting this registry
"""
@spec start_options(Grizzly.Options.t()) :: start_opts()
def start_options(grizzly_opts) do
[keys: :unique, name: __MODULE__, meta: [inclusion_handler: grizzly_opts.inclusion_handler]]
end
@doc """
Register the virtual device
"""
@spec register(Device.t(), DeviceClass.t(), [Device.device_opt()]) :: device_entry()
def register(device_impl, device_class, device_opts) do
id = {:virtual, Registry.count(__MODULE__) + 1}
entry = %{
device_impl: device_impl,
device_class: device_class,
id: id,
device_opts: device_opts
}
case Registry.register(__MODULE__, id, entry) do
{:ok, pid} ->
Map.put(entry, :pid, pid)
{:error, {:already_registered, pid}} ->
Map.put(entry, :pid, pid)
end
end
@doc """
Unregister a device from the registry
"""
@spec unregister(VirtualDevices.id()) :: :ok
def unregister(device_id) do
Registry.unregister(__MODULE__, device_id)
end
@doc """
Get a device entry by the virtual device id
"""
@spec get(VirtualDevices.id()) :: device_entry() | nil
def get(device_id) do
case Registry.lookup(__MODULE__, device_id) do
[] ->
nil
[{_pid, entry}] ->
entry
end
end
@doc """
List all the ids of the registered virtual devices
"""
@spec list_ids() :: [VirtualDevices.id()]
def list_ids() do
Registry.select(__MODULE__, [{{:"$1", :_, :_}, [], [:"$1"]}])
end
@doc """
Try to get the the handler that the registry was configured to use on start
"""
@spec get_handler() :: Grizzly.handler() | nil
def get_handler() do
case Registry.meta(__MODULE__, :inclusion_handler) do
{:ok, handler} -> handler
:error -> nil
end
end
end