[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 メーリングリストの案内