# ScenicDriverGPIO
Connect buttons and other things to GPIOs and turn them into
[Scenic](https://github.com/boydm/scenic) input events.
## Installation
he package can be installed by adding `scenic_driver_gpio` to your list of
dependencies in `mix.exs`:
```elixir
def deps do
[
{:scenic_driver_gpio, "~> 0.1"}
]
end
```
The docs can be found at
[https://hexdocs.pm/scenic_driver_gpio](https://hexdocs.pm/scenic_driver_gpio).
## Usage
ScenicDriverGPIO maps input events to high and low GPIO states. This is useful
when using GPIOs for buttons such as on a gamepad. The configuration for a
button requires the following parameters.
* pin - The GPIO pin to use as an input
* pull_mode - Connect or disconnect an internal pull-up or pull-down resistor to
the GPIO pin
* low - The scenic input event to trigger when the pin goes high to low
* high - The scenic input event to trigger when the pin goes from low to high
The following example configures the driver for use with the Adafruit OLED
Bonnet. See
[pinout.xyz/pinout/oled_bonnet](https://pinout.xyz/pinout/oled_bonnet) for GPIO
connections.
```elixir
config :nerves_game, :viewport, %{
name: :main_viewport,
# ...
drivers: [
%{
module: ScenicDriverGPIO,
opts: [
%{pin: 4, pull_mode: :pullup, low: {:key, {" ", :press, 0}}, high: {:key, {" ", :release, 0}}}, # Joystick press
%{pin: 17, pull_mode: :pullup, low: {:key, {"w", :press, 0}}, high: {:key, {"w", :release, 0}}}, # Joystick up
%{pin: 23, pull_mode: :pullup, low: {:key, {"d", :press, 0}}, high: {:key, {"d", :release, 0}}}, # Joystick right
%{pin: 22, pull_mode: :pullup, low: {:key, {"s", :press, 0}}, high: {:key, {"s", :release, 0}}}, # Joystick down
%{pin: 27, pull_mode: :pullup, low: {:key, {"a", :press, 0}}, high: {:key, {"a", :release, 0}}}, # Joystick left
%{pin: 5, pull_mode: :pullup, low: {:key, {"l", :press, 0}}, high: {:key, {"l", :release, 0}}}, # #5
%{pin: 6, pull_mode: :pullup, low: {:key, {"p", :press, 0}}, high: {:key, {"p", :release, 0}}}, # #6
]
}
]
```