lib/bh1750.ex

defmodule BH1750 do
  @moduledoc """
  Use BH1750 16-bit ambient light sensor in Elixir.
  """

  use GenServer

  @type option() :: {:name, GenServer.name()} | BH1750.Sensor.option()

  @doc """
  Instantiates a BH1750 sensor.
  """
  def start_link(args \\ []) do
    GenServer.start_link(__MODULE__, args, name: args[:name])
  end

  @doc """
  Powers down the BH1750 sensor.
  """
  @spec power_down(GenServer.server()) :: :ok | {:error, any}
  def power_down(server \\ BH1750), do: GenServer.call(server, :power_down)

  @doc """
  Measures the ambient light.
  """
  @spec measure(GenServer.server()) :: {:ok, 0..0xFFFF} | {:error, any}
  def measure(server \\ BH1750), do: GenServer.call(server, :measure)

  @impl GenServer
  def init(args) do
    {:ok, BH1750.Sensor.new(args)}
  end

  @impl GenServer
  def handle_call(fn_name, _from, sensor) do
    {:reply, apply(BH1750.Sensor, fn_name, [sensor]), sensor}
  end
end