defmodule BrightPi do @moduledoc """ BrightPi is a library to talk to the "Pi Supply Bright Pi" board featuring 4 white LEDs and 4 pairs of two infrared LEDs. This library can control the on/off value of each LED or LED pair, as well as their dim value and a global gain value. LEDs and LED pairs are numbered from 1 to 8. The mapping looks like the following (front view, cables at the bottom): [4] [1] [7] [6] [8] [5] [3] [2] ## Setup In order to use the library, the board process needs to be added to the supervision tree. defmodule MyApp.Application do use Application @impl true def start(_type, _args) do children = [ BrightPi.board() ] opts = [strategy: :one_for_one, name: MyApp.Supervisor] Supervisor.start_link(children, opts) end end By default, the `BrightPi.board/0` helper function returns the `BrightPi.Board` module which talks to the real LED board over I2C. For local development, the `BrightPi.VirtualBoard` module can be configured via application configuration: config :bright_pi, board: BrightPi.VirtualBoard The `BrightPi.VirtualBoard` module mocks all the functionality of the real LED board. Depending on the application setup, each board can also be started explicitly in the supervision tree, as long as the proper board is set via configuration in each environment. """ use BrightPi.Constants @doc """ Sets which LEDs should be on. LEDs not in the list will be turned off. * See `BrightPi` for the LED mapping. ## Examples BrightPi.set_leds([1, 2, 3, 4]) # same as BrightPi.set_leds(BrightPi.LED.all_white()) BrightPi.set_leds([5, 6, 7, 8]) # same as BrightPi.set_leds(BrightPi.LED.all_ir()) BrightPi.set_leds([1, 2, 3, 4, 5, 6, 7, 8]) # same as BrightPi.set_leds(BrightPi.LED.all()) It returns the list of LEDs that are on: iex> BrightPi.set_leds([1, 2, 3, 4]) {:ok, [1, 2, 3, 4]} """ def set_leds(leds) when is_list(leds) do GenServer.call(board(), {:set_leds, leds}) end @doc """ Gets the list of LEDs that are on. * See `BrightPi` for the LED mapping. ## Example iex> BrightPi.get_leds() {:ok, [1, 2, 3, 4]} """ def get_leds() do GenServer.call(board(), :get_leds) end @doc """ Sets the dim value for the specified list of LEDs. * See `BrightPi` for the LED mapping. * See `BrightPi.LED.min_dim/0` for minimum dim value. * See `BrightPi.LED.max_dim/0` for maximum dim value. ## Example iex> BrightPi.set_leds_dim([1, 2, 3, 4], 10) {:ok, [10, 10, 10, 10, 1, 1, 1, 1]} """ def set_leds_dim(leds, dim) when is_list(leds) and dim in @min_dim..@max_dim do GenServer.call(board(), {:set_leds_dim, leds, dim}) end @doc """ Gets the list of all LED dim values. ## Example iex> BrightPi.get_leds_dim() {:ok, [1, 1, 1, 1, 1, 1, 1, 1]} """ def get_leds_dim() do GenServer.call(board(), :get_leds_dim) end @doc """ Sets the gain value of all LEDs. * See `BrightPi.LED.min_gain/0` for minimum gain value. * See `BrightPi.LED.max_gain/0` for maximum gain value. * See `BrightPi.LED.default_gain/0` for default gain value. ## Example iex> BrightPi.set_gain(10) {:ok, 10} """ def set_gain(gain) when gain in @min_gain..@max_gain do GenServer.call(board(), {:set_gain, gain}) end @doc """ Gets the gain value of all LEDs. ## Example iex> BrightPi.get_gain() {:ok, 8} """ def get_gain() do GenServer.call(board(), :get_gain) end @doc """ Returns the currently configured board module. ## Board modules * `BrightPi.Board` - Default board * `BrightPi.VirtualBoard` - Virtual board for local development """ def board() do Application.get_env(:bright_pi, :board, BrightPi.Board) end end