lib/apds9960.ex

defmodule APDS9960 do
  @moduledoc """
  Use `APDS9960` color, proximity and gesture sensor in Elixir.
  """

  @type gesture_direction :: :up | :down | :left | :right

  defdelegate init(opts \\ []), to: APDS9960.Sensor
  defdelegate enable(sensor, engine), to: APDS9960.Sensor
  defdelegate reset!(sensor), to: APDS9960.Sensor
  defdelegate set_defaults!(sensor), to: APDS9960.Sensor

  @doc """
  Reads the proximity data. The proximity value is a number from 0 to 255 where the higher the
  number the closer an object is to the sensor.

      # To get a proximity result, first enable the proximity engine.
      APDS9960.enable(sensor, :proximity)

      APDS9960.proximity(sensor)

  """
  @spec proximity(APDS9960.Sensor.t()) :: byte
  def proximity(%APDS9960.Sensor{} = sensor, opts \\ []) do
    APDS9960.Proximity.read_proximity(sensor, opts)
  end

  @doc """
  Reads the color data.

      # To get a color measurement, first enable the color engine.
      APDS9960.enable_color(sensor)

      APDS9960.color(sensor)

  """
  @spec color(APDS9960.Sensor.t()) :: %{
          red: 0..0xFFFF,
          green: 0..0xFFFF,
          blue: 0..0xFFFF,
          clear: 0..0xFFFF
        }
  def color(%APDS9960.Sensor{} = sensor, opts \\ []) do
    APDS9960.ALS.read_color(sensor, opts)
  end

  @doc """
  Reads new gesture engine results, deduces gesture and returns the direction of the gesture.

      # To get a gesture result, first enable both the proximity engine and gesture engine.
      APDS9960.enable(sensor, :gesture)
      APDS9960.enable(sensor, :proximity)

      APDS9960.gesture(sensor, timeout: 5000)

  """
  @spec gesture(APDS9960.Sensor.t(), Enum.t()) :: gesture_direction | {:error, any}
  def gesture(%APDS9960.Sensor{} = sensor, opts \\ []) do
    APDS9960.Gesture.read_gesture(sensor, opts)
  end
end