Current section
Files
Jump to
Current section
Files
lib/gpio_irq_device.ex
defmodule GPIOIRQDevice do
use GenServer
def set_callback(pid, callback) when is_function(callback) do
GenServer.call(pid, {:set_callback, callback})
end
@impl true
def init(irq_pin) do
{:ok, gpio} = Circuits.GPIO.open(irq_pin, :input)
{:ok, gpio}
end
@impl true
def handle_call({:set_callback, callback}, _from, gpio) when is_function(callback) do
child = spawn(GPIOIRQDevice, :irq_event_loop_init, [gpio, callback])
{:reply, child, gpio}
end
def irq_event_loop_init(gpio, callback) do
Circuits.GPIO.set_interrupts(gpio, :both)
irq_event_loop(gpio, callback)
end
def irq_event_loop(gpio, callback) do
receive do
{:circuits_gpio, pin, ts, status} ->
callback.(pin, ts, status)
irq_event_loop(gpio, callback)
"error" <> _ ->
irq_event_loop_init(gpio, callback)
msg ->
irq_event_loop(gpio, callback)
end
end
end