[openrtm-commit:00484] r499 - in trunk/OpenRTM-aist-Python/OpenRTM_aist: . test
openrtm @ openrtm.org
openrtm @ openrtm.org
2011年 12月 15日 (木) 12:22:30 JST
Author: kurihara
Date: 2011-12-15 12:22:30 +0900 (Thu, 15 Dec 2011)
New Revision: 499
Modified:
trunk/OpenRTM-aist-Python/OpenRTM_aist/ConfigAdmin.py
trunk/OpenRTM-aist-Python/OpenRTM_aist/ConfigurationListener.py
trunk/OpenRTM-aist-Python/OpenRTM_aist/RTObject.py
trunk/OpenRTM-aist-Python/OpenRTM_aist/test/test_ConfigAdmin.py
Log:
Now onUpdateParam() callback is called when parameter is updated.ConfigAdmin::changedParameters() has been added. RTObject::getConfigService() has been added. refs #2266
Modified: trunk/OpenRTM-aist-Python/OpenRTM_aist/ConfigAdmin.py
===================================================================
--- trunk/OpenRTM-aist-Python/OpenRTM_aist/ConfigAdmin.py 2011-12-15 03:19:12 UTC (rev 498)
+++ trunk/OpenRTM-aist-Python/OpenRTM_aist/ConfigAdmin.py 2011-12-15 03:22:30 UTC (rev 499)
@@ -131,16 +131,63 @@
def __init__(self, name, var, def_val, trans=None):
self.name = name
self.default_value = def_val
+ self.string_value = ""
+ self.callback = None
self._var = var
if trans:
self._trans = trans
else:
self._trans = OpenRTM_aist.stringTo
+ return
##
# @if jp
+ #
+ # @brief コールバックのセット
#
+ # 変数変更時にコールされるコールバック関数をセットする.
+ #
+ # @else
+ #
+ # @brief Setting callback
+ #
+ # This member function sets callback function which is called
+ # when variable is changed.
+ #
+ # @endif
+ #
+ # void setCallback(CallbackFunc cbf);
+ def setCallback(self, cbf):
+ self.callback = cbf
+
+ return
+
+
+ ##
+ # @if jp
+ #
+ # @brief 変数変更を知らせるオブザーバ関数
+ #
+ # 変数変更を知らせるオブザーバ関数.
+ #
+ # @else
+ #
+ # @brief Observer function to notify variable changed
+ #
+ # This function notifies variable has been changed.
+ #
+ # @endif
+ #
+ # void notifyUpdate(const char* key, const char* val);
+ def notifyUpdate(self, key, val):
+ self.callback(key, val)
+ return
+
+
+ ##
+ # @if jp
+ #
# @brief バインドパラメータ値を更新
#
# コンフィギュレーション設定値でコンフィギュレーションパラメータを更新する
@@ -164,13 +211,18 @@
# @endif
# virtual bool update(const char* val)
def update(self, val):
+ if self.string_value == val:
+ return True
+ self.string_value = val
+ # value changed
if self._trans(self._var, val):
+ self.notifyUpdate(self.name, val)
return True
- self._trans(self._var, self._default_value)
+ self._trans(self._var, self.default_value)
+ self.notifyUpdate(self.name, val)
return False
-
##
# @if jp
# @class ConfigAdmin
@@ -347,6 +399,7 @@
self._emptyconf = OpenRTM_aist.Properties()
self._newConfig = []
self._listeners = OpenRTM_aist.ConfigurationListeners()
+ self._changedParam = []
##
# @if jp
@@ -414,17 +467,68 @@
if trans is None:
trans = OpenRTM_aist.stringTo
+ if not param_name or not def_val:
+ return False
+
if self.isExist(param_name):
return False
if not trans(var, def_val):
return False
+ conf_ = Config(param_name, var, def_val, trans)
+ self._params.append(conf_)
+ conf_.setCallback(self.onUpdateParam)
+ self.update(self.getActiveId(), param_name)
- self._params.append(Config(param_name, var, def_val, trans))
return True
##
+ # @if jp
+ #
+ # @brief コンフィギュレーションパラメータの解除
+ #
+ # コンフィギュレーションパラメータと変数のバインドを解除する。
+ # 指定した名称のコンフィギュレーションパラメータが存在しない場合は
+ # falseを返す。
+ #
+ # @param param_name コンフィギュレーションパラメータ名
+ # @return 設定結果(設定成功:true,設定失敗:false)
+ #
+ # @else
+ #
+ # @brief Unbinding configuration parameters
+ #
+ # Unbind configuration parameter from its variable. It returns
+ # false, if configuration parameter of specified name has already
+ # existed.
+ #
+ # @param param_name Configuration parameter name
+ # @return Setup result (Successful:true, Failed:false)
+ #
+ # @endif
+ #
+ # bool unbindParameter(const char* param_name);
+ def unbindParameter(self, param_name):
+ find_idx = -1
+ for (find_idx,param) in enumerate(self._params):
+ if param.name == param_name:
+ break
+ if find_idx == -1:
+ return False
+
+ del self._params[find_idx]
+
+ # configsets
+ leaf = self._configsets.getLeaf()
+ for i in range(len(leaf)):
+ if leaf[i].hasKey(param_name):
+ leaf[i].removeNode(param_name)
+
+ return True
+
+
+ ##
# void update(void);
#
# @if jp
@@ -530,24 +634,28 @@
if config_set and config_param is None:
if self._configsets.hasKey(config_set) is None:
return
+ self._changedParam = []
prop = self._configsets.getNode(config_set)
for i in range(len(self._params)):
if prop.hasKey(self._params[i].name):
+ # self._changedParam is updated here
self._params[i].update(prop.getProperty(self._params[i].name))
- self.onUpdate(config_set)
+ self.onUpdate(config_set)
# update(const char* config_set, const char* config_param)
if config_set and config_param:
+ self._changedParam = []
key = config_set
key = key+"."+config_param
for conf in self._params:
if conf.name == config_param:
conf.update(self._configsets.getProperty(key))
- self.onUpdateParam(config_set, config_param)
+ #self.onUpdateParam(config_set, config_param)
return
# update()
if config_set is None and config_param is None:
+ self._changedParam = []
if self._changed and self._active:
self.update(self._activeId)
self._changed = False
@@ -621,7 +729,30 @@
##
# @if jp
+ #
+ # @brief 変更されたパラメータのリスト
#
+ # コンフィギュレーションパラメータのうち変更されたもののリストを返す。
+ #
+ # @return 変更されたパラメータ名リスト
+ #
+ # @else
+ #
+ # @brief Changed parameters list
+ #
+ # This operation returns parameter list which are changed.
+ #
+ # @return Changed parameters list
+ #
+ # @endif
+ #
+ # coil::vstring& changedParameters() { return m_changedParam; }
+ def changedParameters(self):
+ return self._changedParam
+
+ ##
+ # @if jp
+ #
# @brief アクティブ・コンフィギュレーションセットIDの取得
#
# 現在アクティブなコンフィギュレーションセットのIDを取得する。
@@ -794,13 +925,14 @@
# @endif
# bool setConfigurationSetValues(const coil::Properties& config_set)
def setConfigurationSetValues(self, config_set):
- if config_set.getName() == "" or config_set.getName() is None:
+ node_ = config_set.getName()
+ if node_ == "" or node_ is None:
return False
- if not self._configsets.hasKey(config_set.getName()):
+ if not self._configsets.hasKey(node_):
return False
- p = self._configsets.getNode(config_set.getName())
+ p = self._configsets.getNode(node_)
if p is None:
return False
@@ -1441,8 +1573,8 @@
# 設定されてるコールバックオブジェクトを呼び出す。
#
# @param self
- # @param config_set コンフィギュレーションID
# @param config_param コンフィギュレーションパラメータ名
+ # @param config_value コンフィギュレーション値
#
# @else
#
@@ -1451,15 +1583,16 @@
# Call the set callback object.
#
# @param self
- # @param config_set configuration-set ID.
# @param config_param configuration parameter name.
+ # @param config_value configuration value.
#
# @endif
#
- # void onUpdateParam(const char* config_set, const char* config_param);
- def onUpdateParam(self, config_set, config_param):
- self._listeners.configparam_[OpenRTM_aist.ConfigurationParamListenerType.ON_UPDATE_CONFIG_PARAM].notify(config_set,
- config_param)
+ # void onUpdateParam(const char* config_param, const char* config_value);
+ def onUpdateParam(self, config_param, config_value):
+ self._changedParam.append(config_param)
+ self._listeners.configparam_[OpenRTM_aist.ConfigurationParamListenerType.ON_UPDATE_CONFIG_PARAM].notify(config_param,
+ config_value)
return
Modified: trunk/OpenRTM-aist-Python/OpenRTM_aist/ConfigurationListener.py
===================================================================
--- trunk/OpenRTM-aist-Python/OpenRTM_aist/ConfigurationListener.py 2011-12-15 03:19:12 UTC (rev 498)
+++ trunk/OpenRTM-aist-Python/OpenRTM_aist/ConfigurationListener.py 2011-12-15 03:22:30 UTC (rev 499)
@@ -48,7 +48,7 @@
# Configuration パラメータの変更に関するリスナクラス。
# 以下のイベントに対してコールバックされる。
#
-# - ON_UPDATE_CONFIG_PARAM
+# - ON_UPDATE_CONFIG_PARAM: パラメータが変更された
#
# @else
# @class ConfigurationParamListener class
Modified: trunk/OpenRTM-aist-Python/OpenRTM_aist/RTObject.py
===================================================================
--- trunk/OpenRTM-aist-Python/OpenRTM_aist/RTObject.py 2011-12-15 03:19:12 UTC (rev 498)
+++ trunk/OpenRTM-aist-Python/OpenRTM_aist/RTObject.py 2011-12-15 03:22:30 UTC (rev 499)
@@ -2598,6 +2598,78 @@
##
# @if jp
#
+ # @brief コンフィギュレーションサービスを取得する
+ #
+ # コンフィギュレーションサービスオブジェクトを取得する。このサービ
+ # スオブジェクトを利用して、コンフィギュレーションパラメータの操作
+ # を行うことができる。主な操作としては、
+ #
+ # - unbindParameter(): パラメータのアンバインド
+ # - update(): パラメータの更新
+ # - update(set_name): 特定のセットの更新
+ # - update(set_name, param_name): 特定のセットのパラメータの更新
+ # - isExist(): パラメータの存在確認
+ # - isChanged(): パラメータが変更されたかの確認
+ # - changedParameters(): 変更さえたパラメータのリスト
+ # - getActiveId(): アクティブセット名の取得
+ # - haveConfig(config_id): コンフィグセットを持っているかどうか
+ # - getConfigurationSets(): 全コンフィギュレーションセットの取得
+ # - getConfigurationSet(set_id): 特定セットを取得
+ #
+ # コールバック関連
+ # - addConfigurationParamListener(): リスナの追加
+ # - removeConfigurationParamListener(): リスナの削除
+ # - addConfigurationSetListener(): リスナの追加
+ # - removeConfigurationSetListener(): リスナの削除
+ # - addConfigurationSetNameListener(): リスナの追加
+ # - removeConfigurationSetNameListener(): リスナの削除
+ #
+ # 詳細はConfigAdminクラスリファレンスを参照のこと。
+ #
+ # @return ConfigAdmin object
+ #
+ # @else
+ #
+ # @brief Getting configuration service
+ #
+ # This operation returns configuration service object. By using
+ # this service, user can manipulate configuration
+ # parameters. Mainly the following operations are supported.
+ #
+ # - unbindParameter(): Unbinding parameters
+ # - update(): Updateing parameters
+ # - update(set_name): Updating a specific configuration set
+ # - update(set_name, param_name): Updating specific parameter in a set
+ # - isExist(): Checking existence of a parameter
+ # - isChanged(): Check if a parameter was updated
+ # - changedParameters(): Getting changed parameter list
+ # - getActiveId(): Getting active configuration set name
+ # - haveConfig(config_id): Checking if having a specified configuration set
+ # - getConfigurationSets(): getting all the configuration sets
+ # - getConfigurationSet(set_id): Getting a configuration set
+ #
+ # Callback related member functions
+ # - addConfigurationParamListener(): Adding listener
+ # - removeConfigurationParamListener(): Removing listener
+ # - addConfigurationSetListener(): Adding listener
+ # - removeConfigurationSetListener(): Removing listener
+ # - addConfigurationSetNameListener(): Adding listener
+ # - removeConfigurationSetNameListener(): Removing listener
+ #
+ # See details in the ConfigAdmin class reference
+ #
+ # @return ConfigAdmin object
+ #
+ # @endif
+ #
+ # ConfigAdmin& getConfigService() { return m_configsets; }
+ def getConfigService(self):
+ return self._configsets
+
+
+ ##
+ # @if jp
+ #
# @brief コンフィギュレーションパラメータの更新(ID指定)
#
# 指定したIDのコンフィギュレーションセットに設定した値で、
Modified: trunk/OpenRTM-aist-Python/OpenRTM_aist/test/test_ConfigAdmin.py
===================================================================
--- trunk/OpenRTM-aist-Python/OpenRTM_aist/test/test_ConfigAdmin.py 2011-12-15 03:19:12 UTC (rev 498)
+++ trunk/OpenRTM-aist-Python/OpenRTM_aist/test/test_ConfigAdmin.py 2011-12-15 03:22:30 UTC (rev 499)
@@ -89,6 +89,14 @@
self._ca.bindParameter("str_param0", self.str_param0, "hoge")
self._ca.bindParameter("str_param1", self.str_param1, "dara")
self._ca.bindParameter("vector_param0", self.vector_param0, "0.0,1.0,2.0,3.0,4.0")
+ print "Changed Parameters: ", self._ca.changedParameters()
+ self.assertEqual(True,self._ca.unbindParameter("int_param0"))
+ self.assertEqual(True,self._ca.unbindParameter("int_param1"))
+ self.assertEqual(True,self._ca.unbindParameter("double_param0"))
+ self.assertEqual(True,self._ca.unbindParameter("double_param1"))
+ self.assertEqual(True,self._ca.unbindParameter("str_param0"))
+ self.assertEqual(True,self._ca.unbindParameter("str_param1"))
+ self.assertEqual(True,self._ca.unbindParameter("vector_param0"))
return
def test_update(self):
@@ -180,29 +188,29 @@
return
def test_setOnUpdate(self):
- self._ca.setOnUpdate(None)
+ self._ca.setOnUpdate(self.CallBack)
return
def test_setOnUpdateParam(self):
- self._ca.setOnUpdateParam(None)
+ self._ca.setOnUpdateParam(self.CallBack)
return
def test_setOnSetConfigurationSet(self):
- self._ca.setOnSetConfigurationSet(None)
+ self._ca.setOnSetConfigurationSet(self.CallBack)
return
def test_setOnAddConfigurationSet(self):
- self._ca.setOnAddConfigurationSet(None)
+ self._ca.setOnAddConfigurationSet(self.CallBack)
return
def test_setOnRemoveConfigurationSet(self):
- self._ca.setOnRemoveConfigurationSet(None)
+ self._ca.setOnRemoveConfigurationSet(self.CallBack)
return
def test_setOnActivateSet(self):
- self._ca.setOnActivateSet(None)
+ self._ca.setOnActivateSet(self.CallBack)
return
openrtm-commit メーリングリストの案内