[openrtm-commit:03082] r3168 - branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm
openrtm @ openrtm.org
openrtm @ openrtm.org
2018年 1月 19日 (金) 16:42:05 JST
Author: miyamoto
Date: 2018-01-19 16:42:05 +0900 (Fri, 19 Jan 2018)
New Revision: 3168
Added:
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/CORBA_RTCUtil.cpp
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/CORBA_RTCUtil.h
Modified:
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/Makefile.am
branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/NamingManager.cpp
Log:
[incompat,->RELENG_1_2] refs #3270
Added: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/CORBA_RTCUtil.cpp
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/CORBA_RTCUtil.cpp (rev 0)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/CORBA_RTCUtil.cpp 2018-01-19 07:42:05 UTC (rev 3168)
@@ -0,0 +1,1494 @@
+// -*- C++ -*-
+/*!
+ * @file CORBA_RTCUtil.h
+ * @brief CORBA RTC utility
+ * @date $Date$
+ * @author Noriaki Ando <n-ando at aist.go.jp>
+ *
+ * Copyright (C) 2015
+ * Intelligent Systems Research Institute,
+ * National Institute of
+ * Advanced Industrial Science and Technology (AIST), Japan
+ * All rights reserved.
+ *
+ * $Id$
+ *
+ */
+
+
+
+#include <rtm/CORBA_RTCUtil.h>
+#include <rtm/NamingManager.h>
+
+namespace CORBA_RTCUtil
+{
+
+ /*!
+ * @if jp
+ * @brief コンポーネントのプロパティ取得
+ * @param rtc RTコンポーネント
+ * @return コンポーネントのプロパティ
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::Properties get_component_profile(const RTC::RTObject_ptr rtc)
+ {
+ coil::Properties prop;
+ if (CORBA::is_nil(rtc)) { return prop; }
+ RTC::ComponentProfile_var prof;
+ prof = rtc->get_component_profile();
+ NVUtil::copyToProperties(prop, prof->properties);
+ return prop;
+ }
+ /*!
+ * @if jp
+ * @brief コンポーネントのオブジェクトリファレンスが存在しているかを判定
+ * @param rtc RTコンポーネント
+ * @return True:生存、False:終了済み
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ bool is_existing(const RTC::RTObject_ptr rtc)
+ {
+ try
+ {
+ if (rtc->_non_existent())
+ {
+ return false;
+ }
+ return true;
+ }
+ catch (...)
+ {
+ return false;
+ }
+ }
+ /*!
+ * @if jp
+ * @brief RTCがデフォルトの実行コンテキストでalive状態かを判定する
+ * @param rtc RTコンポーネント
+ * @return True:alive状態
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ bool is_alive_in_default_ec(const RTC::RTObject_ptr rtc)
+ {
+ RTC::ExecutionContext_var ec = get_actual_ec(rtc);
+ if (CORBA::is_nil(ec))
+ {
+ return false;
+ }
+ return rtc->is_alive(ec);
+
+ }
+
+
+ /*!
+ * @if jp
+ * @brief RTコンポーネントに関連付けした実行コンテキストから指定したIDの実行コンテキストを取得
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return 実行コンテキストのオブジェクトリファレンス
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ RTC::ExecutionContext_var get_actual_ec(const RTC::RTObject_ptr rtc,
+ RTC::UniqueId ec_id)
+ {
+ if (CORBA::is_nil(rtc)) { return RTC::ExecutionContext::_nil(); }
+ if (ec_id < 1000) // owned EC
+ {
+ RTC::ExecutionContextList_var eclist;
+ eclist = rtc->get_owned_contexts();
+ if (ec_id >= (CORBA::Long)eclist->length())
+ { return RTC::ExecutionContext::_nil(); }
+ if (CORBA::is_nil(eclist[ec_id]))
+ { return RTC::ExecutionContext::_nil(); }
+ return eclist[ec_id];
+ }
+ if (ec_id >= 1000)
+ {
+ RTC::UniqueId pec_id(ec_id - 1000);
+ RTC::ExecutionContextList_var eclist;
+ eclist = rtc->get_participating_contexts();
+ if (pec_id >= (CORBA::Long)eclist->length())
+ { return RTC::ExecutionContext::_nil(); }
+ if (CORBA::is_nil(eclist[pec_id]))
+ { return RTC::ExecutionContext::_nil(); }
+ return eclist[pec_id];
+ }
+ return RTC::ExecutionContext::_nil();
+ }
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントから指定した実行コンテキストのIDを取得する
+ * @param rtc RTコンポーネント
+ * @param ec 実行コンテキスト
+ * @return 実行コンテキストのID
+ * 指定した実行コンテキストがRTコンポーネントに関連付けられていなかった場合は-1を返す
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec
+ * @return
+ * @endif
+ */
+ RTC::UniqueId get_ec_id(const RTC::RTObject_ptr rtc, const RTC::ExecutionContext_ptr ec)
+ {
+ if (CORBA::is_nil(rtc))
+ {
+ return -1;
+ }
+ if (CORBA::is_nil(ec))
+ {
+ return -1;
+ }
+
+ RTC::ExecutionContextList eclist_own = (*rtc->get_owned_contexts());
+
+
+ for (unsigned int i = 0; i < eclist_own.length(); i++)
+ {
+ if (!CORBA::is_nil(eclist_own[i]))
+ {
+ if (eclist_own[i]->_is_equivalent(ec))
+ {
+ return i;
+ }
+ }
+ }
+
+ RTC::ExecutionContextList eclist_pec = (*rtc->get_participating_contexts());
+
+
+ for (unsigned int i = 0; i < eclist_pec.length(); i++)
+ {
+ if (!CORBA::is_nil(eclist_pec[i]))
+ {
+ if (eclist_pec[i]->_is_equivalent(ec))
+ {
+ return i + ECOTHER_OFFSET;
+ }
+ }
+ }
+ return -1;
+ }
+
+ /*!
+ * @if jp
+ * @brief RTCを指定した実行コンテキストでアクティベーションする
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return RTC、ECのオブジェクトリファレンスがnilの場合はBAD_PARAMETERを返す
+ * nilではない場合はactivate_component関数の戻り値を返す。RTC_OKの場合はアクティベーションが成功
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t activate(RTC::RTObject_ptr rtc, RTC::UniqueId ec_id)
+ {
+ if (CORBA::is_nil(rtc)) { return RTC::BAD_PARAMETER; }
+ RTC::ExecutionContext_var ec = get_actual_ec(rtc, ec_id);
+ if (CORBA::is_nil(ec)) { return RTC::BAD_PARAMETER; }
+ return ec->activate_component(rtc);
+ }
+
+ /*!
+ * @if jp
+ * @brief RTCを指定した実行コンテキストで非アクティベーションする
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return RTC、ECのオブジェクトリファレンスがnilの場合はBAD_PARAMETERを返す
+ * nilではない場合はdeactivate_component関数の戻り値を返す。RTC_OKの場合は非アクティベーションが成功
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t deactivate(RTC::RTObject_ptr rtc, RTC::UniqueId ec_id)
+ {
+ if (CORBA::is_nil(rtc)) { return RTC::BAD_PARAMETER; }
+ RTC::ExecutionContext_var ec = get_actual_ec(rtc, ec_id);
+ if (CORBA::is_nil(ec)) { return RTC::BAD_PARAMETER; }
+ return ec->deactivate_component(rtc);
+ }
+
+ /*!
+ * @if jp
+ * @brief RTCを指定した実行コンテキストでリセットする
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return RTC、ECのオブジェクトリファレンスがnilの場合はBAD_PARAMETERを返す
+ * nilではない場合はreset_component関数の戻り値を返す。RTC_OKの場合はリセットが成功
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t reset(RTC::RTObject_ptr rtc, RTC::UniqueId ec_id)
+ {
+ if (CORBA::is_nil(rtc)) { return RTC::BAD_PARAMETER; }
+ RTC::ExecutionContext_var ec = get_actual_ec(rtc, ec_id);
+ if (CORBA::is_nil(ec)) { return RTC::BAD_PARAMETER; }
+ return ec->reset_component(rtc);
+ }
+
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントの指定した実行コンテキストでの状態を取得
+ * @param state RTCの状態
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return rtc、ecがnilの場合はFalseを返す。
+ * nilではない場合はstateに状態を代入してTrueを返す。
+ * @else
+ * @brief
+ * @param state
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ bool get_state(RTC::LifeCycleState &state, const RTC::RTObject_ptr rtc, RTC::UniqueId ec_id)
+ {
+ if (CORBA::is_nil(rtc))
+ {
+ return false;
+ }
+ RTC::ExecutionContext_var ec = get_actual_ec(rtc, ec_id);
+ if (CORBA::is_nil(ec))
+ {
+ return false;
+ }
+ state = ec->get_component_state(rtc);
+
+ return true;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントの指定した実行コンテキストでINACTIVE状態かどうか判定
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return INACTIVE状態の時はTrue、それ以外はFalse
+ * rtc、ecがnilの場合もFalseを返す
+ * @else
+ * @brief
+ * @param state
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ bool is_in_inactive(const RTC::RTObject_ptr rtc, RTC::UniqueId ec_id)
+ {
+ RTC::LifeCycleState state = RTC::CREATED_STATE;
+ if (get_state(state, rtc, ec_id))
+ {
+ if (state == RTC::INACTIVE_STATE)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントの指定した実行コンテキストでACTIVE状態かどうか判定
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return ACTIVE状態の時はTrue、それ以外はFalse
+ * rtc、ecがnilの場合もFalseを返す
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ bool is_in_active(const RTC::RTObject_ptr rtc, RTC::UniqueId ec_id)
+ {
+ RTC::LifeCycleState state = RTC::CREATED_STATE;
+ if (get_state(state, rtc, ec_id))
+ {
+ if (state == RTC::ACTIVE_STATE)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントの指定した実行コンテキストでERROR状態かどうか判定
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return ERROR状態の時はTrue、それ以外はFalse
+ * rtc、ecがnilの場合もFalseを返す
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ bool is_in_error(const RTC::RTObject_ptr rtc, RTC::UniqueId ec_id)
+ {
+ RTC::LifeCycleState state = RTC::CREATED_STATE;
+ if (get_state(state, rtc, ec_id))
+ {
+ if (state == RTC::ERROR_STATE)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+
+ /*!
+ * @if jp
+ * @brief RTCのデフォルトの実行コンテキストの実行周期を取得する
+ * @param rtc RTコンポーネント
+ * @return 実行周期
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ CORBA::Double get_default_rate(const RTC::RTObject_ptr rtc)
+ {
+ RTC::ExecutionContext_var ec = get_actual_ec(rtc);
+ return ec->get_rate();
+ }
+
+
+ /*!
+ * @if jp
+ * @brief RTCのデフォルトの実行コンテキストの実行周期を設定する
+ * @param rtc RTコンポーネント
+ * @param rate 実行周期
+ * @return set_rate関数の戻り値を返す。
+ * RTC_OKで設定が成功
+ * @else
+ * @brief
+ * @param rtc
+ * @param rate
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t set_default_rate(RTC::RTObject_ptr rtc, const CORBA::Double rate)
+ {
+ RTC::ExecutionContext_var ec = get_actual_ec(rtc);
+ return ec->set_rate(rate);
+ }
+
+
+ /*!
+ * @if jp
+ * @brief RTCの指定IDの実行コンテキストの周期を取得
+ * @param rtc RTコンポーネント
+ * @param ec_id 指定の実行コンテキストのID
+ * @return 実行周期
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ CORBA::Double get_current_rate(const RTC::RTObject_ptr rtc, RTC::UniqueId ec_id)
+ {
+ RTC::ExecutionContext_var ec = get_actual_ec(rtc, ec_id);
+ return ec->get_rate();
+ }
+
+ /*!
+ * @if jp
+ * @brief RTCの指定IDの実行コンテキストの周期を設定
+ * @param rtc RTコンポーネント
+ * @param ec_id 指定の実行コンテキストのID
+ * @param rate 実行周期
+ * @return set_rate関数の戻り値を返す。
+ * RTC_OKで設定が成功
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @param rate
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t set_current_rate(RTC::RTObject_ptr rtc, RTC::UniqueId ec_id, const CORBA::Double rate)
+ {
+ RTC::ExecutionContext_var ec = get_actual_ec(rtc, ec_id);
+ return ec->set_rate(rate);
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCのデフォルトの実行コンテキストに指定のRTCを関連付ける
+ * @param localcomp 対象のRTコンポーネント
+ * @param othercomp 実行コンテキストに関連付けるRTコンポーネント
+ * @return ecの取得に失敗した場合はBAD_PARAMETERを返す
+ * そうでない場合はaddComponent関数の戻り値を返す。RTC_OKで接続成功。
+ * @else
+ * @brief
+ * @param localcomp
+ * @param othercomp
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t add_rtc_to_default_ec(const RTC::RTObject_ptr localcomp, const RTC::RTObject_ptr othercomp)
+ {
+ if (CORBA::is_nil(othercomp))
+ {
+ return RTC::BAD_PARAMETER;
+ }
+ RTC::ExecutionContext_var ec = get_actual_ec(localcomp);
+ if (CORBA::is_nil(ec))
+ {
+ return RTC::BAD_PARAMETER;
+ }
+ return ec->add_component(othercomp);
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCのデフォルトの実行コンテキストの指定のRTCへの関連付けを解除する
+ * @param localcomp 対象のRTコンポーネント
+ * @param othercomp 実行コンテキストとの関連付けを解除するRTコンポーネント
+ * @return ecの取得に失敗した場合はBAD_PARAMETERを返す
+ * そうでない場合はremoveComponent関数の戻り値を返す。RTC_OKで解除成功。
+ * @else
+ * @brief
+ * @param localcomp
+ * @param othercomp
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t remove_rtc_to_default_ec(const RTC::RTObject_ptr localcomp, const RTC::RTObject_ptr othercomp)
+ {
+ {
+ if (CORBA::is_nil(othercomp))
+ {
+ return RTC::BAD_PARAMETER;
+ }
+ RTC::ExecutionContext_var ec = get_actual_ec(localcomp);
+ if (CORBA::is_nil(ec))
+ {
+ return RTC::BAD_PARAMETER;
+ }
+ return ec->remove_component(othercomp);
+ }
+ }
+
+
+ /*!
+ * @if jp
+ * @brief RTCのデフォルトの実行コンテキストに参加しているRTCのリストを取得する
+ * 実行コンテキストがnilの場合は空のリストを返す
+ * @param rtc 対象のRTコンポーネント
+ * @return RTCのリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ const RTC::RTCList get_participants_rtc(const RTC::RTObject_ptr rtc)
+ {
+ RTC::ExecutionContext_var ec = get_actual_ec(rtc);
+ if (CORBA::is_nil(ec))
+ {
+ return RTC::RTCList();
+ }
+ try
+ {
+ RTC::ExecutionContextService_ptr ecservice = RTC::ExecutionContextService::_narrow(ec);
+ RTC::ExecutionContextProfile* profile = ecservice->get_profile();
+ return profile->participants;
+ }
+ catch (...)
+ {
+ return RTC::RTCList();
+ }
+ }
+
+
+
+ /*!
+ * @if jp
+ * @brief 指定したRTCの保持するポートの名前を取得
+ * @param rtc 対象のRTコンポーネント
+ * @return ポート名のリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::vstring get_port_names(const RTC::RTObject_ptr rtc)
+ {
+ coil::vstring names;
+ if (CORBA::is_nil(rtc))
+ {
+ return names;
+ }
+ RTC::PortServiceList ports = (*rtc->get_ports());
+
+ for (unsigned int i = 0; i < ports.length(); i++)
+ {
+ RTC::PortProfile* pp = ports[i]->get_port_profile();
+ std::string s = pp->name;
+ names.push_back(s);
+ }
+ return names;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 指定したRTCの保持するインポートの名前を取得
+ * @param rtc 対象のRTコンポーネント
+ * @return ポート名のリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::vstring get_inport_names(const RTC::RTObject_ptr rtc)
+ {
+ coil::vstring names;
+ if (CORBA::is_nil(rtc))
+ {
+ return names;
+ }
+ RTC::PortServiceList ports = (*rtc->get_ports());
+
+ for (unsigned int i = 0; i < ports.length(); i++)
+ {
+ RTC::PortProfile* pp = ports[i]->get_port_profile();
+ coil::Properties prop;
+ NVUtil::copyToProperties(prop, pp->properties);
+
+ if (prop["port.port_type"] == "DataInPort")
+ {
+ std::string s = pp->name;
+ names.push_back(s);
+ }
+
+ }
+ return names;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 指定したRTCの保持するアウトポートの名前を取得
+ * @param rtc 対象のRTコンポーネント
+ * @return ポート名のリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::vstring get_outport_names(const RTC::RTObject_ptr rtc)
+ {
+ coil::vstring names;
+ if (CORBA::is_nil(rtc))
+ {
+ return names;
+ }
+ RTC::PortServiceList ports = (*rtc->get_ports());
+
+ for (unsigned int i = 0; i < ports.length(); i++)
+ {
+ RTC::PortProfile* pp = ports[i]->get_port_profile();
+ coil::Properties prop;
+ NVUtil::copyToProperties(prop, pp->properties);
+
+ if (prop["port.port_type"] == "DataOutPort")
+ {
+ std::string s = pp->name;
+ names.push_back(s);
+ }
+
+ }
+ return names;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 指定したRTCの保持するサービスポートの名前を取得
+ * @param rtc 対象のRTコンポーネント
+ * @return ポート名のリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::vstring get_svcport_names(const RTC::RTObject_ptr rtc)
+ {
+ coil::vstring names;
+ if (CORBA::is_nil(rtc))
+ {
+ return names;
+ }
+ RTC::PortServiceList ports = (*rtc->get_ports());
+
+ for (unsigned int i = 0; i < ports.length(); i++)
+ {
+ RTC::PortProfile* pp = ports[i]->get_port_profile();
+ coil::Properties prop;
+ NVUtil::copyToProperties(prop, pp->properties);
+
+ if (prop["port.port_type"] == "CorbaPort")
+ {
+ std::string s = pp->name;
+ names.push_back(s);
+ }
+
+ }
+ return names;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 指定したポートの保持しているコネクタの名前のリストを取得
+ * @param port 対象のポート
+ * @return コネクタ名のリスト
+ * @else
+ * @brief
+ * @param port
+ * @return
+ * @endif
+ */
+ coil::vstring get_connector_names(const RTC::PortService_ptr port)
+ {
+ coil::vstring names;
+ if (CORBA::is_nil(port))
+ {
+ return names;
+ }
+ RTC::ConnectorProfileList conprof = (*port->get_connector_profiles());
+ for (unsigned int i = 0; i < conprof.length(); i++)
+ {
+ names.push_back(std::string(conprof[i].name));
+ }
+ return names;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCの指定したポートのコネクタの名前のリストを取得
+ * @param rtc 対象のRTコンポーネント
+ * @param port_name ポート名
+ * @return コネクタ名のリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @param port_name
+ * @return
+ * @endif
+ */
+ coil::vstring get_connector_names(const RTC::RTObject_ptr rtc, const std::string port_name)
+ {
+ coil::vstring names;
+ RTC::PortService_var port = get_port_by_name(rtc, port_name);
+ if (CORBA::is_nil(port))
+ {
+ return names;
+ }
+ RTC::ConnectorProfileList conprof = (*port->get_connector_profiles());
+ for (unsigned int i = 0; i < conprof.length(); i++)
+ {
+ names.push_back(std::string(conprof[i].name));
+ }
+ return names;
+ }
+
+ /*!
+ * @if jp
+ * @brief 指定したポートの保持しているコネクタのIDのリストを取得
+ * @param port 対象のポート
+ * @return コネクタのIDのリスト
+ * @else
+ * @brief
+ * @param port
+ * @return
+ * @endif
+ */
+ coil::vstring get_connector_ids(const RTC::PortService_ptr port)
+ {
+ coil::vstring names;
+ if (CORBA::is_nil(port))
+ {
+ return names;
+ }
+ RTC::ConnectorProfileList conprof = (*port->get_connector_profiles());
+ for (unsigned int i = 0; i < conprof.length(); i++)
+ {
+ names.push_back(std::string(conprof[i].connector_id));
+ }
+ return names;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCの指定したポートのコネクタのIDのリストを取得
+ * @param port RTコンポーネント
+ * @param port_name ポート名
+ * @return コネクタのIDのリスト
+ * @else
+ * @brief
+ * @param port
+ * @param port_name
+ * @return
+ * @endif
+ */
+ coil::vstring get_connector_ids(const RTC::RTObject_ptr rtc, const std::string port_name)
+ {
+ coil::vstring names;
+ RTC::PortService_var port = get_port_by_name(rtc, port_name);
+ if (CORBA::is_nil(port))
+ {
+ return names;
+ }
+ RTC::ConnectorProfileList conprof = (*port->get_connector_profiles());
+ for (unsigned int i = 0; i < conprof.length(); i++)
+ {
+ names.push_back(std::string(conprof[i].connector_id));
+ }
+ return names;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 指定したポートを接続するためのコネクタプロファイルを取得
+ * @param name コネクタ名
+ * @param prop_arg 設定
+ * @param port0 対象のポート1
+ * @param port1 対象のポート2
+ * @return コネクタプロファイル
+ * @else
+ * @brief
+ * @param name
+ * @param prop_arg
+ * @param port0
+ * @param port1
+ * @return
+ * @endif
+ */
+ RTC::ConnectorProfile_var create_connector(const std::string name,
+ const coil::Properties prop_arg,
+ const RTC::PortService_ptr port0,
+ const RTC::PortService_ptr port1)
+ {
+ coil::Properties prop = prop_arg;
+ RTC::ConnectorProfile_var conn_prof = new RTC::ConnectorProfile();
+ std::string prof_name;
+ conn_prof->name = CORBA::string_dup(name.c_str());
+ conn_prof->connector_id = CORBA::string_dup("");
+ conn_prof->ports.length(2);
+ conn_prof->ports[0] = RTC::PortService::_duplicate(port0);
+ conn_prof->ports[1] = RTC::PortService::_duplicate(port1);
+ if (prop["dataport.dataflow_type"].empty())
+ {
+ prop["dataport.dataflow_type"] = "push";
+ }
+ if (prop["dataport.interface_type"].empty())
+ {
+ prop["dataport.interface_type"] ="corba_cdr";
+ }
+ NVUtil::copyFromProperties(conn_prof->properties, prop);
+ return conn_prof._retn();
+ }
+
+ /*!
+ * @if jp
+ * @brief 指定したポート同士が接続されているかを判定
+ * @param port0 対象のポート1
+ * @param port1 対象のポート2
+ * @return True: 接続済み、False: 未接続
+ * @else
+ * @brief
+ * @param port0
+ * @param port1
+ * @return
+ * @endif
+ */
+ bool already_connected(const RTC::PortService_ptr localport,
+ const RTC::PortService_ptr otherport)
+ {
+ RTC::ConnectorProfileList_var conprof;
+ conprof = localport->get_connector_profiles();
+ for (CORBA::ULong i(0); i < conprof->length(); ++i)
+ {
+ for (CORBA::ULong j(0); j < conprof[i].ports.length(); ++j)
+ {
+ if (conprof[i].ports[j]->_is_equivalent(otherport))
+ {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /*!
+ * @if jp
+ * @brief 指定したポートを接続する
+ * @param name コネクタ名
+ * @param prop 設定
+ * @param port0 対象のポート1
+ * @param port1 対象のポート2
+ * @return ポートのオブジェクトリファレンスがnilの場合はBAD_PARAMETERを返す
+ * nilではない場合はport0.connect関数の戻り値を返す。RTC_OKの場合は接続が成功
+ * @else
+ * @brief
+ * @param name
+ * @param prop
+ * @param port0
+ * @param port1
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t connect(const std::string name,
+ const coil::Properties prop,
+ const RTC::PortService_ptr port0,
+ const RTC::PortService_ptr port1)
+ {
+ if (CORBA::is_nil(port0)) { return RTC::BAD_PARAMETER; }
+ if (CORBA::is_nil(port1)) { return RTC::BAD_PARAMETER; }
+ if (port0->_is_equivalent(port1)) { return RTC::BAD_PARAMETER; }
+ RTC::ConnectorProfile_var cprof;
+ cprof = create_connector(name, prop, port0, port1);
+ return port0->connect(cprof);
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCの指定したポートのコネクタのIDのリストを取得
+ * @param port RTコンポーネント
+ * @param port_name ポート名
+ * @return コネクタのIDのリスト
+ * @else
+ * @brief
+ * @param port
+ * @param port_name
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect(RTC::ConnectorProfile connector_prof)
+ {
+ RTC::PortServiceList ports = connector_prof.ports;
+ return disconnect_connector_id(ports[0], std::string(connector_prof.connector_id));
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象のポートで指定した名前のコネクタを切断
+ * @param port_ref 対象のポート
+ * @param conn_name コネクタ名
+ * @return portがnilの場合はBAD_PARAMETERを返す
+ * nilではない場合はdisconnect関数の戻り値を返す。RTC_OKの場合は切断が成功
+ * @else
+ * @brief
+ * @param port_ref
+ * @param conn_name
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_connector_name(const RTC::PortService_ptr port_ref, const std::string conn_name)
+ {
+ if (CORBA::is_nil(port_ref))
+ {
+ return RTC::BAD_PARAMETER;
+ }
+
+ RTC::ConnectorProfileList conprof = (*port_ref->get_connector_profiles());
+ for (unsigned int i = 0; i < conprof.length(); i++)
+ {
+ if (std::string(conprof[i].name) == conn_name)
+ {
+ return disconnect(conprof[i]);
+ }
+ }
+ return RTC::BAD_PARAMETER;
+ }
+
+
+
+ /*!
+ * @if jp
+ * @brief 対象の名前のポートで指定した名前のコネクタを切断
+ * @param port_name 対象のポート名
+ * @param conn_name コネクタ名
+ * @return portが存在しない場合はBAD_PARAMETERを返す
+ * nilではない場合はdisconnect関数の戻り値を返す。RTC_OKの場合は切断が成功
+ * @else
+ * @brief
+ * @param port_name
+ * @param conn_name
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_connector_name(const std::string port_name, const std::string conn_name)
+ {
+ RTC::PortService_var port_ref = get_port_by_url(port_name);
+ if (CORBA::is_nil(port_ref))
+ {
+ return RTC::BAD_PARAMETER;
+ }
+
+ RTC::ConnectorProfileList conprof = (*port_ref->get_connector_profiles());
+ for (unsigned int i = 0; i < conprof.length(); i++)
+ {
+ if (std::string(conprof[i].name) == conn_name)
+ {
+ return disconnect(conprof[i]);
+ }
+ }
+ return RTC::BAD_PARAMETER;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象のポートで指定したIDのコネクタを切断
+ * @param port 対象のポート
+ * @param name コネクタID
+ * @return portが存在しない場合はBAD_PARAMETERを返す
+ * nilではない場合はdisconnect関数の戻り値を返す。RTC_OKの場合は切断が成功
+ * @else
+ * @brief
+ * @param port
+ * @param name
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_connector_id(const RTC::PortService_ptr port_ref, const std::string conn_id)
+ {
+ if (CORBA::is_nil(port_ref))
+ {
+ return RTC::BAD_PARAMETER;
+ }
+
+ return port_ref->disconnect(conn_id.c_str());
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象の名前のポートで指定したIDのコネクタを切断
+ * @param port 対象のポート
+ * @param name コネクタID
+ * @return portが存在しない場合はBAD_PARAMETERを返す
+ * nilではない場合はdisconnect関数の戻り値を返す。RTC_OKの場合は切断が成功
+ * @else
+ * @brief
+ * @param port
+ * @param name
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_connector_id(const std::string port_name, const std::string conn_id)
+ {
+ RTC::PortService_var port_ref = get_port_by_url(port_name);
+ if (CORBA::is_nil(port_ref))
+ {
+ return RTC::BAD_PARAMETER;
+ }
+
+ return port_ref->disconnect(conn_id.c_str());
+ }
+
+ /*!
+ * @if jp
+ * @brief 対象のポートのコネクタを全て切断
+ * @param port_ref ポートのオブジェクトリファレンス
+ * @return portが存在しない場合はBAD_PARAMETERを返す
+ * 切断できた場合はRTC_OKを返す
+ * @else
+ * @brief
+ * @param port_ref
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_all(const RTC::PortService_ptr port_ref)
+ {
+ if (CORBA::is_nil(port_ref))
+ {
+ return RTC::BAD_PARAMETER;
+ }
+
+ return port_ref->disconnect_all();
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 指定ポート名のポートのコネクタを全て切断
+ * @param port_name ポート名
+ * @return portが存在しない場合はBAD_PARAMETERを返す
+ * 切断できた場合はRTC_OKを返す
+ * @else
+ * @brief
+ * @param port_ref
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_all(const std::string port_name)
+ {
+ RTC::PortService_var port_ref = get_port_by_url(port_name);
+ if (CORBA::is_nil(port_ref))
+ {
+ return RTC::BAD_PARAMETER;
+ }
+
+ return port_ref->disconnect_all();
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 指定した名前のポートを取得
+ * @param port_name ポート名
+ * @return ポートのオブジェクトリファレンス
+ * portが存在しない場合はnilを返す
+ * @else
+ * @brief
+ * @param port_ref
+ * @return
+ * @endif
+ */
+ RTC::PortService_var get_port_by_url(std::string port_name)
+ {
+ RTC::Manager& mgr = RTC::Manager::instance();
+ RTC::NamingManager* nm = mgr.getNaming();
+ coil::vstring p = coil::split(port_name, ".");
+ if (p.size() < 2)
+ {
+ return RTC::PortService::_nil();
+ }
+ std::string rtc_name = port_name;
+ coil::replaceString(rtc_name, "." + p.back(), "");
+ RTC::RTCList rtcs = nm->string_to_component(rtc_name);
+
+ if (rtcs.length() < 1)
+ {
+ return RTC::PortService::_nil();
+ }
+ coil::vstring pn = coil::split(port_name, "/");
+
+ return get_port_by_name(rtcs[0], pn.back());
+ }
+
+ /*!
+ * @if jp
+ * @brief 対象ポートと接続しているポートで指定したポート名と一致した場合に切断
+ * @param localport 対象のポート
+ * @param othername 接続しているポート名
+ * @return ポートがnilの場合、localportの名前とothernameが一致する場合、接続しているポートの名前でothernameと一致するものがない場合にBAD_PARAMETERを返す
+ * 上記の条件に当てはまらない場合はdisconnect関数の戻り値を返す。RTC_OKの場合は切断が成功
+ * @else
+ * @brief
+ * @param localport
+ * @param othername
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_name(const RTC::PortService_ptr localport, const std::string othername)
+ {
+ if (CORBA::is_nil(localport))
+ {
+ return RTC::BAD_PARAMETER;
+ }
+ RTC::PortProfile* prof = localport->get_port_profile();
+
+ if (std::string(prof->name) == othername)
+ {
+ return RTC::BAD_PARAMETER;
+ }
+
+ RTC::ConnectorProfileList conprof = (*localport->get_connector_profiles());
+
+ for (unsigned int i = 0; i < conprof.length(); i++)
+ {
+ for (unsigned int j = 0; j < conprof[i].ports.length(); j++)
+ {
+ if (!CORBA::is_nil(conprof[i].ports[j]))
+ {
+ RTC::PortProfile* pp = conprof[i].ports[j]->get_port_profile();
+ if (std::string(pp->name) == othername)
+ {
+ return disconnect(conprof[i]);
+ }
+ }
+ }
+ }
+ return RTC::BAD_PARAMETER;
+ }
+ /*!
+ * @if jp
+ * @brief 指定したポートと指定したリスト内のポート全てと接続する
+ * @param name コネクタ名
+ * @param prop 設定
+ * @param port 対象のポート
+ * @param target_ports 対象のポートのリスト
+ * @return 全ての接続が成功した場合はRTC_OKを返す。
+ * connect関数がRTC_OK以外を返した場合はBAD_PARAMETERを返す。
+ * @else
+ * @brief
+ * @param name
+ * @param prop
+ * @param port0
+ * @param port1
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t connect_multi(const std::string name,
+ const coil::Properties prop,
+ const RTC::PortService_ptr port,
+ RTC::PortServiceList_var& target_ports)
+ {
+ RTC::ReturnCode_t ret(RTC::RTC_OK);
+ for (CORBA::ULong i(0); i < target_ports->length(); ++i)
+ {
+ if (target_ports[i]->_is_equivalent(port)) { continue; }
+ if (CORBA_RTCUtil::already_connected(port, target_ports[i]))
+ { continue; }
+ if (RTC::RTC_OK !=
+ CORBA_RTCUtil::connect(name, prop, port, target_ports[i]))
+ {
+ ret = RTC::RTC_ERROR;
+ }
+ }
+ return ret;
+ }
+ /*!
+ * @if jp
+ * @brief 対象のポートの名前と指定したポート名が一致するか判定
+ * @param p 対象のポート
+ * @return True: 名前が一致、False: 名前が不一致
+ * @else
+ * @brief
+ * @param p
+ * @return
+ * @endif
+ */
+ bool find_port::operator()(RTC::PortService_var p)
+ {
+ RTC::PortProfile_var prof = p->get_port_profile();
+ std::string c(CORBA::string_dup(prof->name));
+ return (m_name == c) ? true : false;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCから指定した名前のポートを取得
+ * @param rtc RTコンポーネント
+ * @param port_name ポート名
+ * @return ポート
+ * @else
+ * @brief
+ * @param rtc
+ * @param port_name
+ * @return
+ * @endif
+ */
+ RTC::PortService_var get_port_by_name(const RTC::RTObject_ptr rtc,
+ std::string name)
+ {
+ RTC::PortServiceList_var ports = rtc->get_ports();
+ RTC::PortService_var port_var;
+ for (size_t p(0); p < ports->length(); ++p)
+ {
+ RTC::PortProfile_var pp = ports[p]->get_port_profile();
+ std::string s(CORBA::string_dup(pp->name));
+ if (name == s) { return ports[p]; }
+ }
+ return RTC::PortService::_nil();
+ }
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCの指定した名前のポートを接続する
+ * @param name コネクタ名
+ * @param prop 設定
+ * @param rtc0 対象のRTCコンポーネント1
+ * @param portName0 対象のポート名1
+ * @param rtc1 対象のRTCコンポーネント2
+ * @param portName1 対象のRTCコンポーネント2
+ * @return RTC、ポートがnilの場合はBAD_PARAMETERを返す。
+ * nilではない場合はport0.connect関数の戻り値を返す。RTC_OKの場合は接続が成功
+ * @else
+ * @brief
+ * @param name
+ * @param prop
+ * @param rtc0
+ * @param portName0
+ * @param rtc1
+ * @param portName1
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t connect_by_name(std::string name, coil::Properties prop,
+ RTC::RTObject_ptr rtc0,
+ const std::string portName0,
+ RTC::RTObject_ptr rtc1,
+ const std::string portName1)
+ {
+ if (CORBA::is_nil(rtc0)) { return RTC::BAD_PARAMETER; }
+ if (CORBA::is_nil(rtc1)) { return RTC::BAD_PARAMETER; }
+
+ // functor
+
+ // Port0
+ RTC::PortService_var port0 = get_port_by_name(rtc0, portName0);
+ if (CORBA::is_nil(port0)) { return RTC::BAD_PARAMETER; }
+ RTC::PortServiceList_var ports0 = rtc0->get_ports();
+
+ // Port1
+ RTC::PortService_var port1 = get_port_by_name(rtc1, portName1);
+ if (CORBA::is_nil(port1)) { return RTC::BAD_PARAMETER; }
+
+ // Connect
+ return connect(name, prop, port0, port1);
+ }
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントの指定した名前のコンフィギュレーションセットをkey-valueで取得
+ * @param rtc 対象のRTコンポーネント
+ * @param conf_name コンフィギュレーションセット名
+ * @return コンフィギュレーションセット
+ * @else
+ * @brief
+ * @param rtc
+ * @param conf_name
+ * @return
+ * @endif
+ */
+ coil::Properties get_configuration(const RTC::RTObject_ptr rtc, const std::string conf_name)
+ {
+ SDOPackage::Configuration_ptr conf = rtc->get_configuration();
+ SDOPackage::ConfigurationSet* confset = conf->get_configuration_set(conf_name.c_str());
+ SDOPackage::NVList confData = confset->configuration_data;
+
+ coil::Properties prop;
+ NVUtil::copyToProperties(prop, confData);
+ return prop;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief 指定したコンフィギュレーションセット名、パラメータ名のコンフィギュレーションパラメータを取得
+ * @param rtc RTコンポーネント
+ * @param confset_name コンフィギュレーションセット名
+ * @param value_name パラメータ名
+ * @return パラメータ
+ * @else
+ * @brief
+ * @param rtc
+ * @param conf_name
+ * @param value_name
+ * @return
+ * @endif
+ */
+ std::string get_parameter_by_key(const RTC::RTObject_ptr rtc, const std::string confset_name, const std::string value_name)
+ {
+ SDOPackage::Configuration_ptr conf = rtc->get_configuration();
+ SDOPackage::ConfigurationSet* confset = conf->get_configuration_set(confset_name.c_str());
+ SDOPackage::NVList confData = confset->configuration_data;
+
+ coil::Properties prop;
+ NVUtil::copyToProperties(prop, confData);
+ return prop[value_name];
+ }
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCのアクティブなコンフィギュレーションセット名を取得する
+ * @param rtc RTコンポーネント
+ * @return コンフィギュレーションセット名
+ * コンフィギュレーションの取得に失敗した場合は空の文字列を返す
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ std::string get_active_configuration_name(const RTC::RTObject_ptr rtc)
+ {
+ SDOPackage::Configuration_ptr conf = rtc->get_configuration();
+ SDOPackage::ConfigurationSet* confset = conf->get_active_configuration_set();
+ return confset->id;
+ }
+
+
+
+ /*!
+ * @if jp
+ * @brief アクティブなコンフィギュレーションセットをkey-valueで取得する
+ * @param rtc 対象のRTコンポーネント
+ * @return アクティブなコンフィギュレーションセット
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::Properties get_active_configuration(const RTC::RTObject_ptr rtc)
+ {
+ SDOPackage::Configuration_ptr conf = rtc->get_configuration();
+ SDOPackage::ConfigurationSet* confset = conf->get_active_configuration_set();
+ SDOPackage::NVList confData = confset->configuration_data;
+
+ coil::Properties prop;
+ NVUtil::copyToProperties(prop, confData);
+ return prop;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief コンフィギュレーションパラメータを設定
+ * @param rtc 対象のRTコンポーネント
+ * @param confset_name コンフィギュレーションセット名
+ * @param value_name パラメータ名
+ * @param value パラメータ
+ * @return True:設定に成功、False:設定に失敗
+ * @else
+ * @brief
+ * @param rtc
+ * @param confset_name
+ * @param value_name
+ * @param value
+ * @return
+ * @endif
+ */
+ bool set_configuration(const RTC::RTObject_ptr rtc, const std::string confset_name, const std::string value_name, const std::string value)
+ {
+ SDOPackage::Configuration_ptr conf = rtc->get_configuration();
+ SDOPackage::ConfigurationSet* confset = conf->get_configuration_set(confset_name.c_str());
+
+ set_configuration_parameter(conf, confset, value_name, value);
+
+ conf->activate_configuration_set(confset_name.c_str());
+
+ return true;
+ }
+
+
+
+ /*!
+ * @if jp
+ * @brief アクティブなコンフィギュレーションセットのパラメータを設定
+ * @param rtc 対象のRTコンポーネント
+ * @param value_name パラメータ名
+ * @param value パラメータ
+ * @return True:設定に成功、False:設定に失敗
+ * @else
+ * @brief
+ * @param rtc
+ * @param value_name
+ * @param value
+ * @return
+ * @endif
+ */
+ bool set_active_configuration(const RTC::RTObject_ptr rtc, const std::string value_name, const std::string value)
+ {
+ SDOPackage::Configuration_ptr conf = rtc->get_configuration();
+ SDOPackage::ConfigurationSet* confset = conf->get_active_configuration_set();
+
+ set_configuration_parameter(conf, confset, value_name, value);
+
+ conf->activate_configuration_set(confset->id);
+
+ return true;
+ }
+
+
+ /*!
+ * @if jp
+ * @brief コンフィギュレーションパラメータの設定
+ * @param conf コンフィギュレーション
+ * @param confset コンフィギュレーションセット
+ * @param value_name パラメータ名
+ * @param value パラメータ
+ * @return True:設定に成功、False:設定に失敗
+ * @else
+ * @brief
+ * @param rtc
+ * @param conf
+ * @param confset
+ * @param value_name
+ * @param value
+ * @return
+ * @endif
+ */
+ bool set_configuration_parameter(SDOPackage::Configuration_ptr conf, SDOPackage::ConfigurationSet* confset, const std::string value_name, const std::string value)
+ {
+ SDOPackage::NVList confData = confset->configuration_data;
+ coil::Properties prop;
+ NVUtil::copyToProperties(prop, confData);
+ prop[value_name] = value;
+
+ NVUtil::copyFromProperties(confData, prop);
+
+ confset->configuration_data = confData;
+
+ conf->set_configuration_set_values((*confset));
+
+ return true;
+ }
+
+
+}; // namespace CORBA_SeqUtil
+
Added: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/CORBA_RTCUtil.h
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/CORBA_RTCUtil.h (rev 0)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/CORBA_RTCUtil.h 2018-01-19 07:42:05 UTC (rev 3168)
@@ -0,0 +1,1003 @@
+// -*- C++ -*-
+/*!
+ * @file CORBA_RTCUtil.h
+ * @brief CORBA RTC utility
+ * @date $Date$
+ * @author Noriaki Ando <n-ando at aist.go.jp>
+ *
+ * Copyright (C) 2015
+ * Intelligent Systems Research Institute,
+ * National Institute of
+ * Advanced Industrial Science and Technology (AIST), Japan
+ * All rights reserved.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef CORBA_RTCUTIL_H
+#define CORBA_RTCUTIL_H
+
+#include <rtm/RTC.h>
+#include <rtm/NVUtil.h>
+#include <rtm/CORBA_SeqUtil.h>
+#include <rtm/RTObject.h>
+
+
+namespace CORBA_RTCUtil
+{
+
+ /*!
+ * @if jp
+ * @brief RTC操作ユーティリティー関数群
+ *
+ * - RTC基本操作系
+ * get_profile()
+ * is_existing()
+ * is_alive_in_default_ec()
+ *
+ * - ECおよび状態操作系
+ * get_actual_ec()
+ * get_ec_id()
+ * activate()
+ * deactivate()
+ * reset()
+ * get_state()
+ * is_in_inactive()
+ * is_in_active()
+ * is_in_error()
+ * get_default_rate()
+ * set_default_rate()
+ * get_current_rate()
+ * set_current_rate()
+ * add_rtc_to_default_ec()
+ * remove_rtc_to_default_ec()
+ * get_participants_rtc()
+ *
+ * - ポート操作系
+ * get_port_names()
+ * get_inport_names()
+ * get_outport_names()
+ * get_svcport_names()
+ * get_port_by_name()
+ * get_connector_names(RTObject_ptr)
+ * get_connector_ids()
+ * create_connector()
+ * already_connected()
+ * connect()
+ * connect_by_name()
+ * disconnect()
+ * disconnect_by_connector_name()
+ * disconnect_by_connector_id()
+ * disconnect_by_port_name()
+ *
+ * - コンフィギュレーション系
+ * get_configuration()
+ * get_parameter_by_key()
+ * get_current_configuration_name()
+ * get_active_configuration()
+ * set_configuration()
+ *
+ * @else
+ * @brief RTC handling utility functions
+ *
+ * @endif
+ */
+ /*!
+ * @brief Getting component profile
+ * This is an example obtained properties from a RTC.
+ *
+ * - implementation_id: ConsoleOut
+ * - type_name: ConsoleOut
+ * - description: Console output component
+ * - version: 1.0
+ * - vendor: Noriaki Ando, AIST
+ * - category: example
+ * - activity_type: DataFlowComponent
+ * - max_instance: 10
+ * - language: C++
+ * - lang_type: compile
+ * - conf:
+ * - instance_name: ConsoleOut1
+ * - sdo
+ * - service
+ * - provider
+ * - enabled_services:
+ * - available_services:
+ * - consumer
+ * - enabled_services:
+ * - available_services:
+ * - config
+ * - version: 1.1.1
+ * - openrtm
+ * - name: OpenRTM-aist-1.1.1
+ * - version: 1.1.1
+ * - os
+ * - name: Linux
+ * - release: 3.13.0-24-generic
+ * - version: #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014
+ * - arch: x86_64
+ * - hostname: ubuntu1404
+ * - corba
+ * - endpoint:
+ * - id: omniORB
+ * - exec_cxt
+ * - periodic
+ * - type: PeriodicExecutionContext
+ * - rate: 1000
+ * - sync_transition: YES
+ * - transition_timeout: 0.5
+ * - logger
+ * - enable: YES
+ * - log_level: PARANOID
+ * - naming
+ * - enable: YES
+ * - type: corba
+ * - formats: %h.host_cxt/%n.rtc
+ * - names: ubuntu1404.host_cxt/ConsoleOut1.rtc
+ * - port
+ * - inport
+ * - in
+ * - buffer
+ * - read
+ * - empty_policy: block
+ * - timeout: 2.0
+ * - write
+ * - full_policy: overwrite
+ * - timeout: 2.0
+ * - subscribe_topic: TimedLong
+ * - config_file: consout.conf
+ */
+
+
+ /*!
+ * @if jp
+ * @brief コンポーネントのプロパティ取得
+ * @param rtc RTコンポーネント
+ * @return コンポーネントのプロパティ
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::Properties get_component_profile(const RTC::RTObject_ptr rtc);
+ /*!
+ * @if jp
+ * @brief コンポーネントのオブジェクトリファレンスが存在しているかを判定
+ * @param rtc RTコンポーネント
+ * @return True:生存、False:終了済み
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ bool is_existing(const RTC::RTObject_ptr rtc);
+ /*!
+ * @if jp
+ * @brief RTCがデフォルトの実行コンテキストでalive状態かを判定する
+ * @param rtc RTコンポーネント
+ * @return True:alive状態
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ bool is_alive_in_default_ec(const RTC::RTObject_ptr rtc);
+
+
+ /*!
+ * @if jp
+ * @brief RTコンポーネントに関連付けした実行コンテキストから指定したIDの実行コンテキストを取得
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return 実行コンテキストのオブジェクトリファレンス
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ RTC::ExecutionContext_var get_actual_ec(const RTC::RTObject_ptr rtc,
+ RTC::UniqueId ec_id = 0);
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントから指定した実行コンテキストのIDを取得する
+ * @param rtc RTコンポーネント
+ * @param ec 実行コンテキスト
+ * @return 実行コンテキストのID
+ * 指定した実行コンテキストがRTコンポーネントに関連付けられていなかった場合は-1を返す
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec
+ * @return
+ * @endif
+ */
+ RTC::UniqueId get_ec_id(const RTC::RTObject_ptr rtc, const RTC::ExecutionContext_ptr ec);
+
+ /*!
+ * @if jp
+ * @brief RTCを指定した実行コンテキストでアクティベーションする
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return RTC、ECのオブジェクトリファレンスがnilの場合はBAD_PARAMETERを返す
+ * nilではない場合はactivate_component関数の戻り値を返す。RTC_OKの場合はアクティベーションが成功
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t activate(RTC::RTObject_ptr rtc, RTC::UniqueId ec_id = 0);
+
+ /*!
+ * @if jp
+ * @brief RTCを指定した実行コンテキストで非アクティベーションする
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return RTC、ECのオブジェクトリファレンスがnilの場合はBAD_PARAMETERを返す
+ * nilではない場合はdeactivate_component関数の戻り値を返す。RTC_OKの場合は非アクティベーションが成功
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t deactivate(RTC::RTObject_ptr rtc, RTC::UniqueId ec_id = 0);
+
+ /*!
+ * @if jp
+ * @brief RTCを指定した実行コンテキストでリセットする
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return RTC、ECのオブジェクトリファレンスがnilの場合はBAD_PARAMETERを返す
+ * nilではない場合はreset_component関数の戻り値を返す。RTC_OKの場合はリセットが成功
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t reset(RTC::RTObject_ptr rtc, RTC::UniqueId ec_id = 0);
+
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントの指定した実行コンテキストでの状態を取得
+ * @param state RTCの状態
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return rtc、ecがnilの場合はFalseを返す。
+ * nilではない場合はstateに状態を代入してTrueを返す。
+ * @else
+ * @brief
+ * @param state
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ bool get_state(RTC::LifeCycleState &state, const RTC::RTObject_ptr rtc, RTC::UniqueId ec_id = 0);
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントの指定した実行コンテキストでINACTIVE状態かどうか判定
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return INACTIVE状態の時はTrue、それ以外はFalse
+ * rtc、ecがnilの場合もFalseを返す
+ * @else
+ * @brief
+ * @param state
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ bool is_in_inactive(const RTC::RTObject_ptr rtc, RTC::UniqueId ec_id = 0);
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントの指定した実行コンテキストでACTIVE状態かどうか判定
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return ACTIVE状態の時はTrue、それ以外はFalse
+ * rtc、ecがnilの場合もFalseを返す
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ bool is_in_active(const RTC::RTObject_ptr rtc, RTC::UniqueId ec_id = 0);
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントの指定した実行コンテキストでERROR状態かどうか判定
+ * @param rtc 対象のRTコンポーネント
+ * @param ec_id 実行コンテキストのID
+ * @return ERROR状態の時はTrue、それ以外はFalse
+ * rtc、ecがnilの場合もFalseを返す
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ bool is_in_error(const RTC::RTObject_ptr rtc, RTC::UniqueId ec_id = 0);
+
+
+
+ /*!
+ * @if jp
+ * @brief RTCのデフォルトの実行コンテキストの実行周期を取得する
+ * @param rtc RTコンポーネント
+ * @return 実行周期
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ CORBA::Double get_default_rate(const RTC::RTObject_ptr rtc);
+
+
+ /*!
+ * @if jp
+ * @brief RTCのデフォルトの実行コンテキストの実行周期を設定する
+ * @param rtc RTコンポーネント
+ * @param rate 実行周期
+ * @return set_rate関数の戻り値を返す。
+ * RTC_OKで設定が成功
+ * @else
+ * @brief
+ * @param rtc
+ * @param rate
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t set_default_rate(RTC::RTObject_ptr rtc, const CORBA::Double rate);
+
+
+ /*!
+ * @if jp
+ * @brief RTCの指定IDの実行コンテキストの周期を取得
+ * @param rtc RTコンポーネント
+ * @param ec_id 指定の実行コンテキストのID
+ * @return 実行周期
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @return
+ * @endif
+ */
+ CORBA::Double get_current_rate(const RTC::RTObject_ptr rtc, RTC::UniqueId ec_id);
+
+ /*!
+ * @if jp
+ * @brief RTCの指定IDの実行コンテキストの周期を設定
+ * @param rtc RTコンポーネント
+ * @param ec_id 指定の実行コンテキストのID
+ * @param rate 実行周期
+ * @return set_rate関数の戻り値を返す。
+ * RTC_OKで設定が成功
+ * @else
+ * @brief
+ * @param rtc
+ * @param ec_id
+ * @param rate
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t set_current_rate(RTC::RTObject_ptr rtc, RTC::UniqueId ec_id, const CORBA::Double rate);
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCのデフォルトの実行コンテキストに指定のRTCを関連付ける
+ * @param localcomp 対象のRTコンポーネント
+ * @param othercomp 実行コンテキストに関連付けるRTコンポーネント
+ * @return ecの取得に失敗した場合はBAD_PARAMETERを返す
+ * そうでない場合はaddComponent関数の戻り値を返す。RTC_OKで接続成功。
+ * @else
+ * @brief
+ * @param localcomp
+ * @param othercomp
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t add_rtc_to_default_ec(const RTC::RTObject_ptr localcomp, const RTC::RTObject_ptr othercomp);
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCのデフォルトの実行コンテキストの指定のRTCへの関連付けを解除する
+ * @param localcomp 対象のRTコンポーネント
+ * @param othercomp 実行コンテキストとの関連付けを解除するRTコンポーネント
+ * @return ecの取得に失敗した場合はBAD_PARAMETERを返す
+ * そうでない場合はremoveComponent関数の戻り値を返す。RTC_OKで解除成功。
+ * @else
+ * @brief
+ * @param localcomp
+ * @param othercomp
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t remove_rtc_to_default_ec(const RTC::RTObject_ptr localcomp, const RTC::RTObject_ptr othercomp);
+
+
+ /*!
+ * @if jp
+ * @brief RTCのデフォルトの実行コンテキストに参加しているRTCのリストを取得する
+ * 実行コンテキストがnilの場合は空のリストを返す
+ * @param rtc 対象のRTコンポーネント
+ * @return RTCのリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ const RTC::RTCList get_participants_rtc(const RTC::RTObject_ptr rtc);
+
+
+
+ /*!
+ * @if jp
+ * @brief 指定したRTCの保持するポートの名前を取得
+ * @param rtc 対象のRTコンポーネント
+ * @return ポート名のリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::vstring get_port_names(const RTC::RTObject_ptr rtc);
+
+
+ /*!
+ * @if jp
+ * @brief 指定したRTCの保持するインポートの名前を取得
+ * @param rtc 対象のRTコンポーネント
+ * @return ポート名のリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::vstring get_inport_names(const RTC::RTObject_ptr rtc);
+
+
+ /*!
+ * @if jp
+ * @brief 指定したRTCの保持するアウトポートの名前を取得
+ * @param rtc 対象のRTコンポーネント
+ * @return ポート名のリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::vstring get_outport_names(const RTC::RTObject_ptr rtc);
+
+
+ /*!
+ * @if jp
+ * @brief 指定したRTCの保持するサービスポートの名前を取得
+ * @param rtc 対象のRTコンポーネント
+ * @return ポート名のリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::vstring get_svcport_names(const RTC::RTObject_ptr rtc);
+
+
+ /*!
+ * @if jp
+ * @brief 指定したポートの保持しているコネクタの名前のリストを取得
+ * @param port 対象のポート
+ * @return コネクタ名のリスト
+ * @else
+ * @brief
+ * @param port
+ * @return
+ * @endif
+ */
+ coil::vstring get_connector_names(const RTC::PortService_ptr port);
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCの指定したポートのコネクタの名前のリストを取得
+ * @param rtc 対象のRTコンポーネント
+ * @param port_name ポート名
+ * @return コネクタ名のリスト
+ * @else
+ * @brief
+ * @param rtc
+ * @param port_name
+ * @return
+ * @endif
+ */
+ coil::vstring get_connector_names(const RTC::RTObject_ptr rtc, const std::string port_name);
+
+ /*!
+ * @if jp
+ * @brief 指定したポートの保持しているコネクタのIDのリストを取得
+ * @param port 対象のポート
+ * @return コネクタのIDのリスト
+ * @else
+ * @brief
+ * @param port
+ * @return
+ * @endif
+ */
+ coil::vstring get_connector_ids(const RTC::PortService_ptr port);
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCの指定したポートのコネクタのIDのリストを取得
+ * @param port RTコンポーネント
+ * @param port_name ポート名
+ * @return コネクタのIDのリスト
+ * @else
+ * @brief
+ * @param port
+ * @param port_name
+ * @return
+ * @endif
+ */
+ coil::vstring get_connector_ids(const RTC::RTObject_ptr rtc, const std::string port_name);
+
+
+ /*!
+ * @if jp
+ * @brief 指定したポートを接続するためのコネクタプロファイルを取得
+ * @param name コネクタ名
+ * @param prop_arg 設定
+ * @param port0 対象のポート1
+ * @param port1 対象のポート2
+ * @return コネクタプロファイル
+ * @else
+ * @brief
+ * @param name
+ * @param prop_arg
+ * @param port0
+ * @param port1
+ * @return
+ * @endif
+ */
+ RTC::ConnectorProfile_var create_connector(const std::string name,
+ const coil::Properties prop_arg,
+ const RTC::PortService_ptr port0,
+ const RTC::PortService_ptr port1);
+
+ /*!
+ * @if jp
+ * @brief 指定したポート同士が接続されているかを判定
+ * @param port0 対象のポート1
+ * @param port1 対象のポート2
+ * @return True: 接続済み、False: 未接続
+ * @else
+ * @brief
+ * @param port0
+ * @param port1
+ * @return
+ * @endif
+ */
+ bool already_connected(const RTC::PortService_ptr localport,
+ const RTC::PortService_ptr otherport);
+
+ /*!
+ * @if jp
+ * @brief 指定したポートを接続する
+ * @param name コネクタ名
+ * @param prop 設定
+ * @param port0 対象のポート1
+ * @param port1 対象のポート2
+ * @return ポートのオブジェクトリファレンスがnilの場合はBAD_PARAMETERを返す
+ * nilではない場合はport0.connect関数の戻り値を返す。RTC_OKの場合は接続が成功
+ * @else
+ * @brief
+ * @param name
+ * @param prop
+ * @param port0
+ * @param port1
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t connect(const std::string name,
+ const coil::Properties prop,
+ const RTC::PortService_ptr port0,
+ const RTC::PortService_ptr port1);
+
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCの指定したポートのコネクタのIDのリストを取得
+ * @param port RTコンポーネント
+ * @param port_name ポート名
+ * @return コネクタのIDのリスト
+ * @else
+ * @brief
+ * @param port
+ * @param port_name
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect(RTC::ConnectorProfile connector_prof);
+
+
+ /*!
+ * @if jp
+ * @brief 対象のポートで指定した名前のコネクタを切断
+ * @param port_ref 対象のポート
+ * @param conn_name コネクタ名
+ * @return portがnilの場合はBAD_PARAMETERを返す
+ * nilではない場合はdisconnect関数の戻り値を返す。RTC_OKの場合は切断が成功
+ * @else
+ * @brief
+ * @param port_ref
+ * @param conn_name
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_connector_name(const RTC::PortService_ptr port_ref, const std::string conn_name);
+
+
+
+ /*!
+ * @if jp
+ * @brief 対象の名前のポートで指定した名前のコネクタを切断
+ * @param port_name 対象のポート名
+ * @param conn_name コネクタ名
+ * @return portが存在しない場合はBAD_PARAMETERを返す
+ * nilではない場合はdisconnect関数の戻り値を返す。RTC_OKの場合は切断が成功
+ * @else
+ * @brief
+ * @param port_name
+ * @param conn_name
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_connector_name(const std::string port_name, const std::string conn_name);
+
+
+ /*!
+ * @if jp
+ * @brief 対象のポートで指定したIDのコネクタを切断
+ * @param port 対象のポート
+ * @param name コネクタID
+ * @return portが存在しない場合はBAD_PARAMETERを返す
+ * nilではない場合はdisconnect関数の戻り値を返す。RTC_OKの場合は切断が成功
+ * @else
+ * @brief
+ * @param port
+ * @param name
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_connector_id(const RTC::PortService_ptr port_ref, const std::string conn_id);
+
+
+ /*!
+ * @if jp
+ * @brief 対象の名前のポートで指定したIDのコネクタを切断
+ * @param port 対象のポート
+ * @param name コネクタID
+ * @return portが存在しない場合はBAD_PARAMETERを返す
+ * nilではない場合はdisconnect関数の戻り値を返す。RTC_OKの場合は切断が成功
+ * @else
+ * @brief
+ * @param port
+ * @param name
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_connector_id(const std::string port_name, const std::string conn_id);
+
+ /*!
+ * @if jp
+ * @brief 対象のポートのコネクタを全て切断
+ * @param port_ref ポートのオブジェクトリファレンス
+ * @return portが存在しない場合はBAD_PARAMETERを返す
+ * 切断できた場合はRTC_OKを返す
+ * @else
+ * @brief
+ * @param port_ref
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_all(const RTC::PortService_ptr port_ref);
+
+
+ /*!
+ * @if jp
+ * @brief 指定ポート名のポートのコネクタを全て切断
+ * @param port_name ポート名
+ * @return portが存在しない場合はBAD_PARAMETERを返す
+ * 切断できた場合はRTC_OKを返す
+ * @else
+ * @brief
+ * @param port_ref
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_all(const std::string port_name);
+
+ /*!
+ * @if jp
+ * @brief 指定した名前のポートを取得
+ * @param port_name ポート名
+ * @return ポートのオブジェクトリファレンス
+ * portが存在しない場合はnilを返す
+ * @else
+ * @brief
+ * @param port_ref
+ * @return
+ * @endif
+ */
+ RTC::PortService_var get_port_by_url(std::string port_name);
+
+ /*!
+ * @if jp
+ * @brief 対象ポートと接続しているポートで指定したポート名と一致した場合に切断
+ * @param localport 対象のポート
+ * @param othername 接続しているポート名
+ * @return ポートがnilの場合、localportの名前とothernameが一致する場合、接続しているポートの名前でothernameと一致するものがない場合にBAD_PARAMETERを返す
+ * 上記の条件に当てはまらない場合はdisconnect関数の戻り値を返す。RTC_OKの場合は切断が成功
+ * @else
+ * @brief
+ * @param localport
+ * @param othername
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t disconnect_name(const RTC::PortService_ptr localport, const std::string othername);
+ /*!
+ * @if jp
+ * @brief 指定したポートと指定したリスト内のポート全てと接続する
+ * @param name コネクタ名
+ * @param prop 設定
+ * @param port 対象のポート
+ * @param target_ports 対象のポートのリスト
+ * @return 全ての接続が成功した場合はRTC_OKを返す。
+ * connect関数がRTC_OK以外を返した場合はBAD_PARAMETERを返す。
+ * @else
+ * @brief
+ * @param name
+ * @param prop
+ * @param port0
+ * @param port1
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t connect_multi(const std::string name,
+ const coil::Properties prop,
+ const RTC::PortService_ptr port,
+ RTC::PortServiceList_var& target_ports);
+ /*!
+ * @if jp
+ * @brief ポートを名前から検索
+ * @else
+ * @brief
+ * @endif
+ */
+ struct find_port
+ {
+ const std::string m_name;
+ /*!
+ * @if jp
+ * @brief 検索するポート名を指定する
+ * @param name ポート名
+ * @else
+ * @brief
+ * @param name
+ * @endif
+ */
+ find_port(const std::string name) : m_name(name) {};
+ /*!
+ * @if jp
+ * @brief 対象のポートの名前と指定したポート名が一致するか判定
+ * @param p 対象のポート
+ * @return True: 名前が一致、False: 名前が不一致
+ * @else
+ * @brief
+ * @param p
+ * @return
+ * @endif
+ */
+ bool operator()(RTC::PortService_var p);
+ };
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCから指定した名前のポートを取得
+ * @param rtc RTコンポーネント
+ * @param port_name ポート名
+ * @return ポート
+ * @else
+ * @brief
+ * @param rtc
+ * @param port_name
+ * @return
+ * @endif
+ */
+ RTC::PortService_var get_port_by_name(const RTC::RTObject_ptr rtc,
+ std::string name);
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCの指定した名前のポートを接続する
+ * @param name コネクタ名
+ * @param prop 設定
+ * @param rtc0 対象のRTCコンポーネント1
+ * @param portName0 対象のポート名1
+ * @param rtc1 対象のRTCコンポーネント2
+ * @param portName1 対象のRTCコンポーネント2
+ * @return RTC、ポートがnilの場合はBAD_PARAMETERを返す。
+ * nilではない場合はport0.connect関数の戻り値を返す。RTC_OKの場合は接続が成功
+ * @else
+ * @brief
+ * @param name
+ * @param prop
+ * @param rtc0
+ * @param portName0
+ * @param rtc1
+ * @param portName1
+ * @return
+ * @endif
+ */
+ RTC::ReturnCode_t connect_by_name(std::string name, coil::Properties prop,
+ RTC::RTObject_ptr rtc0,
+ const std::string portName0,
+ RTC::RTObject_ptr rtc1,
+ const std::string portName1);
+
+ /*!
+ * @if jp
+ * @brief 対象のRTコンポーネントの指定した名前のコンフィギュレーションセットをkey-valueで取得
+ * @param rtc 対象のRTコンポーネント
+ * @param conf_name コンフィギュレーションセット名
+ * @return コンフィギュレーションセット
+ * @else
+ * @brief
+ * @param rtc
+ * @param conf_name
+ * @return
+ * @endif
+ */
+ coil::Properties get_configuration(const RTC::RTObject_ptr rtc, const std::string conf_name);
+
+
+ /*!
+ * @if jp
+ * @brief 指定したコンフィギュレーションセット名、パラメータ名のコンフィギュレーションパラメータを取得
+ * @param rtc RTコンポーネント
+ * @param confset_name コンフィギュレーションセット名
+ * @param value_name パラメータ名
+ * @return パラメータ
+ * @else
+ * @brief
+ * @param rtc
+ * @param conf_name
+ * @param value_name
+ * @return
+ * @endif
+ */
+ std::string get_parameter_by_key(const RTC::RTObject_ptr rtc, const std::string confset_name, const std::string value_name);
+
+ /*!
+ * @if jp
+ * @brief 対象のRTCのアクティブなコンフィギュレーションセット名を取得する
+ * @param rtc RTコンポーネント
+ * @return コンフィギュレーションセット名
+ * コンフィギュレーションの取得に失敗した場合は空の文字列を返す
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ std::string get_active_configuration_name(const RTC::RTObject_ptr rtc);
+
+
+
+ /*!
+ * @if jp
+ * @brief アクティブなコンフィギュレーションセットをkey-valueで取得する
+ * @param rtc 対象のRTコンポーネント
+ * @return アクティブなコンフィギュレーションセット
+ * @else
+ * @brief
+ * @param rtc
+ * @return
+ * @endif
+ */
+ coil::Properties get_active_configuration(const RTC::RTObject_ptr rtc);
+
+
+ /*!
+ * @if jp
+ * @brief コンフィギュレーションパラメータを設定
+ * @param rtc 対象のRTコンポーネント
+ * @param confset_name コンフィギュレーションセット名
+ * @param value_name パラメータ名
+ * @param value パラメータ
+ * @return True:設定に成功、False:設定に失敗
+ * @else
+ * @brief
+ * @param rtc
+ * @param confset_name
+ * @param value_name
+ * @param value
+ * @return
+ * @endif
+ */
+ bool set_configuration(const RTC::RTObject_ptr rtc, const std::string confset_name, const std::string value_name, const std::string value);
+
+
+
+ /*!
+ * @if jp
+ * @brief アクティブなコンフィギュレーションセットのパラメータを設定
+ * @param rtc 対象のRTコンポーネント
+ * @param value_name パラメータ名
+ * @param value パラメータ
+ * @return True:設定に成功、False:設定に失敗
+ * @else
+ * @brief
+ * @param rtc
+ * @param value_name
+ * @param value
+ * @return
+ * @endif
+ */
+ bool set_active_configuration(const RTC::RTObject_ptr rtc, const std::string value_name, const std::string value);
+
+
+ /*!
+ * @if jp
+ * @brief コンフィギュレーションパラメータの設定
+ * @param conf コンフィギュレーション
+ * @param confset コンフィギュレーションセット
+ * @param value_name パラメータ名
+ * @param value パラメータ
+ * @return True:設定に成功、False:設定に失敗
+ * @else
+ * @brief
+ * @param rtc
+ * @param conf
+ * @param confset
+ * @param value_name
+ * @param value
+ * @return
+ * @endif
+ */
+ bool set_configuration_parameter(SDOPackage::Configuration_ptr conf, SDOPackage::ConfigurationSet* confset, const std::string value_name, const std::string value);
+
+
+}; // namespace CORBA_SeqUtil
+#endif // CORBA_SEQUTIL_H
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/Makefile.am
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/Makefile.am 2018-01-18 14:09:27 UTC (rev 3167)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/Makefile.am 2018-01-19 07:42:05 UTC (rev 3168)
@@ -54,7 +54,9 @@
CORBA_IORUtil.cpp \
NVUtil.cpp \
RTCUtil.cpp \
- DefaultPeriodicTask.cpp
+ DefaultPeriodicTask.cpp \
+ CORBA_RTCUtil.h \
+ CORBA_RTCUtil.cpp
MGR_SRC = \
FactoryInit.cpp \
Modified: branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/NamingManager.cpp
===================================================================
--- branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/NamingManager.cpp 2018-01-18 14:09:27 UTC (rev 3167)
+++ branches/RELENG_1_2/OpenRTM-aist/src/lib/rtm/NamingManager.cpp 2018-01-19 07:42:05 UTC (rev 3168)
@@ -263,7 +263,7 @@
RTC::RTCList NamingOnCorba::string_to_component(std::string name)
{
RTC::RTCList rtc_list;
-
+
coil::vstring tmp = coil::split(name, "://");
if (tmp.size() > 1)
{
@@ -277,39 +277,46 @@
std::string rtc_name = url.substr(host.size()+1, url.size() - host.size());
try
{
- RTC::CorbaNaming *cns = NULL;
+ RTC::CorbaNaming cns = m_cosnaming;
if (host == "*")
{
- cns = &m_cosnaming;
+ //cns = m_cosnaming;
}
else
{
- CORBA::ORB_var orb = Manager::instance().getORB();
- cns = new RTC::CorbaNaming(orb, host.c_str());
+ CORBA::ORB_ptr orb = Manager::instance().getORB();
+
+ cns = RTC::CorbaNaming(orb, host.c_str());
}
coil::vstring names = coil::split(rtc_name, "/");
if (names.size() == 2 && names[0] == "*")
{
- CosNaming::NamingContext_ptr root_cxt = cns->getRootContext();
+ CosNaming::NamingContext_ptr root_cxt = cns.getRootContext();
getComponentByName(root_cxt, names[1], rtc_list);
return rtc_list;
}
else
{
+
rtc_name += ".rtc";
- CORBA::Object_ptr obj = cns->resolveStr(rtc_name.c_str());
+
+
+ CORBA::Object_ptr obj = cns.resolveStr(rtc_name.c_str());
if (CORBA::is_nil(obj))
{
return rtc_list;
}
+ if (obj->_non_existent())
+ {
+ return rtc_list;
+ }
CORBA_SeqUtil::push_back(rtc_list, RTC::RTObject::_narrow(obj));
return rtc_list;
+
+
}
- if (cns != &m_cosnaming)
- {
- delete cns;
- }
+
}
catch (...)
{
More information about the openrtm-commit
mailing list