defmodule Rclex do alias Rclex.Nifs require Logger @moduledoc """ T.B.A """ # ------------------------ユーザAPI群------------------- @doc """ Rclex初期化 RCLのコンテキストを有効化 """ def rclexinit 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) children = [ Rclex.ResourceServer ] opts = [strategy: :one_for_one, name: :resource_server] Supervisor.start_link(children, opts) context end @doc """ ノード間通信に用いるメッセージの初期化 :int16 """ def initialize_msg do Nifs.create_empty_string() |> Nifs.string_init() end @doc """ ノード間通信に用いるメッセージの初期化 :stringであればstring型が使えるようにする(現在使用可能な型) """ def initialize_msgs(msg_count, :string) do Enum.map(1..msg_count, fn _ -> initialize_msg() end) end # TODO: :int16であればInt16型が使えるようにする(目標) def initialize_msgs(msg_count, :int16) do Enum.map(1..msg_count, fn _ -> Nifs.create_empty_int16() end) end @doc """ メッセージからstringデータを取得する """ def readdata_string(msg) do Nifs.readdata_string(msg) end @doc """ メッセージにデータをセットする 現在はstring型のみのサポートになっている """ def setdata(msg, data, :string) do data_size = String.length(data) Nifs.setdata_string(msg, String.to_charlist(data), data_size + 1) 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 """ Rclexの終了 """ def shutdown(context) do Supervisor.stop(:resource_server) Nifs.rcl_shutdown(context) end def get_default_allocator do Nifs.rcl_get_default_allocator() end end