Wafer is an Elixir library to make writing drivers for i2c and SPI connected peripherals and interacting with GPIO pins easier.
Find a file
2020-01-22 12:35:29 +13:00
config Don't use runtime checks to emit test env warning. 2020-01-08 15:16:14 +13:00
lib Add a confirmation test for set_bit with binary args. 2020-01-22 12:35:29 +13:00
test Registry doesn't support registering other processes. 2020-01-21 19:16:04 +13:00
.credo.exs Tested and working on a Raspberry Pi 4B with a Pi Sense Hat connected. 2019-12-30 20:37:34 +13:00
.formatter.exs Empty mix application. 2019-12-20 10:24:51 +13:00
.gitignore Add gitlab pages task with docs. 2020-01-07 09:53:58 +13:00
.gitlab-ci.yml Enable integration with a Pi4 with sense hat enabled. 2020-01-13 10:10:31 +13:00
LICENSE Add LICENSE 2020-01-06 02:20:06 +00:00
mix.exs Registry doesn't support registering other processes. 2020-01-21 19:16:04 +13:00
mix.lock Fix some minor boogs and update deps. 2020-01-14 10:42:28 +13:00
README.md Code gardening. 2020-01-08 10:18:38 +13:00

Wafer

Wafer is an OTP application that assists with writing drivers for peripherals using I2C, SPI and GPIO pins.

Wafer provides Elixir protocols for interacting with device registers and dealing with GPIO, so that you can use directly connected hardware GPIO pins or GPIO expanders such as the MCP23008 or the CD74HC595 SPI shift register.

Wafer implements the GPIO and Chip protocols for ElixirALE's GPIO and I2C drivers, Circuits.GPIO and Circuits.I2C. Implementing it for SPI should also be trivial, I just don't have any SPI devices to test with at the moment.

Documentation for the master branch can always be found here.

Working with registers

Wafer provides the very helpful Registers macros which allow you to quickly and easily define your registers for your device:

Here's a very simple example:

defmodule HTS221.Registers do
  use Wafer.Registers

  defregister(:ctrl_reg1, 0x20, :rw, 1)
  defregister(:humidity_out_l, 0x28, :ro, 1)
  defregister(:humidity_out_h, 0x29, :ro, 1)
end

defmodule HTS221 do
  import HTS221.Registers
  use Bitwise

  def humidity(conn) do
    with {:ok, <<msb>>} <- read_humidity_out_h(conn),
         {:ok, <<lsb>} <- read_humidity_out_l(conn),
         do: {:ok, msb <<< 8 + lsb}
  end

  def on?(conn) do
    case read_ctrl_reg1(conn) do
      {:ok, <<1::integer-size(1), _::bits>>} -> true
      _ -> false
    end
  end

  def turn_on(conn), do: write_ctrl_reg1(conn, <<1::integer-size(1), 0::integer-size(7)>>)
  def turn_off(conn), do: write_ctrl_reg1(conn, <<0>>)
end

Running the tests

I've included stub implementations of the parts of ElixirALE and Circuits that are interacted with by this project, so the tests should run and pass on machines without physical hardware interfaces. If you have a Raspberry Pi with a Pi Sense Hat connected you can run the tests with the SENSE_HAT_PRESENT=true environment variable set and it will perform integration tests with two of the sensors on this device.

Installation

If available in Hex, the package can be installed by adding wafer to your list of dependencies in mix.exs:

def deps do
  [
    {:wafer, "~> 0.1"}
  ]
end

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/wafer.