[openrtm-commit:02415] r940 - in trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC: . RTC

openrtm @ openrtm.org openrtm @ openrtm.org
2017年 2月 10日 (金) 14:59:48 JST


Author: win-ei
Date: 2017-02-10 14:59:48 +0900 (Fri, 10 Feb 2017)
New Revision: 940

Modified:
   trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/PostFsmActionListener.java
   trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/RTC/ComponentObserverConsumer.java
   trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/RTObject_impl.java
Log:
[FSM4RTC] ComponentObserver implementation has been added. refs #3769

Modified: trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/PostFsmActionListener.java
===================================================================
--- trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/PostFsmActionListener.java	2017-02-09 08:21:16 UTC (rev 939)
+++ trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/PostFsmActionListener.java	2017-02-10 05:59:48 UTC (rev 940)
@@ -124,8 +124,10 @@
    */
 public abstract class PostFsmActionListener implements Observer{
     public void update(Observable o, Object obj) {
-           Integer arg = (Integer)obj;
-           operator(arg.intValue());
+           String arg = (String)obj;
+           operator(arg);
+//           Integer arg = (Integer)obj;
+//           operator(arg.intValue());
     }
     /**
      * {@.ja 仮想コールバック関数}
@@ -135,6 +137,7 @@
      * {@.en This is a the Callback function for PostFsmActionListener.}
      *
      */
-    public abstract void operator(final int exec_handle);
+    public abstract void operator(final String exec_handle);
+    //public abstract void operator(final int exec_handle);
 }
 

Modified: trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/RTC/ComponentObserverConsumer.java
===================================================================
--- trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/RTC/ComponentObserverConsumer.java	2017-02-09 08:21:16 UTC (rev 939)
+++ trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/RTC/ComponentObserverConsumer.java	2017-02-10 05:59:48 UTC (rev 940)
@@ -29,6 +29,8 @@
 import jp.go.aist.rtm.RTC.PreFsmActionListener;
 import jp.go.aist.rtm.RTC.PreFsmActionListenerType;
 import jp.go.aist.rtm.RTC.PostComponentActionListenerArgument;
+import jp.go.aist.rtm.RTC.PostFsmActionListener;
+import jp.go.aist.rtm.RTC.PostFsmActionListenerType;
 
 import jp.go.aist.rtm.RTC.ObjectCreator;
 import jp.go.aist.rtm.RTC.ObjectDestructor;
@@ -52,10 +54,112 @@
 import _SDOPackage.NVListHolder;
 import _SDOPackage.ServiceProfile;
   /**
-   * 
-   * 
-   * 
+   * {@.ja ComponentObserver モジュール}
+   * <p>
+   *
+   * {@.ja コンポーネントの各種状態をComponentObserverサービスに対してコール
+   * バックするためのクラス。ツール等、コンポーネントの状態変化を知りた
+   * いエンティティがサービスプロバイダを当該コンポーネントに対してセッ
+   * トすると、対応する本コンシューマがアタッチされ、コンポーネントの状
+   * 態変化に応じて、update_status() オペレーションをSTATUS_KIND とヒン
+   * トを引数に呼び出す。本機能は、OMG の FSM4RTC仕様
+   * (formal/16-04-01) 7.2.4.2 ComponentObserver Interface に記述されて
+   * いる。
+   *
+   * STATUS_KIND には以下の種類がある。
+   * <ul> 
+   * <li>- COMPONENT_PROFILE: コンポーネントのプロファイル情報が変化
+   * <li>- RTC_STATUS       : コンポーネントの状態 (Init, Alive) が変化
+   * <li>- EC_STATUS        : ECの状態 (Inavtive, Active, Error) が変化
+   * <li>- PORT_PROFILE     : ポートのプロファイルが変化
+   * <li>- CONFIGURATION    : コンフィギュレーションが変化
+   * <li>- RTC_HEARTBEAT    : RTCの生存確認のハートビード
+   * <li>- EC_HEARTBEAT     : ECの生存確認のハートビート
+   * <li>- FSM_PROFILE      : FSMのプロファイルが変化
+   * <li>- FSM_STATUS       : FSMの状態が変化
+   * <li>- FSM_STRUCTURE    : FSMの構造が変化
+   * <li>- USER_DEFINED     : ユーザ定義
+   * </ul> 
+   *
+   * <br>
+   * \subsection COMPONENT_PROFILE COMPONENT_PROFILE
+   * <br>
+   * コンポーネントのプロファイル情報が変化した際にこのタグ名(enum値)を
+   * 第1引数にして update_status() オペレーションが呼び出される。(未実装)
+   *
+   * <br>
+   * \subsection RTC_STATUS RTC_STATUS
+   * <br>
+   * コンポーネントの状態 (Init, Alive) が変化した際にこのタグ名
+   * (enum値)を第1引数にして update_status() オペレーションが呼び出され
+   * る。厳密にはECの状態であるが、Inavtive, Active, Error, Finalize の
+   * 4つの状態に変化したことを検知することができる。以下の状態変化時に、
+   * それぞれヒントとして以下の文字列とともにコールバックされる。
+   *
+   * <ul> 
+   * <li>- onActivated 呼び出し成功時:   ACTIVE: <EC id>
+   * <li>- onDeactivated 呼び出し成功時: INACTIVE: <EC id>
+   * <li>- onReset 呼び出し成功時:       INACTIVE: <EC id>
+   * <li>- onAborting 呼び出し成功時:    ERROR: <EC id>
+   * <li>- onFinalize 呼び出し成功時:    FINALIZE: <EC id>
+   * </ul> 
+   *
+   * <br>
+   * \subsection EC_STATUS EC_STATUS
+   *
+   * <br>
+   * ECの状態 (Inavtive, Active, Error) が変化した際にこのタグ名(enum値)を
+   * 第1引数にして update_status() オペレーションが呼び出される。
+   *
+   * <br>
+   * \subsection PORT_PROFILE PORT_PROFILE
+   * ポートのプロファイルが変化した際にこのタグ名(enum値)を
+   * <br>
+   * 第1引数にして update_status() オペレーションが呼び出される。
+   *
+   * <br>
+   * \subsection CONFIGURATION CONFIGURATION
+   * コンフィギュレーションが変化した際にこのタグ名(enum値)を
+   * <br>
+   * 第1引数にして update_status() オペレーションが呼び出される。
+   *
+   * <br>
+   * \subsection RTC_HEARTBEAT RTC_HEARTBEAT
+   * RTCの生存確認のハートビードした際にこのタグ名(enum値)を
+   * <br>
+   * 第1引数にして update_status() オペレーションが呼び出される。
+   *
+   * <br>
+   * \subsection EC_HEARTBEAT EC_HEARTBEAT
+   * <br>
+   * ECの生存確認のハートビートした際にこのタグ名(enum値)を
+   * 第1引数にして update_status() オペレーションが呼び出される。
+   *
+   * <br>
+   * \subsection FSM_PROFILE FSM_PROFILE
+   * <br>
+   * FSMのプロファイルが変化した際にこのタグ名(enum値)を
+   * 第1引数にして update_status() オペレーションが呼び出される。
+   *
+   * <br>
+   * \subsection FSM_STATUS FSM_STATUS
+   * <br>
+   * FSMの状態が変化した際にこのタグ名(enum値)を
+   * 第1引数にして update_status() オペレーションが呼び出される。
+   *
+   * <br>
+   * \subsection FSM_STRUCTURE FSM_STRUCTURE
+   * <br>
+   * FSMの構造が変化した際にこのタグ名(enum値)を
+   * 第1引数にして update_status() オペレーションが呼び出される。
+   *
+   * <br>
+   * \subsection USER_DEFINED USER_DEFINED
+   * <br>
+   * ユーザ定義した際にこのタグ名(enum値)を
+   * 第1引数にして update_status() オペレーションが呼び出される。}
    */
+
 public class ComponentObserverConsumer implements SdoServiceConsumerBase, CallbackFunction, ObjectCreator<SdoServiceConsumerBase>, ObjectDestructor{
     /**
      * {@.ja ctor of ComponentObserverConsumer}
@@ -67,10 +171,6 @@
         m_portaction = new PortAction(this);
         m_ecaction = new ECAction(this);
         m_configMsg = new ConfigAction(this);
-//        m_interval = new TimeValue(0, 100000);
-//        m_heartbeat = false;
-//        m_hblistenerid = null;
-//        m_timer = new Timer(m_interval);
         m_fsmaction = new FSMAction(this);
         m_rtcInterval = new TimeValue(0, 100000);
         m_rtcHeartbeat = false;
@@ -106,7 +206,6 @@
                 new NVListHolder(profile.properties);
         Properties prop = new Properties();
         NVUtil.copyToProperties(prop, nvholder);
-//        setHeartbeat(prop);
         setRTCHeartbeat(prop);
         setECHeartbeat(prop);
         setListeners(prop);
@@ -132,7 +231,6 @@
                 new NVListHolder(profile.properties);
         Properties prop = new Properties();
         NVUtil.copyToProperties(prop, nvholder);
-//        setHeartbeat(prop);
         setRTCHeartbeat(prop);
         setListeners(prop);
         return true;
@@ -156,7 +254,6 @@
         unsetPortProfileListeners();
         unsetExecutionContextListeners();
         unsetConfigurationListeners();
-//        unsetHeartbeat();
         unsetRTCHeartbeat();
         unsetECHeartbeat();
     }
@@ -194,7 +291,7 @@
      * {@.en Connectiong listeners to RTObject}
      */
     protected void setListeners(Properties prop) {
-        if (prop.getProperty("observed_status").length()<1) {
+        if (prop.getProperty("observed_status").isEmpty()) {
             prop.setProperty("observed_status", "ALL");
         }
 
@@ -277,7 +374,7 @@
                     bflag,
                     this,
                     "setFSMStatusListeners",
-                    "nsetFSMStatusListeners");
+                    "unsetFSMStatusListeners");
         m_observed[StatusKind._FSM_STATUS] = bflag.v.booleanValue();
 
         bflag.v = new Boolean(m_observed[StatusKind._FSM_STRUCTURE]);
@@ -341,7 +438,6 @@
      * {@.ja ハートビートを設定する}
      * {@.en Setting heartbeat}
      */
-    //protected void setHeartbeat(Properties prop) {
     protected void setRTCHeartbeat(Properties prop) {
         // if rtc_heartbeat is set, use it.
         if (prop.hasKey("rtc_heartbeat.enable") != null) {
@@ -352,7 +448,7 @@
         }
         if (StringUtil.toBool(prop.getProperty("heartbeat.enable"), "YES", "NO", false)) {
             String interval = prop.getProperty("heartbeat.interval");
-            if (interval.length()<1) {
+            if (interval.isEmpty()) {
                 m_rtcInterval.convert(1.0);
             }
             else {
@@ -401,7 +497,7 @@
         // if rtc_heartbeat is set, use it.
         if (StringUtil.toBool(prop.getProperty("ec_heartbeat.enable"), "YES", "NO", false)) {
             String interval = prop.getProperty("ec_heartbeat.interval");
-            if (interval.length()<1) {
+            if (interval.isEmpty()) {
                 m_ecInterval.convert(1.0);
             }
             else {
@@ -652,9 +748,50 @@
      * {@.en Setting FsmStructure listener}
      */
     protected void setFSMStructureListeners(){
-        m_fsmaction.fsmActionListener = 
-          m_rtobj.addPreFsmActionListener(PreFsmActionListenerType.PRE_ON_STATE_CHANGE, m_fsmaction, "updateFsmStatus");
-        ;
+//        m_fsmaction.fsmActionListener = 
+//          m_rtobj.addPreFsmActionListener(PreFsmActionListenerType.PRE_ON_STATE_CHANGE, m_fsmaction, "updateFsmStatus");
+//        ;
+        m_fsmaction.preOnFsmInitListener =
+          m_rtobj.addPreFsmActionListener(PreFsmActionListenerType.PRE_ON_INIT,
+                                       m_fsmaction,
+                                       "preInit");
+        m_fsmaction.preOnFsmEntryListener =
+          m_rtobj.addPreFsmActionListener(PreFsmActionListenerType.PRE_ON_ENTRY,
+                                       m_fsmaction,
+                                       "preEntry");
+        m_fsmaction.preOnFsmDoListener =
+          m_rtobj.addPreFsmActionListener(PreFsmActionListenerType.PRE_ON_DO,
+                                       m_fsmaction,
+                                       "preDo");
+        m_fsmaction.preOnFsmExitListener =
+          m_rtobj.addPreFsmActionListener(PreFsmActionListenerType.PRE_ON_EXIT,
+                                       m_fsmaction,
+                                       "preExit");
+        m_fsmaction.preOnFsmStateChangeListener =
+          m_rtobj.addPreFsmActionListener(PreFsmActionListenerType.PRE_ON_STATE_CHANGE,
+                                       m_fsmaction,
+                                       "preStateChange");
+
+        m_fsmaction.postOnFsmInitListener =
+          m_rtobj.addPostFsmActionListener(PostFsmActionListenerType.POST_ON_INIT,
+                                       m_fsmaction,
+                                       "postInit");
+        m_fsmaction.postOnFsmEntryListener =
+          m_rtobj.addPostFsmActionListener(PostFsmActionListenerType.POST_ON_ENTRY,
+                                       m_fsmaction,
+                                       "postEntry");
+        m_fsmaction.postOnFsmDoListener =
+          m_rtobj.addPostFsmActionListener(PostFsmActionListenerType.POST_ON_DO,
+                                       m_fsmaction,
+                                       "postDo");
+        m_fsmaction.postOnFsmExitListener =
+          m_rtobj.addPostFsmActionListener(PostFsmActionListenerType.POST_ON_EXIT,
+                                        m_fsmaction,
+                                        "postExit");
+        m_fsmaction.postOnFsmStateChangeListener =
+          m_rtobj.addPostFsmActionListener(PostFsmActionListenerType.POST_ON_EXIT,
+                                        m_fsmaction,
+                                        "postStateChange");
     }
 
     /**
@@ -662,7 +799,36 @@
      * {@.en Unsetting FsmStructure listener}
      */
     protected void unsetFSMStructureListeners(){
-        ;
+      m_rtobj.
+        removePreFsmActionListener(PreFsmActionListenerType.PRE_ON_INIT,
+                                   m_fsmaction.preOnFsmInitListener);
+      m_rtobj.
+        removePreFsmActionListener(PreFsmActionListenerType.PRE_ON_ENTRY,
+                                   m_fsmaction.preOnFsmEntryListener);
+      m_rtobj.
+        removePreFsmActionListener(PreFsmActionListenerType.PRE_ON_DO,
+                                   m_fsmaction.preOnFsmDoListener);
+      m_rtobj.
+        removePreFsmActionListener(PreFsmActionListenerType.PRE_ON_EXIT,
+                                   m_fsmaction.preOnFsmExitListener);
+      m_rtobj.
+        removePreFsmActionListener(PreFsmActionListenerType.PRE_ON_STATE_CHANGE,
+                                   m_fsmaction.preOnFsmStateChangeListener);
+      m_rtobj.
+        removePostFsmActionListener(PostFsmActionListenerType.POST_ON_INIT,
+                                    m_fsmaction.postOnFsmInitListener);
+      m_rtobj.
+        removePostFsmActionListener(PostFsmActionListenerType.POST_ON_ENTRY,
+                                    m_fsmaction.postOnFsmEntryListener);
+      m_rtobj.
+        removePostFsmActionListener(PostFsmActionListenerType.POST_ON_DO,
+                                    m_fsmaction.postOnFsmDoListener);
+      m_rtobj.
+        removePostFsmActionListener(PostFsmActionListenerType.POST_ON_EXIT,
+                                    m_fsmaction.postOnFsmExitListener);
+      m_rtobj.
+        removePostFsmActionListener(PostFsmActionListenerType.POST_ON_EXIT,
+                                    m_fsmaction.postOnFsmStateChangeListener);
     }
 
     //============================================================
@@ -957,13 +1123,77 @@
             m_coc = coc;
         }
         // Action callback functions here
-        public  void updateFsmStatus(final String state) {
+        public void updateFsmStatus(final String state) {
             System.out.println(
                "ComponentObserver::updateFsmStatus(" + state + ")" ); 
             m_coc.updateStatus(StatusKind.from_int(StatusKind._FSM_STATUS), state);
         }
+
+        public void preInit(final String state) {
+            String msg = state; 
+            msg += " PRE_ON_INIT";
+            m_coc.updateStatus(StatusKind.from_int(StatusKind._FSM_STATUS), msg);
+        }
+        public void preEntry(final String state) {
+            String msg = state; 
+            msg += " PRE_ONENTRY";
+            m_coc.updateStatus(StatusKind.from_int(StatusKind._FSM_STATUS), msg);
+        }
+        public void preDo(final String state) {
+            String msg = state; 
+            msg += " PRE_ON_DO";
+            m_coc.updateStatus(StatusKind.from_int(StatusKind._FSM_STATUS), msg);
+        }
+        public void preExit(final String state) {
+            String msg = state; 
+            msg += " PRE_ON_EXIT";
+            m_coc.updateStatus(StatusKind.from_int(StatusKind._FSM_STATUS), msg);
+        }
+        public void preStateChange(final String state) {
+            String msg = state; 
+            msg += " PRE_ON_STATE_CHANGE";
+            m_coc.updateStatus(StatusKind.from_int(StatusKind._FSM_STATUS), msg);
+        }
+
+        public void postInit(final String state, ReturnCode_t ret) {
+            String msg = state; 
+            msg += " POST_ON_INIT";
+            m_coc.updateStatus(StatusKind.from_int(StatusKind._FSM_STATUS), msg);
+        }
+        public void postEntry(final String state, ReturnCode_t ret) {
+            String msg = state; 
+            msg += " POST_ONENTRY";
+            m_coc.updateStatus(StatusKind.from_int(StatusKind._FSM_STATUS), msg);
+        }
+        public void postDo(final String state, ReturnCode_t ret) {
+            String msg = state; 
+            msg += " POST_ON_DO";
+            m_coc.updateStatus(StatusKind.from_int(StatusKind._FSM_STATUS), msg);
+        }
+        public void postExit(final String state, ReturnCode_t ret) {
+            String msg = state; 
+            msg += " POST_ON_EXIT";
+            m_coc.updateStatus(StatusKind.from_int(StatusKind._FSM_STATUS), msg);
+        }
+        public void postStateChange(final String state, ReturnCode_t ret) {
+            String msg = state; 
+            msg += " POST_ON_STATE_CHNAGE";
+            m_coc.updateStatus(StatusKind.from_int(StatusKind._FSM_STATUS), msg);
+        }
       
         // Listener object's pointer holder
+        public PreFsmActionListener preOnFsmInitListener;
+        public PreFsmActionListener preOnFsmEntryListener;
+        public PreFsmActionListener preOnFsmDoListener;
+        public PreFsmActionListener preOnFsmExitListener;
+        public PreFsmActionListener preOnFsmStateChangeListener;
+      
+        public PostFsmActionListener postOnFsmInitListener;
+        public PostFsmActionListener postOnFsmEntryListener;
+        public PostFsmActionListener postOnFsmDoListener;
+        public PostFsmActionListener postOnFsmExitListener;
+        public PostFsmActionListener postOnFsmStateChangeListener;
+
         public PreFsmActionListener fsmActionListener;
 
         private ComponentObserverConsumer m_coc;
@@ -1016,10 +1246,6 @@
     private ConfigAction m_configMsg;
     private FSMAction m_fsmaction;
 
-//    private TimeValue m_interval;
-//    private boolean m_heartbeat;
-//    private ListenerBase m_hblistenerid;
-
     private TimeValue m_rtcInterval;
     private boolean m_rtcHeartbeat;
     private ListenerBase m_rtcHblistenerid;

Modified: trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/RTObject_impl.java
===================================================================
--- trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/RTObject_impl.java	2017-02-09 08:21:16 UTC (rev 939)
+++ trunk/OpenRTM-aist-Java/jp.go.aist.rtm.RTC/src/jp/go/aist/rtm/RTC/RTObject_impl.java	2017-02-10 05:59:48 UTC (rev 940)
@@ -6089,6 +6089,42 @@
         postaction_[listener_type].addObserver(listener);
     }
   
+    public <DataType> 
+    PostFsmActionListener
+    addPostFsmActionListener(int listener_type,
+                                   DataType obj,
+                                   String memfunc) {
+        class Noname extends PostFsmActionListener {
+            public Noname(DataType obj, String memfunc) {
+                m_obj = obj;
+                try {
+                    Class clazz = m_obj.getClass();
+
+                    m_method = clazz.getMethod(memfunc,String.class);
+
+                }
+                catch(java.lang.Exception e){
+                    rtcout.println(Logbuf.WARN, 
+                        "Exception caught."+e.toString());
+                }
+            }
+            public void operator(final String state) {
+                try {
+                    m_method.invoke(
+                          state);
+                }
+                catch(java.lang.Exception e){
+                    rtcout.println(Logbuf.WARN, 
+                        "Exception caught."+e.toString());
+                }
+            }
+            private DataType m_obj;
+            private Method m_method;
+        };
+        Noname listener = new Noname(obj, memfunc);
+        addPostFsmActionListener(listener_type, listener, true);
+        return listener;
+    }
   
     /**
      * {@.ja PostFsmActionListener リスナを削除する}



More information about the openrtm-commit mailing list