This commit is contained in:
James Harton 2019-12-13 15:15:21 +13:00
parent 4ed354aa1a
commit bc04167643
2 changed files with 19 additions and 12 deletions

View file

@ -432,8 +432,8 @@ defmodule PCA9641.Commands do
@doc """
Indicates the reasons for which an interrupt was generated (if any).
"""
@spec interrupt_name(pid) :: [interrupt_name()]
def interrupt_name(pid) do
@spec interrupt_reason(pid) :: [interrupt_name()]
def interrupt_reason(pid) do
value = Registers.interrupt_status(pid)
@interrupts
@ -456,16 +456,16 @@ defmodule PCA9641.Commands do
Enable the specified interrupts.
"""
@spec interrupt_enable(pid, :all | [interrupt_name()]) :: :ok | {:error, term}
def interrupt_enable(pid, :all) do
Registers.interrupt_mask(pid, 0x7F)
end
def interrupt_enable(pid, :all), do: Registers.interrupt_mask(pid, 0)
def interrupt_enable(pid, interrupts \\ []) do
def interrupt_enable(pid, :none), do: Registers.interrupt_mask(pid, 0x7F)
def interrupt_enable(pid, interrupts) when is_list(interrupts) do
mask =
@interrupts
|> Enum.reduce(0, fn {name, idx}, result ->
if Enum.contain?(interrupts, name),
do: set_bit(result, idx),
|> Enum.reduce(0x7F, fn {name, idx}, result ->
if Enum.member?(interrupts, name),
do: clear_bit(result, idx),
else: result
end)
@ -852,8 +852,11 @@ defmodule PCA9641.Commands do
end
defp get_bit(<<byte>>, bit), do: byte >>> bit &&& 1
defp set_bit(<<byte>>, bit), do: set_bit(byte, bit, 1)
defp set_bit(byte, bit), do: set_bit(byte, bit, 1)
defp set_bit(<<byte>>, bit, 1), do: byte ||| 1 <<< bit
defp set_bit(<<byte>>, bit, 1), do: set_bit(byte, bit, 1)
defp set_bit(<<byte>>, bit, 0), do: set_bit(byte, bit, 0)
defp set_bit(byte, bit, 1), do: byte ||| 1 <<< bit
defp set_bit(byte, bit, 0), do: clear_bit(byte, bit)
defp clear_bit(<<byte>>, bit), do: byte ||| ~~~(1 <<< bit)
end

View file

@ -51,15 +51,19 @@ defmodule PCA9641.Registers do
def mailbox(pid) do
lsb = read_register(pid, 6)
msb = read_register(pid, 7)
(msb <<< 8) + lsb
<<msb, lsb>>
end
def mailbox(pid, message) do
def mailbox(pid, message) when is_integer(message) do
msb = message >>> 8 &&& 0xFF
lsb = message &&& 0xFF
with :ok <- write_register(pid, 6, lsb), :ok <- write_register(pid, 7, msb), do: :ok
end
def mailbox(pid, <<msb::integer-size(8), lsb::integer-size(8)>>) do
with :ok <- write_register(pid, 6, lsb), :ok <- write_register(pid, 7, msb), do: :ok
end
defp read_register(pid, register, bytes \\ 1), do: I2C.write_read(pid, <<register>>, bytes)
defp write_register(pid, register, byte) when is_integer(byte),