コンフィギュレーション(基本編)では、コンフィギュレーションの基本的な使い方について説明しました。応用編では、もう少し踏み込んだ使い方について解説します。
コンフィギュレーションパラメータのコールバックの利用について説明します。
コンフィギュレーションには、以下のコールバックがあります。
以下のようにしてコールバックを設定します。
class MyOnUpdate : public RTC::OnUpdateCallback { public: MyOnUpdate(ConfigurationTest *obj) { myobj = obj; } virtual void operator()(const char* config_set) { RTC::ExecutionContextList_var ecs; ecs = myobj->get_owned_contexts(); ecs[(CORBA::ULong)0]->set_rate(myobj->m_interval); std::cout << "OnUpdateCallback\t" << config_set << std::endl; } private: ConfigurationTest *myobj; };
class MyOnUpdateParam : public RTC::OnUpdateParamCallback { public: MyOnUpdateParam(ConfigurationTest *obj) { myobj = obj; } virtual void operator()(const char* config_set, const char* config_param) { RTC::ExecutionContextList_var ecs; ecs = myobj->get_owned_contexts(); ecs[(CORBA::ULong)0]->set_rate(myobj->m_interval); std::cout << "OnUpdateParamCallback\t" << config_set << "\t" << config_param << std::endl; } private: ConfigurationTest *myobj; };
class MyOnSetConfigurationSet : public RTC::OnSetConfigurationSetCallback { public: MyOnSetConfigurationSet(ConfigurationTest *obj) { myobj = obj; } virtual void operator()(const coil::Properties& config_set) { RTC::ExecutionContextList_var ecs; ecs = myobj->get_owned_contexts(); ecs[(CORBA::ULong)0]->set_rate(myobj->m_interval); std::cout << "OnSetConfiguration\t" << config_set.getName() << "\t" << config_set.getValue() << std::endl; } private: ConfigurationTest *myobj; };
class MyOnAddConfigurationAdd : public RTC::OnAddConfigurationAddCallback { public: MyOnAddConfigurationAdd(ConfigurationTest *obj) { myobj = obj; } virtual void operator()(const coil::Properties& config_set) { RTC::ExecutionContextList_var ecs; ecs = myobj->get_owned_contexts(); ecs[(CORBA::ULong)0]->set_rate(myobj->m_interval); std::cout << "OnAddConfigurationAdd\t" << config_set.getName() << "\t" << config_set.getValue() << std::endl; } private: ConfigurationTest *myobj; };
class MyOnRemoveConfigurationSet : public RTC::OnRemoveConfigurationSetCallback { public: MyOnRemoveConfigurationSet(ConfigurationTest *obj) { myobj = obj; } virtual void operator()(const char* config_set) { RTC::ExecutionContextList_var ecs; ecs = myobj->get_owned_contexts(); ecs[(CORBA::ULong)0]->set_rate(myobj->m_interval); std::cout << "OnRemoveConfigurationSet\t" << config_set << std::endl; } private: ConfigurationTest *myobj; };
class MyOnActivateSet : public RTC::OnActivateSetCallback { public: MyOnActivateSet(ConfigurationTest *obj) { myobj = obj; } virtual void operator()(const char* config_id) { RTC::ExecutionContextList_var ecs; ecs = myobj->get_owned_contexts(); ecs[(CORBA::ULong)0]->set_rate(myobj->m_interval); std::cout << "OnActivateSet\t" << config_id << std::endl; } private: ConfigurationTest *myobj; };
参考までに、コールバックが呼ばれると実行周期がコンフィギュレーションパラメーター Interval に設定されるという例を示します。 アクティブ、非アクティブに遷移したときにコールバックにより、コンフィギュレーションパラメーターが変更されることを確認します。
コンフィギュレーション(初期編) を参照して、初期パラメーターを設定します。
static const char* configurationtest_spec[] = { "implementation_id", "ConfigurationTest", "type_name", "ConfigurationTest", "description", "Configuration Test Component", "version", "1.0.0", "vendor", "hogehoge", "category", "TEST", "activity_type", "PERIODIC", "kind", "DataFlowComponent", "max_instance", "1", "language", "C++", "lang_type", "compile", // Configuration variables "conf.default.Interval", "1000", "conf.default.Test", "0", // Widget "conf.__widget__.Interval", "text", "conf.__widget__.Test", "text", // Constraints "conf.__constraints__.Interval", "0 < x < 10000", "" };
RTC::ReturnCode_t ConfigurationTest::onInitialize() { this->m_configsets.setOnUpdate(new MyOnUpdate(this)); this->m_configsets.setOnUpdateParam(new MyOnUpdateParam(this)); this->m_configsets.setOnSetConfigurationSet(new MyOnSetConfigurationSet(this)); this->m_configsets.setOnRemoveConfigurationSet(new MyOnRemoveConfigurationSet(this)); this->m_configsets.setOnAddConfigurationSet(new MyOnAddConfigurationAdd(this)); this->m_configsets.setOnActivateSet(new MyOnActivateSet(this)); bindParameter("Interval", m_interval, "1000"); bindParameter("Test", m_test, "0"); return RTC::RTC_OK; }
m_configsets は ConfigAdminクラス (コンフィギュレーション情報管理オブジェクト)で、ConfigAdmin.h にコールバックの定義があります。
まず、RTC を起動して、RTC を配置します。コンソールには以下のように表示されます。
RTC::ReturnCode_t ConfigurationTest::onActivated(RTC::UniqueId ec_id) { coil::Properties cproperties("default"); cproperties.setProperty("Interval", "1"); this->m_configsets.setConfigurationSetValues(cproperties); this->m_configsets.activateConfigurationSet("default"); std::cout << "Interval:\t" << m_interval << std::endl; this->m_configsets.update("default","Test"); std::cout << "Interval:\t" << m_interval << std::endl; this->m_configsets.update("default"); std::cout << "Interval:\t" << m_interval << std::endl; return RTC::RTC_OK; }
Interval を「1000」から「1」に設定します。
cproperties.setProperty("Interval", "1");
コンフィギュレーションセットを取得し追加します。このときに OnSetConfiguration が呼ばれます。
this->m_configsets.setConfigurationSetValues(cproperties);
コンフィギュレーションセットをアクティブ化します。このときに OnSetActivateSet が呼ばれますが、まだコンフィギュレーションパラメーターは変更されていません。
this->m_configsets.activateConfigurationSet("default");
もう一つのコンフィギュレーションパラメーター Test のみをアップデートします。Interval は「1000」のままです。
this->m_configsets.update("default","Test");
コンフィギュレーションセットを更新し Interval に「1」を設定します。
this->m_configsets.update("default");
次に、アクティブ化したまま RTSystemEditor で Interval を「2」に変更します。コンソールには以下のように表示されます。
続いて、RTC を非アクティブにします。コンソールには以下のように表示されます。
RTC::ReturnCode_t ConfigurationTest::onDeactivated(RTC::UniqueId ec_id) { coil::Properties cproperties("default"); cproperties.setProperty("Interval", "800"); this->m_configsets.setConfigurationSetValues(cproperties); this->m_configsets.activateConfigurationSet("default"); std::cout << "Interval:\t" << m_interval << std::endl; this->m_configsets.update("default","Interval"); std::cout << "Interval:\t" << m_interval << std::endl; this->m_configsets.update("default"); std::cout << "Interval:\t" << m_interval << std::endl; return RTC::RTC_OK; }
アクティブにしたときと異なるのは、Interval を 800 にした箇所と、m_configsets.update("default","Interval") として Interval のみ更新しているところです。 今回は、m_configsets.update("default","Interval") で値が更新されているか確認できます。
続いて、RTSyetemEditor でコンフィギュレーションセットを追加します。 図で [追加] ボタンをクリックした後に、[適用] ボタンをクリックすると OnAddConfigurationAddCallback を呼ぶことができます。 コンソールには以下のように表示されます。
同様に、コンフィギュレーションセットを削除することで OnRemoveConfigurationSetCallback を呼ぶことができます。
基本的に、パラメーターの変更は RTC のアクティビティが呼び出されるまではコンフィギュレーションパラメーターが外部で変更されても反映されませんが、コールバックを使うことでいろいろな設定ができるようになります。