[openrtm-commit:00572] r632 - branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC

openrtm @ openrtm.org openrtm @ openrtm.org
2012年 1月 11日 (水) 11:01:17 JST


Author: fsi-katami
Date: 2012-01-11 11:01:17 +0900 (Wed, 11 Jan 2012)
New Revision: 632

Modified:
   branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/Config.java
   branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/ConfigAdmin.java
   branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/ConfigBase.java
Log:
The callback of the configuration is added. refs #2267 

Modified: branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/Config.java
===================================================================
--- branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/Config.java	2012-01-11 01:52:11 UTC (rev 631)
+++ branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/Config.java	2012-01-11 02:01:17 UTC (rev 632)
@@ -45,8 +45,14 @@
      * 
      */
     public boolean update(final String val){
+        if (string_value.equals(val)) {
+             return true; 
+        }
+        string_value = val;
+        // value changed
         try {
             m_var.stringFrom(val);
+            notifyUpdate(name,val);
             return true;
         } catch (Exception ex) {
             try {
@@ -54,6 +60,7 @@
             } catch (Exception e) {
             }
         }
+        notifyUpdate(name,val);
         return false;
     }
 

Modified: branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/ConfigAdmin.java
===================================================================
--- branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/ConfigAdmin.java	2012-01-11 01:52:11 UTC (rev 631)
+++ branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/ConfigAdmin.java	2012-01-11 02:01:17 UTC (rev 632)
@@ -1,21 +1,16 @@
 package jp.go.aist.rtm.RTC;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.Vector;
 
-import jp.go.aist.rtm.RTC.util.OnActivateSetCallbackFunc;
+import jp.go.aist.rtm.RTC.util.OnActivateSetCallbackFunc;
+import jp.go.aist.rtm.RTC.util.OnAddConfigurationAddCallbackFunc;
+import jp.go.aist.rtm.RTC.util.OnRemoveConfigurationSetCallbackFunc;
+import jp.go.aist.rtm.RTC.util.OnSetConfigurationSetCallbackFunc;
+import jp.go.aist.rtm.RTC.util.OnUpdateCallbackFunc;
+import jp.go.aist.rtm.RTC.util.OnUpdateParamCallbackFunc;
 
-import jp.go.aist.rtm.RTC.util.OnAddConfigurationAddCallbackFunc;
-
-import jp.go.aist.rtm.RTC.util.OnRemoveConfigurationSetCallbackFunc;
-
-import jp.go.aist.rtm.RTC.util.OnSetConfigurationSetCallbackFunc;
-
-import jp.go.aist.rtm.RTC.util.OnUpdateCallbackFunc;
-
-import jp.go.aist.rtm.RTC.util.OnUpdateParamCallbackFunc;
-
-
 import jp.go.aist.rtm.RTC.util.Properties;
 import jp.go.aist.rtm.RTC.util.ValueHolder;
 
@@ -320,7 +315,9 @@
      */
     public void destruct() {
         for(int intIdx=0; intIdx<m_params.size(); ++intIdx) {
-            if( m_params.elementAt(intIdx) != null ) m_params.setElementAt(null, intIdx);
+            if( m_params.get(intIdx) != null ) {
+                m_params.set(intIdx,null);
+            }
         }
         m_params.clear();
     }
@@ -370,10 +367,47 @@
         } catch(Exception ex) {
             return false;
         }
-        m_params.add(new Config(param_name, var, def_val));
+        Config config = new Config(param_name, var, def_val);
+        m_params.add(config);
+        config.setCallback(this, "onUpdateParam");
         return true;
     }
+    /**
+     * {@.ja コンフィギュレーションパラメータの解除}
+     * {@.en Unbinding configuration parameters}
+     * <p>
+     * {@.ja コンフィギュレーションパラメータと変数のバインドを解除する。
+     * 指定した名称のコンフィギュレーションパラメータが存在しない場合は
+     * falseを返す。}
+     * {@.en Unbind configuration parameter from its variable. It returns
+     * false, if configuration parameter of specified name has already
+     * existed.}
+     *
+     * @param param_name 
+     *   {@.ja コンフィギュレーションパラメータ名}
+     *   {@.en Configuration parameter name}
+     * @return 
+     *   {@.ja 設定結果(設定成功:true,設定失敗:false)}
+     *   {@.en Setup result (Successful:true, Failed:false)}
+     */
+    public boolean unbindParameter(final String param_name){
+        Iterator<ConfigBase> iterator = m_params.iterator();
+        while (iterator.hasNext()) {
+            ConfigBase cb = iterator.next();
+            if( new find_conf(param_name).equalof(cb) ) {
+                m_params.remove(cb);
+                // configsets
+                final Vector<Properties> leaf = m_configsets.getLeaf();
 
+                for (int ic=0; ic < leaf.size(); ++ic) {
+                    Properties p = leaf.get(ic).removeNode(param_name);
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * {@.ja コンフィギュレーションパラメータの更新(ID指定)。}
      * {@.en Update configuration parameter (By ID)}
@@ -408,8 +442,8 @@
         Properties prop = new Properties(m_configsets.getNode(config_set));
 
         for(int intIdx=0; intIdx<m_params.size(); ++intIdx) {
-            if( prop.hasKey(m_params.elementAt(intIdx).name) != null ) {
-                m_params.elementAt(intIdx).update(prop.getProperty(m_params.elementAt(intIdx).name));
+            if( prop.hasKey(m_params.get(intIdx).name) != null ) {
+                m_params.get(intIdx).update(prop.getProperty(m_params.get(intIdx).name));
                 onUpdate(config_set);
             }
         }
@@ -1382,7 +1416,8 @@
      * バインド対象パラメータ・リスト
      */
 
-    private Vector<ConfigBase> m_params = new Vector<ConfigBase>();
+    //private Vector<ConfigBase> m_params = new Vector<ConfigBase>();
+    private ArrayList<ConfigBase> m_params = new ArrayList<ConfigBase>();
     /**
      * アクティブ・コンフィギュレーションセットID
      */

Modified: branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/ConfigBase.java
===================================================================
--- branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/ConfigBase.java	2012-01-11 01:52:11 UTC (rev 631)
+++ branches/work/ConfigurationCallback/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/ConfigBase.java	2012-01-11 02:01:17 UTC (rev 632)
@@ -1,5 +1,6 @@
 package jp.go.aist.rtm.RTC;
 
+import java.lang.reflect.Method;
   /**
    * {@.ja コンフィギュレーション情報保持用クラスの基底抽象クラス。}
    * {@.en This is the abstract interface class to hold various configuration 
@@ -42,6 +43,9 @@
     public ConfigBase(final String name_, final String def_val) {
         this.name = name_;
         this.default_value = def_val;
+        string_value = new String();
+        m_admin = null;
+        m_callback_name = null;
     }
 
     /**
@@ -66,6 +70,41 @@
     public abstract boolean update(final String val);
 
     /**
+     * {@.ja コールバックのセット}
+     * {@.en Setting callback}
+     * <p>
+     * {@.ja 変数変更時にコールされるコールバック関数をセットする.}
+     * {@.en This member function sets callback function which is called
+     * when variable is changed.}
+     *
+     */
+    public void setCallback(ConfigAdmin cadmin, String cbf) {
+        m_admin = cadmin;
+        m_callback_name = cbf;
+    }
+
+    /**
+     * {@.ja 変数変更を知らせるオブザーバ関数}
+     * {@.en Observer function to notify variable changed}
+     * <p>
+     * {@.ja 変数変更を知らせるオブザーバ関数.}
+     * {@.en This function notifies variable has been changed.}
+     *
+     */
+    public void notifyUpdate(final String key, final String val){
+        try {
+            Class clazz = m_admin.getClass();
+
+            Method method = clazz.getMethod(m_callback_name,
+                                            String.class,String.class);
+
+            method.invoke(m_admin, key, val);
+        }
+        catch(java.lang.Exception e){
+        }
+    }
+    
+    /**
      * {@.ja コンフィギュレーション名}
      * {@.en Configuration name}
      */
@@ -75,4 +114,19 @@
      * {@.en Default value in string format}
      */
     public final String default_value;
+    /**
+     * {@.ja 文字列形式の現在値}
+     * {@.en Current value in string format}
+     */
+    protected String string_value;
+    /**
+     * {@.ja ConfigAdminオブジェクトへのポインタ}
+     * {@.en A pointer to the ConfigAdmin object}
+     */
+    protected ConfigAdmin m_admin;
+    /**
+     * {@.ja コールバックのメンバ関数名}
+     * {@.en A member function pointer to the callback function name.}
+     */
+    protected String m_callback_name;
 }



openrtm-commit メーリングリストの案内