defmodule NervesBackdoor.Gpio do
use GenServer
def start_link(_opts \\ []) do
init_args = []
GenServer.start_link(__MODULE__, init_args, name: :nbd_gpio)
end
def stop() do
GenServer.stop(:nbd_gpio)
end
def output(port) do
GenServer.call(:nbd_gpio, {:output, port})
end
def input(port) do
GenServer.call(:nbd_gpio, {:input, port})
end
def write(gpio, value) do
GenServer.call(:nbd_gpio, {:write, gpio, value})
end
def read(gpio) do
GenServer.call(:nbd_gpio, {:read, gpio})
end
def close(gpio) do
GenServer.call(:nbd_gpio, {:close, gpio})
end
@impl true
def init(_args) do
{:ok, %{}}
end
@impl true
def handle_call(req, _from, state) do
res =
case req do
{:output, port} -> io_output(port)
{:input, port} -> io_input(port)
{:write, gpio, value} -> io_write(gpio, value)
{:read, gpio} -> io_read(gpio)
{:close, gpio} -> io_close(gpio)
end
{:reply, res, state}
end
def io_output(port) do
Circuits.GPIO.open(port, :output)
end
def io_input(port) do
Circuits.GPIO.open(port, :input)
end
def io_write(gpio, value) do
Circuits.GPIO.write(gpio, value)
end
def io_read(gpio) do
Circuits.GPIO.read(gpio)
end
def io_rising(gpio) do
Circuits.GPIO.set_interrupts(gpio, :rising)
end
def io_falling(gpio) do
Circuits.GPIO.set_interrupts(gpio, :falling)
end
def io_both(gpio) do
Circuits.GPIO.set_interrupts(gpio, :both)
end
def io_close(gpio) do
Circuits.GPIO.close(gpio)
end
end