# SPDX-FileCopyrightText: 2023 Frank Hunleth
# SPDX-FileCopyrightText: 2024 Connor Rigby
#
# SPDX-License-Identifier: Apache-2.0
defmodule Circuits.GPIO.Backend do
@moduledoc """
Backends provide the connection to the real or virtual GPIO controllers
"""
alias Circuits.GPIO
alias Circuits.GPIO.Handle
@doc """
Return a list of GPIOs
See `t:GPIO.identifiers/0` for the information that is returned. The `options` contain
backend-specific options to help with enumeration.
"""
@callback enumerate(options :: GPIO.open_options()) :: [GPIO.identifiers()]
@doc """
Return identifying information about a GPIO
See `t:gpio_spec/0` for the ways of referring to GPIOs. The `options` contain
backend-specific options to help enumerating GPIOs.
If the GPIO is found, this function returns identifying information about the GPIO.
"""
@callback identifiers(
gpio_spec :: GPIO.gpio_spec(),
options :: GPIO.open_options()
) :: {:ok, GPIO.identifiers()} | {:error, atom()}
@doc """
Return a GPIO's current status
This function returns how a GPIO is configured. The GPIO doesn't need to be
opened. It's different from `gpio_identifiers/2` since it returns dynamic information
whereas `gpio_identifiers/2` only returns information about how to refer to a GPIO
and where it exists in the system.
See `t:gpio_spec/0` for the ways of referring to GPIOs. The `options` contain
backend-specific options to help enumerating GPIOs.
If the GPIO is found, this function returns its status.
"""
@callback status(
gpio_spec :: GPIO.gpio_spec(),
options :: GPIO.open_options()
) :: {:ok, GPIO.status()} | {:error, atom()}
@doc """
Open a GPIO
See `t:gpio_spec/0` for the ways of referring to GPIOs. Set `direction` to
either `:input` or `:output`. If opening as an output, then be sure to set
the `:initial_value` option to minimize the time the GPIO is in the default
state.
Options:
* :initial_value - Set to `0` or `1`. Only used for outputs. Defaults to `0`.
* :pull_mode - Set to `:not_set`, `:pullup`, `:pulldown`, or `:none` for an
input pin. `:not_set` is the default.
Returns `{:ok, handle}` on success.
"""
@callback open(
gpio_spec :: GPIO.gpio_spec(),
direction :: GPIO.direction(),
options :: GPIO.open_options()
) ::
{:ok, Handle.t()} | {:error, atom()}
@doc """
Return information about this backend
"""
@callback backend_info() :: map()
end