Packages

Use Elixir to replay radio signals on a Raspberry Pi on GPIO 4

Current section

Files

Jump to
replex lib replex.ex
Raw

lib/replex.ex

defmodule Replex do
@target Mix.target()
@spec replay(String.t, number, list) :: :ok | {:error, ArgumentError.t} | {:error, RuntimeError.t}
def replay(file, frequency, opts \\ []) do
with {:ok, file} <- validate_file(file),
{:ok, frequency} <- validate_frequency(frequency),
{_output, 0} <- do_replay(file, frequency, opts)
do
:ok
else
{output, 1} -> {:error, %RuntimeError{message: "sendiq failed: #{output}"}}
err -> {:error, err}
end
end
@spec sendiq :: binary
def sendiq() do
# Currently only have it working with RPI3. Sit tight, more coming soon...
Path.join(:code.priv_dir(:replex), "sendiq_#{@target}")
end
defp do_replay(file, frequency, opts) do
args = [
"-f", to_string(frequency),
"-t", Keyword.get(opts, :iq_type, :u8) |> to_string,
"-s", Keyword.get(opts, :sample_rate, 240_000) |> to_string,
"-i", file
]
System.cmd(sendiq(), args)
end
defp validate_file(file) when is_bitstring(file) do
if File.exists?(file) do
{:ok, file}
else
%RuntimeError{message: "file does not exist [#{file}]"}
end
end
defp validate_file(_file) do
%ArgumentError{message: "file must be a string"}
end
defp validate_frequency(frequency) when is_number(frequency) do
{:ok, frequency}
end
defp validate_frequency(_freq) do
%ArgumentError{message: "frequency must be a number"}
end
end