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