defmodule Rclex do
alias Rclex.Nifs
require Logger
@moduledoc """
Defines functions to manage ROS client resources.
"""
@doc """
Initialize Rclex, return initialized context.
"""
@spec rclexinit() :: Nifs.rcl_context()
def rclexinit() do
children = [Rclex.ResourceServer]
opts = [strategy: :one_for_one, name: :resource_server]
Supervisor.start_link(children, opts)
get_initialized_context()
end
@spec get_initialized_context() :: Nifs.rcl_context()
defp get_initialized_context() do
init_op = Nifs.rcl_get_zero_initialized_init_options()
context = Nifs.rcl_get_zero_initialized_context()
Nifs.rcl_init_options_init(init_op)
Nifs.rcl_init_with_null(init_op, context)
Nifs.rcl_init_options_fini(init_op)
context
end
@doc """
ユーザのタスク終了入力を受け付けるAPI.
0を入力するとchildに渡されたPIDのタスクを終了する
"""
def waiting_input(sv, child) do
num =
IO.gets("")
|> String.replace("\n", "")
|> String.to_integer()
case num do
0 -> Rclex.Timer.terminate(sv, child)
_ -> waiting_input(sv, child)
end
end
@doc """
Shutdown Rclex,
this function does not have to be called on exit,
but does have to be called making a repeat call to rclexinit.
"""
@spec shutdown(context :: reference()) :: {:ok, Nifs.rcl_ret()}
def shutdown(context) when is_reference(context) do
Supervisor.stop(:resource_server)
Nifs.rcl_shutdown(context)
end
@doc """
Return a properly initialized allocator with default values.
"""
@spec get_default_allocator :: Nifs.rcl_allocator()
def get_default_allocator do
Nifs.rcl_get_default_allocator()
end
end