Packages
nerves_runtime
0.1.1
0.13.13
0.13.12
0.13.11
retired
0.13.10
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.0
0.11.10
0.11.9
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
retired
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.0
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.5.0
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.1
0.3.0
0.2.0
0.1.2
0.1.1
0.1.0
Small, general runtime utilities for Nerves devices
Current section
Files
Jump to
Current section
Files
lib/nerves_runtime/device/adapter.ex
defmodule Nerves.Runtime.Device.Adapter do
alias Nerves.Runtime.Device
@callback attributes(Device.t) :: map
defmacro __using__(opts) do
quote do
use GenServer
@behaviour Nerves.Runtime.Device.Adapter
@subsystem unquote(opts[:subsystem])
def __subsystem__, do: @subsystem
def attributes(_dev), do: %{}
def start_link(adapter_opts \\ []) do
Nerves.Runtime.Device.Adapter.start_link(__MODULE__, self(), adapter_opts)
end
def stop(pid) do
GenServer.stop(pid)
end
def connect(pid, device) do
GenServer.call(pid, {:connect, device})
end
defoverridable [attributes: 1]
end
end
def start_link(mod, handler, adapter_opts) do
GenServer.start_link(__MODULE__, {mod, handler, adapter_opts})
end
def init({mod, handler, adapter_opts}) do
{:ok, %{
handler: handler,
adapter_state: %{opts: adapter_opts},
mod: mod
}}
end
def handle_call({:connect, device}, _from, s) do
case s.mod.handle_connect(device, s.adapter_state) do
{:ok, adapter_state} ->
put_in(s, [:adapter_state], adapter_state)
{:reply, :ok, s}
{:error, error, s} ->
{:reply, {:error, error}, s}
end
end
def handle_info(data, s) do
s =
case s.mod.handle_info(data, s.adapter_state) do
{:data_in, data, adapter_state} ->
send(s.handler, {:adapter, :data_in, data})
put_in(s, [:adapter_state], adapter_state)
end
{:noreply, s}
end
end