[openrtm-commit:00310] r436 - in branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist: . ext ext/sdo ext/sdo/observer ext/sdo/observer/test
openrtm @ openrtm.org
openrtm @ openrtm.org
2011年 8月 4日 (木) 16:19:11 JST
Author: kurihara
Date: 2011-08-04 16:19:10 +0900 (Thu, 04 Aug 2011)
New Revision: 436
Added:
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/ComponentObserver.idl
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/ComponentObserverConsumer.py
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/RTC.idl
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/SDOPackage.idl
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/doxygen_idlref.conf
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/BasicDataType.idl
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/ComponentObserver.idl
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/DataPort.idl
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/OpenRTM.idl
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/RTC.idl
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/SDOPackage.idl
branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/test_ComponentObserverConsumer.py
Log:
ComponentObserver SDO service consumer has been implemented. refs #2050
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/ComponentObserver.idl
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/ComponentObserver.idl (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/ComponentObserver.idl 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,512 @@
+// -*- IDL -*-
+/*!
+ * @file ComponentObserver.idl
+ * @brief Component observer SDO service
+ * @date $Date$
+ * @author Noriaki Ando <n-ando at aist.go.jp>
+ *
+ * Copyright (C) 2011
+ * Noriaki Ando
+ * Intelligent Systems Research Institute,
+ * National Institute of
+ * Advanced Industrial Science and Technology (AIST), Japan
+ * All rights reserved.
+ *
+ * $Id$
+ *
+ */
+
+#include <SDOPackage.idl>
+#include <RTC.idl>
+
+/*!
+ * @if jp
+ * @brief コンポーネント状態オブザーバインターフェース
+ *
+ * コンポーネントの状態を監視するためのオブザーバインターフェース。オブ
+ * ザーバパターンに従い、外部ツールがコンポーネントにオブザーバオブジェ
+ * クトをセットし、コンポーネントは各種内部状態変更時にをオブザーバオブ
+ * ジェクトをコールし、オブザーバに対して変更を通知する。
+ *
+ * @since 1.1
+ *
+ * @else
+ * @brief Component state observer interface
+ *
+ * This interface defines observer interface for component states.
+ * According to the observer pattern, tools which want to observe
+ * component state set observer objects to the RT-Component, and weh
+ * RT-Component changes its status, the observer object is called and
+ * notice the changes to tools.
+ *
+ *
+ * @since 1.1
+ * @endif
+ */
+module OpenRTM
+{
+ /*!
+ * @if jp
+ *
+ * @brief 更新された状態の種類
+ *
+ * ターゲットRTCで更新された状態の種類を分類する列挙型。
+ *
+ * @else
+ *
+ * @brief A kind of updated status
+ *
+ * This is a enumeration type to classify updated status in target RTC.
+ *
+ * @endif
+ */
+ enum StatusKind
+ {
+ /*!
+ * @if jp
+ *
+ * @brief コンポーネントプロファイル
+ *
+ * コンポーネントプロファイル RTC::ComponentProfile が更新されたこ
+ * とを示す列挙型。
+ *
+ * RTC::ComponentProfile のメンバーのうち、instance_name,
+ * type_name, description, version, vendor, category はRTC動作中に
+ * 変更されることはない。これらが変更された場合には、
+ * ComponentObserver::updatestatus() の hint には、それぞれのメンバー
+ * 名が文字列で指定される。また、parent に対する変更は通知されない。
+ * さらに、properties に対する変更は、hint に "<key0>, <key1>,
+ * ..." の形で通知される。
+ *
+ * port_profiles に対する変更は、後述の PORT_PROFILE によって通知さ
+ * れるため、COMPONENT_PROFILE では通知されない。
+ *
+ * @else
+ *
+ * @brief Component profile
+ *
+ * This is enumeration member to specify that the target
+ * component's RTC::componentProfile has been changed.
+ *
+ * In the member of RTC::ComponentProfile, instance_name,
+ * type_name, description, version, vendor, category are not
+ * modified during RTC running. If these members are changed, each
+ * member's name is specified in the
+ * ComponentObserver::updateStatus() 's hint argument. And,
+ * modification to parent is not notified. In the properties, the
+ * modification is notified as "<key0>, <key1>, ..." in the hint
+ * argument.
+ *
+ * The modification to port_profiles is not notified as
+ * COMPONENT_PROFILE becauase it is notified as PORT_PROFILE.
+ *
+ * @endif
+ */
+ COMPONENT_PROFILE,
+ /*!
+ * @if jp
+ *
+ * @brief コンポーネントの状態
+ *
+ * コンポーネントの状態が変化したことを示す列挙子。
+ *
+ * RTCにはECの状態として、INACTIVE_STATE, ACTIVE_STATE,
+ * ERROR_STATE があるが、この状態が変化したことを通知するための列挙
+ * 子。
+ *
+ * ComponentObserver::updatestatus() の hint には、状態と、どの実行
+ * コンテキストで変化があったかを知らせる以下の文字列が hint に引数
+ * として与えられる。
+ *
+ * hint: (INACTIVE, ACTIVE, ERROR):<Execution Context ID>
+ * 例:
+ * ACTIVE:0 (デフォルトコンテキストでRTCがアクティブになった)
+ * ERROR:1002 (実行コンテキスト1002でRTCがエラーになった)
+ *
+ * @else
+ *
+ * @brief Component status
+ *
+ * This is INACTIVE_STATE, ACTIVE_STATE,
+ * ERROR_STATE status, and this enumerator specify a status of RTC changed.
+ *
+ * A status and ExecutionContext's id is specified in the argument of
+ * ComponentObserver::updateStatus() 's hint.
+ *
+ * hint: (INACTIVE, ACTIVE, ERROR):<Execution Context ID>
+ * Example:
+ * ACTIVE:0 (RTC is activated in the default ExecuionContext)
+ * ERROR:1002 (RTC go to ERROR state in the EC of id 1002)
+ *
+ * @endif
+ */
+ RTC_STATUS,
+ /*!
+ * @if jp
+ *
+ * @brief ExecutionContextの状態
+ *
+ * ExecutionContextの状態が変化したことを示す列挙子。
+ *
+ * RTCにECが attach/detach/rate_change/startup/shutdown されたことを
+ * 示す列挙子。
+ *
+ * ComponentObserver::updatestatus() の hint には、
+ * attach/detach/rate_change/startup/shutdow のいずれが行われたかと、
+ * 対象となるECのidが与えられる。
+ *
+ * hint: (ATTACHED, DETACHED, RATE_CHANGED, STARTUP,
+ * SHUTDOWN):<Execution Context ID>
+ *
+ * 例:
+ * ATTACHED:1002 (ECがアタッチされ、そのIDは1002)
+ *
+ * @else
+ *
+ * @brief The stauts of ExecutionContext
+ *
+ * This is enumerator notifies that ExecutionContext is
+ * attach/detach/rate_change/startup/shutdown. Attach or detach
+ * operation and target ExecutionContext's id is given in the
+ * argument of ComponentObserver::updateStatus() 's hint.
+ *
+ * hint: (ATTACHED, DETACHED, RATE_CHANGED, STARTUP,
+ * SHUTDOWN):<Execution Context ID>
+ *
+ * Example:
+ * ATTACHED:1002 (EC is attached and its ID is 1002)
+ *
+ * @endif
+ */
+ EC_STATUS,
+ /*!
+ * @if jp
+ *
+ * @brief Portの状態
+ *
+ * Portの状態が変化したことを示す列挙子。Portの追加、削除、接続、切
+ * 断が行われたことを示す。ComponentObserver::updatestatus() の
+ * hint には、いずれかのアクションが行われたかと、対象となるポート
+ * の名前が与えられる。
+ *
+ * hint: (ADD, REMOVE, CONNECT, DISCONNECT):<port name>
+ * 例:
+ * CONNECT:velocity (velocity ポートで接続が確立された)
+ *
+ * @else
+ *
+ * @brief The stauts of ports
+ *
+ * This is enumerator which notifies that port is added, removed,
+ * connected and/or disconnected. Which action is performed and
+ * target port's name is given to the hint argument in
+ * ComponentObserver::updateStatus() operation.
+ *
+ * hint: (ADD, REMOVE, CONNECT, DISCONNECT):<port name>
+ * Example:
+ * CONNECT:velocity (A connection established in the velocity port)
+ *
+ * @endif
+ */
+ PORT_PROFILE,
+ /*!
+ * @if jp
+ *
+ * @brief Configurationの状態
+ *
+ * Configurationの状態が変化したことを示す列挙子。Configurationに対
+ * して、コンフィギュレーションパラメータが更新された
+ * (UPDATE_CONFIG_PARAM)、コンフィギュレーションがセット(更新)さ
+ * れた (SET_CONFIG_SET)、コンフィギュレーションセットが追加された
+ * (ADD_CONFIG_SET)、コンフィギュレーションが更新された
+ * (UPDATE_CONFIG_SET)、コンフィギュレーションセットが削除された
+ * (REMOVE_CONFIG_SET)、コンフィギュレーションセットがアクティブに
+ * された (ACTIVATE_CONFIG_SET) といったアクションがあったことが通
+ * 知される。
+ *
+ * - UPDATE_CONFIG_PARAM: <config set name>.<config param name>
+ * - SDOPackage::Configuration::set_configuration_parameter
+ * - SET_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::set_configuration_set_values
+ * - ADD_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::add_configuration_set
+ * - UPDATE_CONFIG_SET: <config set name>
+ * - 内部のコンフィグセットを実際の変数に反映する
+ * - REMOVE_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::remove_configuration_set
+ * - ACTIVATE_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::activate_configuration_set
+ *
+ * @else
+ *
+ * @brief The stauts of ports
+ *
+ * This is enumerator which notifies that configuration is
+ * changed. To the configuration, a configuration parameter has
+ * been updated (UPDATE_CONFIG_PARAM), a configuration-set is set
+ * (SET_CONFIG_SET), a configuration set has been updated
+ * (UPDATE_CONFIG_SET), a configuration set has been added
+ * (ADD_CONFIG_SET) or removed (REMOVE_CONFIG_SET), the active
+ * configuration set has been changed (ACTIVATE_CONFIG_SET), these
+ * actions would be notified.
+ *
+ * - UPDATE_CONFIG_PARAM: <config set name>.<config param name>
+ * - SDOPackage::Configuration::set_configuration_parameter
+ * - SET_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::set_configuration_set_values
+ * - ADD_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::add_configuration_set
+ * - UPDATE_CONFIG_SET: <config set name>
+ * - Apply configuration-set values into actual variables.
+ * - REMOVE_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::remove_configuration_set
+ * - ACTIVATE_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::activate_configuration_set
+ *
+ * @endif
+ */
+ CONFIGURATION,
+ /*!
+ * @if jp
+ *
+ * @brief ハートビートイベント
+ *
+ * 当該RTCが生存していることをオブザーバー側に通知する列挙子。
+ *
+ * ハートビートを利用するかどうか、およびハートビートの周期は、
+ * ServiceProfile::properties の以下のプロパティによって与えられる。
+ *
+ * heartbeat.enable: YES/NO
+ * heartbeat.interval: x [s]
+ *
+ * @else
+ *
+ * @brief The stauts of ports
+ *
+ * This enumerator is heart beat notification.
+ *
+ * Whether if the heart-beat function is used is specified in the
+ * ServiceProfile::properties as the following properties.
+ *
+ * heartbeat.enable: YES/NO
+ * heartbeat.interval: x [s]
+ *
+ * @endif
+ */
+ HEARTBEAT,
+
+ STATUS_KIND_NUM
+ };
+
+ /*!
+ * @if jp
+ *
+ * @interface ComponentObserver
+ *
+ * RTCの各種状態の更新を知らせるためのオブザーバーオブジェクトのため
+ * のインターフェース。SDO Service として、対象となるRTC/SDOに対して
+ * アタッチされ、RTC/SDO内の状態が変更された場合に、変更された状態の
+ * 種類とヒントを同時に通知する。ツールなどで、ポーリングによらずRTC
+ * の状態の変化を知りたい場合などに利用する。
+ *
+ * 想定している利用方法は以下のとおりである。
+ *
+ * -# SDO::get_configuration() により Configuration オブジェクトを取得
+ * -# Configuration::add_service_profile() によりTool側の
+ * ComponentObserver を ServiceProfile により RTC に与える。
+ * ServiceProfile のメンバーは以下のように設定すること
+ * - id: UUID など一意なIDを設定する。削除時にも必要になるので、Tool
+ * 側ではIDを保持しておかなければならない。
+ * - interface_type: 当該サービスのIFRのIDを文字列として指定。RTC側で
+ * はこの文字列により当該サービスオブジェクトを受け入れるか決定す
+ * るため指定は必須となる。
+ * - properties: RTC側のサービスの受け入れ側に通知するプロパティを設
+ * 定する。このサービスでは、下記の heartbeat 関連のプロパティを
+ * 指定する。
+ * - service: SDOService オブジェクトの参照を指定する。
+ * -# RTC側で状態の変化があった場合に update_status() オペレーション
+ * が StatusKind および hint の文字列とともに呼び出される。Tool側
+ * では、StatusKind と hint に基づき RTC のある部分の状態が変化し
+ * たことを知り、必要な処理を行う。
+ * -# 最終的にComponentObserverオブジェクトが不要になった場合には、
+ * Configuration::remove_service_profile() を id とともに呼び出し
+ * RTC から削除する。
+ *
+ * <pre>
+ *
+ * [RTC] [Configuration] [Observer] [Tool]
+ * | | | |
+ * | | get_configuration() | |
+ * |<------------------------------------------------|
+ * | | | |
+ * | | add_service_profile(prof) |
+ * | |<-----------------------------------|
+ * | | | |
+ * | | update_status(kind, hint) |
+ * |----------------------------------->| |
+ * | | update_status(kind, hint) |
+ * |----------------------------------->| |
+ * | | : | |
+ * | | | |
+ * | | remove_service_profile(id) |
+ * | |<-----------------------------------|
+ * | | | |
+ * | | x x
+ *
+ * </pre>
+ *
+ * なお、ServiceProfile::properties に指定するプロパティとしては、
+ *
+ * - observed_status: ALL or kind of status
+ * - heartbeat.enable: YES/NO
+ * - heartbeat.interval: x [s]
+ *
+ * がある。
+ *
+ * - observed_staus: ALL または状態の種類をカンマ区切りで指定
+ * 監視する状態を指定する。指定可能な状態を表す文字列は、
+ * COMPONENT_PROFILE, RTC_STATUS, EC_STATUS, PORT_PROFILE,
+ * CONFIGURATION 5種類である。監視したい対象をカンマで区切り複数指
+ * 定することができる。また、すべての状態を監視する場合、ALL を指定
+ * することができる。指定文字列は大文字、小文字を問わない。
+ *
+ * - heartbeat.interval: 秒単位で数値で指定
+ * ハートビートを送信する周期を秒単位で指定する。なお、指定した秒数
+ * でハートビートが必ず送信される保証はない。したがって、RTCが死ん
+ * だかどうかを確認するには、heartbeat.interval 数回分の時間を待つ
+ * 必要がある。
+ *
+ * - heartbeat.enable: YES または NOで指定
+ * Tool側では、状態に変化があるまで RTC が生存しているかどうか知る
+ * ことはできないため、突然RTCが死んだ場合には、これを知ることがで
+ * きない。そこで、HEART_BEAT イベントを周期的にRTC側から送らせるこ
+ * とができる。ハートビートを有効にするか否かをこのオプションで指定
+ * する。
+ *
+ *
+ * @else
+ *
+ * @interface ComponentObserver
+ *
+ * This is an interface to notify various status changed in RTC to
+ * others. This is attached into a target RTC/SDO as a SDO service,
+ * and if an RTC/SDO's status change, a kind of changed status and
+ * its hints are notified to observers. For example, it can be used
+ * to notify RTC's status changed without polling in certain tools.
+ *
+ * An assumed usage is as follows.
+ *
+ * -# SDO::get_configuration() is called to get a Configuration object
+ *
+ * -# Configuration::add_service_profile() is called by Tool.
+ * A ComponentObserver in a ServiceProfile is given to RTC.
+ * ServiceProfile members should be set as follows.
+ *
+ * - id: UUID and other unique ID should be specified. Since this ID
+ * is used when the service is removed, tools should remember
+ * this ID.
+ *
+ * - interface_type: IFR ID should be specified here. Since the RTC
+ * decides if the given SDO service object can be accepted by
+ * using the interface_type string, this member is mandatory.
+ *
+ * - properties: This member specifies properties to be notified to
+ * RTC side. In this service, the following heartbeat related
+ * properties should be specified.
+ *
+ * - service: SDOService object reference should be specified.
+ *
+ * -# If some changes happen in RTC, the update_status() operation
+ * is called with StatusKind and hint string. RTC's status change
+ * is notified to tool and some processes would be performed by
+ * the tool according to the StatusKind and hint.
+ *
+ * -# Finally, When the ComponentObserver object becomes
+ * unnecessary, Configuration::remove_service_profile() is called
+ * with id and it is removed from RTC.
+ *
+ * <pre>
+ *
+ * [RTC] [Configuration] [Observer] [Tool]
+ * | | | |
+ * | | get_configuration() | |
+ * |<------------------------------------------------|
+ * | | | |
+ * | | add_service_profile(prof) |
+ * | |<-----------------------------------|
+ * | | | |
+ * | | update_status(kind, hint) |
+ * |----------------------------------->| |
+ * | | update_status(kind, hint) |
+ * |----------------------------------->| |
+ * | | : | |
+ * | | | |
+ * | | remove_service_profile(id) |
+ * | |<-----------------------------------|
+ * | | | |
+ * | | x x
+ *
+ * </pre>
+ *
+ * Properties which is specified in ServiceProfile::properties is as follows.
+ *
+ * - observed_status: ALL or kind of status
+ * - heartbeat.enable: YES/NO
+ * - heartbeat.interval: x [s]
+ *
+ *
+ * - observed_staus: ALL or comma separated status kinds This
+ * property specifies kind of status to be observed. Available
+ * kind of statuses are COMPONENT_PROFILE, RTC_STATUS, EC_STATUS,
+ * PORT_PROFILE, CONFIGURATION. You can specify comma-separated
+ * status list to be observed. And if you want to observe all the
+ * status, you just specify ALL instead of all the status kind
+ * list. Uppercase, lowercase and mixture are allowed in the
+ * specified status kind.
+ *
+ * - heartbeat.enable: YES or NO
+ *
+ * Since tools cannot know whether the RTC is alive or not until
+ * status change happens, if the RTC suddenly died, the tools
+ * cannot know it forever. To eliminate this problems, Observer
+ * object can send periodic heartbeat signals to observers. The
+ * heartbeat.enable option specifies whether the functionality is
+ * activated or not.
+ *
+ * - heartbeat.interval: Heartbeat interval should be specified in
+ * seconds. This specification does not guarantee that heartbeat
+ * signals precisely send back to observer. Therefore if you need
+ * to decide whether an RTC died or not, you have to wait for
+ * several heartbeat signals.
+ *
+ * @endif
+ */
+ interface ComponentObserver
+ : SDOPackage::SDOService
+ {
+ /*!
+ * @if jp
+ *
+ * @brief 状態が更新されたことを知らせる
+ *
+ * 状態が更新されたことを知らせるオペレーション。status_kind によっ
+ * て更新された状態の種類、hint によってどのような状態が変更された
+ * かに関するヒントが与えられる。
+ *
+ * @param status_kind: StatusKind 型の状態の種類
+ * @param hint; StatusKind 毎に決まる状態変更に関するヒント
+ *
+ * @else
+ *
+ * @brief Notifies the status updated
+ *
+ * This operation notifies the updated status. The status_kind
+ * notifies kind of updated status, and the hint give some hint
+ * about updated status.
+ *
+ * @endif
+ */
+ oneway void update_status(in StatusKind status_kind, in string hint);
+ };
+
+};
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/ComponentObserverConsumer.py
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/ComponentObserverConsumer.py (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/ComponentObserverConsumer.py 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,924 @@
+#!/usr/bin/env python
+# -*- coding: euc-jp -*-
+
+##
+# @file ComponentObserverConsumer.py
+# @brief Component observer SDO service consumer implementation
+# @date $Date$
+# @author Noriaki Ando <n-ando at aist.go.jp> and Shinji Kurihara
+#
+# Copyright (C) 2011
+# Noriaki Ando
+# Intelligent Systems Research Institute,
+# National Institute of
+# Advanced Industrial Science and Technology (AIST), Japan
+# All rights reserved.
+#
+
+import RTC
+import OpenRTM
+import OpenRTM_aist
+
+
+##
+# @if jp
+# @else
+# @endif
+#
+class ComponentObserverConsumer(OpenRTM_aist.SdoServiceConsumerBase):
+ """
+ """
+
+ ##
+ # @if jp
+ # @brief ctor of ComponentObserverConsumer
+ # @else
+ # @brief ctor of ComponentObserverConsumer
+ # @endif
+ #
+ def __init__(self):
+ self._rtobj = None
+ self._profile = None
+ self._observer = OpenRTM_aist.CorbaConsumer(interfaceType=OpenRTM.ComponentObserver)
+ self._observed = [ False for i in range(OpenRTM.STATUS_KIND_NUM._v)]
+
+ self._compstat = self.CompStatMsg(self)
+ self._portaction = self.PortAction(self)
+ self._ecaction = self.ECAction(self)
+ self._configMsg = self.ConfigAction(self)
+
+ self._interval = OpenRTM_aist.TimeValue(1, 0)
+ self._heartbeat = False
+ self._hblistenerid = None
+
+ # このタイマーはいずれグローバルなタイマにおきかえる
+ self._timer = OpenRTM_aist.Timer(self._interval)
+ return
+
+
+ ##
+ # @if jp
+ # @brief dtor
+ # @else
+ # @brief dtor
+ # @endif
+ #
+ def __del__(self):
+ self.unsetComponentProfileListeners()
+ self.unsetComponentStatusListeners()
+ self.unsetPortProfileListeners()
+ self.unsetExecutionContextListeners()
+ self.unsetConfigurationListeners()
+ self.unsetHeartbeat()
+ del self._timer
+ return
+
+
+ ##
+ # @if jp
+ # @brief 初期化
+ # @else
+ # @brief Initialization
+ # @endif
+ #
+ # virtual bool init(RTObject_impl& rtobj,
+ # const SDOPackage::ServiceProfile& profile);
+ def init(self, rtobj, profile):
+ if not self._observer.setObject(profile.service):
+ # narrowing failed
+ return False
+
+ self._rtobj = rtobj
+ self._profile = profile
+ prop = OpenRTM_aist.Properties()
+ OpenRTM_aist.NVUtil.copyToProperties(prop, profile.properties)
+ self.setHeartbeat(prop)
+ self.setListeners(prop)
+ return True
+
+
+ ##
+ # @if jp
+ # @brief 再初期化
+ # @else
+ # @brief Re-initialization
+ # @endif
+ #
+ # virtual bool reinit(const SDOPackage::ServiceProfile& profile);
+ def reinit(self, profile):
+ if not self._observer._ptr()._is_equivalent(profile.service):
+ tmp = OpenRTM_aist.CorbaConsumer(interfaceType=OpenRTM.ComponentObserver)
+ if not tmp.setObject(profile.service):
+ return False
+ self._observer.releaseObject()
+ self._observer.setObject(profile.service)
+
+ self._profile= profile
+ prop = OpenRTM_aist.Properties()
+ OpenRTM_aist.NVUtil.copyToProperties(prop, profile.properties)
+ self.setHeartbeat(prop)
+ self.setListeners(prop)
+ return True
+
+
+ ##
+ # @if jp
+ # @brief ServiceProfile を取得する
+ # @else
+ # @brief getting ServiceProfile
+ # @endif
+ #
+ # virtual const SDOPackage::ServiceProfile& getProfile() const;
+ def getProfile(self):
+ return self._profile
+
+
+ ##
+ # @if jp
+ # @brief 終了処理
+ # @else
+ # @brief Finalization
+ # @endif
+ #
+ # virtual void finalize();
+ def finalize(self):
+ self.unsetComponentProfileListeners()
+ self.unsetComponentStatusListeners()
+ self.unsetPortProfileListeners()
+ self.unsetExecutionContextListeners()
+ self.unsetConfigurationListeners()
+ self.unsetHeartbeat()
+ return
+
+
+ ##
+ # @if jp
+ # @brief リモートオブジェクトコール
+ # @else
+ # @brief Calling remote object
+ # @endif
+ #
+ # inline void updateStatus(OpenRTM::StatusKind statuskind, const char* msg)
+ def updateStatus(self, statuskind, msg):
+ try:
+ self._observer._ptr().update_status(statuskind, msg)
+ except:
+ self._rtobj.removeSdoServiceConsumer(self._profile.id)
+ return
+
+ ##
+ # @if jp
+ # @brief Kindを文字列へ変換する
+ # @else
+ # @brief Converting kind to string
+ # @endif
+ #
+ # inline const char* toString(OpenRTM::StatusKind kind)
+ def toString(self, kind):
+ kinds = ["COMPONENT_PROFILE",
+ "RTC_STATUS",
+ "EC_STATUS",
+ "PORT_PROFILE",
+ "CONFIGURATION",
+ "HEARTBEAT"]
+ if kind._v < OpenRTM.STATUS_KIND_NUM._v:
+ return kinds[kind._v]
+ return ""
+
+
+ ##
+ # @if jp
+ # @brief RTObjectへのリスナ接続処理
+ # @else
+ # @brief Connectiong listeners to RTObject
+ # @endif
+ #
+ # void setListeners(coil::Properties& prop);
+ def setListeners(self, prop):
+ if not prop.getProperty("observed_status"):
+ prop.setProperty("observed_status", "ALL")
+
+ observed_ = [s.strip() for s in prop.getProperty("observed_status").split(",")]
+ flags_ = [ False for i in range(OpenRTM.STATUS_KIND_NUM._v) ]
+
+ for i in range(len(observed_)):
+ observed_[i] = observed_[i].upper()
+ if observed_[i] == "COMPONENT_PROFILE":
+ flags_[OpenRTM.COMPONENT_PROFILE._v] = True
+ elif observed_[i] == "RTC_STATUS":
+ flags_[OpenRTM.RTC_STATUS._v] = True
+ elif observed_[i] == "EC_STATUS":
+ flags_[OpenRTM.EC_STATUS._v] = True
+ elif observed_[i] == "PORT_PROFILE":
+ flags_[OpenRTM.PORT_PROFILE._v] = True
+ elif observed_[i] == "CONFIGURATION":
+ flags_[OpenRTM.CONFIGURATION._v] = True
+ elif observed_[i] == "ALL":
+ for j in range(OpenRTM.STATUS_KIND_NUM._v):
+ flags_[j] = True
+ break
+
+ self.switchListeners(flags_[OpenRTM.COMPONENT_PROFILE._v],
+ self._observed,
+ OpenRTM.COMPONENT_PROFILE._v,
+ self.setComponentProfileListeners,
+ self.unsetComponentProfileListeners)
+
+ self.switchListeners(flags_[OpenRTM.RTC_STATUS._v],
+ self._observed,
+ OpenRTM.RTC_STATUS._v,
+ self.setComponentStatusListeners,
+ self.unsetComponentStatusListeners)
+
+ self.switchListeners(flags_[OpenRTM.EC_STATUS._v],
+ self._observed,
+ OpenRTM.EC_STATUS._v,
+ self.setExecutionContextListeners,
+ self.unsetExecutionContextListeners)
+
+ self.switchListeners(flags_[OpenRTM.PORT_PROFILE._v],
+ self._observed,
+ OpenRTM.PORT_PROFILE._v,
+ self.setPortProfileListeners,
+ self.unsetPortProfileListeners)
+
+ self.switchListeners(flags_[OpenRTM.CONFIGURATION._v],
+ self._observed,
+ OpenRTM.CONFIGURATION._v,
+ self.setConfigurationListeners,
+ self.unsetConfigurationListeners)
+
+ return
+
+
+ ##
+ # @if jp
+ # @brief リスナ接続・切断スイッチング処理
+ # @else
+ # @brief Switching listeners connecting/disconnecting
+ # @endif
+ #
+ # void switchListeners(bool& next, bool& pre,
+ # void (ComponentObserverConsumer::*setfunc)(),
+ # void (ComponentObserverConsumer::*unsetfunc)());
+ def switchListeners(self, next, pre, pre_idx, setfunc, unsetfunc):
+ if (not pre[pre_idx]) and next:
+ setfunc()
+ pre[pre_idx] = True
+ elif pre[pre_idx] and (not next):
+ unsetfunc()
+ pre[pre_idx] = False
+
+ return
+
+
+ #============================================================
+ # Heartbeat related functions
+
+ ##
+ # @if jp
+ # @brief ハートビートをオブザーバに伝える
+ # @else
+ # @brief Sending a heartbeart signal to observer
+ # @endif
+ #
+ # void heartbeat();
+ def heartbeat(self):
+ self.updateStatus(OpenRTM.HEARTBEAT, "")
+ return
+
+
+ ##
+ # @if jp
+ # @brief ハートビートを設定する
+ # @else
+ # @brief Setting heartbeat
+ # @endif
+ #
+ # void setHeartbeat(coil::Properties& prop);
+ def setHeartbeat(self, prop):
+ if OpenRTM_aist.toBool(prop.getProperty("heartbeat.enable"), "YES", "NO", False):
+ interval_ = prop.getProperty("heartbeat.interval")
+ if not interval_:
+ self._interval.set_time(1.0)
+ else:
+ tmp_ = float(interval_)
+ self._interval.set_time(tmp_)
+
+ tm_ = self._interval
+ self._hblistenerid = self._timer.registerListenerObj(self,
+ ComponentObserverConsumer.heartbeat,
+ tm_)
+ if not self._heartbeat:
+ self._timer.start()
+ self._heartbeat = True
+
+ else:
+ if self._heartbeat and self._hblistenerid:
+ self.unsetHeartbeat()
+
+ return
+
+
+ ##
+ # @if jp
+ # @brief ハートビートを解除する
+ # @else
+ # @brief Unsetting heartbeat
+ # @endif
+ #
+ # void unsetHeartbeat();
+ def unsetHeartbeat(self):
+ self._timer.unregisterListener(self._hblistenerid)
+ self._hblistenerid = 0
+ self._timer.stop()
+ self._heartbeat = False
+ return
+
+
+ #============================================================
+ # Component status related functions
+
+ ##
+ # @if jp
+ # @brief RTC状態変化リスナの設定処理
+ # @else
+ # @brief Setting RTC status listeners
+ # @endif
+ #
+ # void setComponentStatusListeners();
+ def setComponentStatusListeners(self):
+ postclistener_ = OpenRTM_aist.PostComponentActionListenerType
+ if not self._compstat.activatedListener:
+ self._compstat.activatedListener = \
+ self._rtobj.addPostComponentActionListener(postclistener_.POST_ON_ACTIVATED,
+ self._compstat.onActivated)
+ if not self._compstat.deactivatedListener:
+ self._compstat.deactivatedListener = \
+ self._rtobj.addPostComponentActionListener(postclistener_.POST_ON_DEACTIVATED,
+ self._compstat.onDeactivated)
+
+ if not self._compstat.resetListener:
+ self._compstat.resetListener = \
+ self._rtobj.addPostComponentActionListener(postclistener_.POST_ON_RESET,
+ self._compstat.onReset)
+
+ if not self._compstat.abortingListener:
+ self._compstat.abortingListener = \
+ self._rtobj.addPostComponentActionListener(postclistener_.POST_ON_ABORTING,
+ self._compstat.onAborting)
+
+ if not self._compstat.finalizeListener:
+ self._compstat.finalizeListener = \
+ self._rtobj.addPostComponentActionListener(postclistener_.POST_ON_FINALIZE,
+ self._compstat.onFinalize)
+
+ return
+
+
+ ##
+ # @if jp
+ # @brief RTC状態変化リスナの解除処理
+ # @else
+ # @brief Unsetting RTC status listeners
+ # @endif
+ #
+ # void unsetComponentStatusListeners();
+ def unsetComponentStatusListeners(self):
+ postclistener_ = OpenRTM_aist.PostComponentActionListenerType
+ if self._compstat.activatedListener:
+ self._rtobj.removePostComponentActionListener(postclistener_.POST_ON_ACTIVATED,
+ self._compstat.activatedListener)
+ self._compstat.activatedListener = None
+
+ if self._compstat.deactivatedListener:
+ self._rtobj.removePostComponentActionListener(postclistener_.POST_ON_DEACTIVATED,
+ self._compstat.deactivatedListener)
+ self._compstat.deactivatedListener = None
+
+ if self._compstat.resetListener:
+ self._rtobj.removePostComponentActionListener(postclistener_.POST_ON_RESET,
+ self._compstat.resetListener)
+ self._compstat.resetListener = None
+
+ if self._compstat.abortingListener:
+ self._rtobj.removePostComponentActionListener(postclistener_.POST_ON_ABORTING,
+ self._compstat.abortingListener)
+ self._compstat.abortingListener = None
+
+ if self._compstat.finalizeListener:
+ self._rtobj.removePostComponentActionListener(postclistener_.POST_ON_FINALIZE,
+ self._compstat.finalizeListener)
+ self._compstat.finalizeListener = None
+
+ return
+
+
+ #============================================================
+ # Port profile related functions
+
+ ##
+ # @if jp
+ # @brief Portプロファイル変化リスナの設定処理
+ # @else
+ # @brief Setting port profile listener
+ # @endif
+ #
+ # void setPortProfileListeners();
+ def setPortProfileListeners(self):
+ plistener_ = OpenRTM_aist.PortActionListenerType
+ if not self._portaction.portAddListener:
+ self._portaction.portAddListener = \
+ self._rtobj.addPortActionListener(plistener_.ADD_PORT,
+ self._portaction.onAddPort)
+
+ if not self._portaction.portRemoveListener:
+ self._portaction.portRemoveListener = \
+ self._rtobj.addPortActionListener(plistener_.REMOVE_PORT,
+ self._portaction.onRemovePort)
+
+ pclistener_ = OpenRTM_aist.PortConnectRetListenerType
+ if not self._portaction.portConnectListener:
+ self._portaction.portConnectListener = \
+ self._rtobj.addPortConnectRetListener(pclistener_.ON_CONNECTED,
+ self._portaction.onConnect)
+
+ if not self._portaction.portDisconnectListener:
+ self._portaction.portDisconnectListener = \
+ self._rtobj.addPortConnectRetListener(pclistener_.ON_DISCONNECTED,
+ self._portaction.onDisconnect)
+
+ return
+
+ ##
+ # @if jp
+ # @brief Portプロファイル変化リスナの解除処理
+ # @else
+ # @brief Unsetting port profile listener
+ # @endif
+ #
+ # void unsetPortProfileListeners();
+ def unsetPortProfileListeners(self):
+ plistener_ = OpenRTM_aist.PortActionListenerType
+ if self._portaction.portAddListener:
+ self._rtobj.removePortActionListener(plistener_.ADD_PORT,
+ self._portaction.portAddListener)
+ self._portaction.portAddListener = None
+
+ if self._portaction.portRemoveListener:
+ self._rtobj.removePortActionListener(plistener_.REMOVE_PORT,
+ self._portaction.portRemoveListener)
+ self._portaction.portRemoveListener = None
+
+ pclistener_ = OpenRTM_aist.PortConnectRetListenerType
+ if self._portaction.portConnectListener:
+ self._rtobj.removePortConnectRetListener(pclistener_.ON_CONNECTED,
+ self._portaction.portConnectListener)
+ self._portaction.portConnectListener = None
+
+ if self._portaction.portDisconnectListener:
+ self._rtobj.removePortConnectRetListener(pclistener_.ON_DISCONNECTED,
+ self._portaction.portDisconnectListener)
+ self._portaction.portDisconnectListener = None
+
+ return
+
+
+ #============================================================
+ # EC profile related functions
+
+ ##
+ # @if jp
+ # @brief ECの状態変化リスナの設定
+ # @else
+ # @brief Setting EC status listener
+ # @endif
+ #
+ # void setExecutionContextListeners();
+ def setExecutionContextListeners(self):
+ ectype_ = OpenRTM_aist.ExecutionContextActionListenerType
+ if not self._ecaction.ecAttached:
+ self._ecaction.ecAttached = \
+ self._rtobj.addExecutionContextActionListener(ectype_.EC_ATTACHED,
+ self._ecaction.onAttached)
+
+ if not self._ecaction.ecDetached:
+ self._ecaction.ecDetached = \
+ self._rtobj.addExecutionContextActionListener(ectype_.EC_DETACHED,
+ self._ecaction.onDetached)
+
+ pcaltype_ = OpenRTM_aist.PostComponentActionListenerType
+ if not self._ecaction.ecRatechanged:
+ self._ecaction.ecRatechanged = \
+ self._rtobj.addPostComponentActionListener(pcaltype_.POST_ON_RATE_CHANGED,
+ self._ecaction.onRateChanged)
+
+ if not self._ecaction.ecStartup:
+ self._ecaction.ecStartup = \
+ self._rtobj.addPostComponentActionListener(pcaltype_.POST_ON_STARTUP,
+ self._ecaction.onStartup)
+
+ if not self._ecaction.ecShutdown:
+ self._ecaction.ecShutdown = \
+ self._rtobj.addPostComponentActionListener(pcaltype_.POST_ON_SHUTDOWN,
+ self._ecaction.onShutdown)
+
+ return
+
+
+ ##
+ # @if jp
+ # @brief ECの状態変化リスナの解除
+ # @else
+ # @brief Unsetting EC status listener
+ # @endif
+ #
+ # void unsetExecutionContextListeners();
+ def unsetExecutionContextListeners(self):
+ ectype_ = OpenRTM_aist.ExecutionContextActionListenerType
+ if self._ecaction.ecAttached:
+ self._rtobj.removeExecutionContextActionListener(ectype_.EC_ATTACHED,
+ self._ecaction.ecAttached)
+
+ if self._ecaction.ecDetached:
+ self._rtobj.removeExecutionContextActionListener(ectype_.EC_ATTACHED,
+ self._ecaction.ecDetached)
+
+ pcaltype_ = OpenRTM_aist.PostComponentActionListenerType
+ if self._ecaction.ecRatechanged:
+ self._rtobj.removePostComponentActionListener(pcaltype_.POST_ON_RATE_CHANGED,
+ self._ecaction.ecRatechanged)
+
+ if self._ecaction.ecStartup:
+ self._rtobj.removePostComponentActionListener(pcaltype_.POST_ON_STARTUP,
+ self._ecaction.ecStartup)
+
+ if self._ecaction.ecShutdown:
+ self._rtobj.removePostComponentActionListener(pcaltype_.POST_ON_SHUTDOWN,
+ self._ecaction.ecShutdown)
+
+ return
+
+
+ #============================================================
+ # ComponentProfile related functions
+
+ ##
+ # @if jp
+ # @brief ComponentProfile状態変化リスナの設定
+ # @else
+ # @brief Setting ComponentProfile listener
+ # @endif
+ #
+ # void setComponentProfileListeners();
+ def setComponentProfileListeners(self):
+ pass
+
+
+ ##
+ # @if jp
+ # @brief ComponentProfile状態変化リスナの解除
+ # @else
+ # @brief Unsetting ComponentProfile listener
+ # @endif
+ #
+ # void unsetComponentProfileListeners();
+ def unsetComponentProfileListeners(self):
+ pass
+
+
+ #============================================================
+ # Configuration related functions
+
+ ##
+ # @if jp
+ # @brief Configuration状態変化リスナの設定
+ # @else
+ # @brief Setting Configuration listener
+ # @endif
+ #
+ # void setConfigurationListeners();
+ def setConfigurationListeners(self):
+ confprmlistenertype_ = OpenRTM_aist.ConfigurationParamListenerType
+ self._configMsg.updateConfigParamListener = \
+ self._rtobj.addConfigurationParamListener(confprmlistenertype_.ON_UPDATE_CONFIG_PARAM,
+ self._configMsg.updateConfigParam)
+
+ confsetlistenertype_ = OpenRTM_aist.ConfigurationSetListenerType
+ self._configMsg.setConfigSetListener = \
+ self._rtobj.addConfigurationSetListener(confsetlistenertype_.ON_SET_CONFIG_SET,
+ self._configMsg.setConfigSet)
+
+ self._configMsg.addConfigSetListener = \
+ self._rtobj.addConfigurationSetListener(confsetlistenertype_.ON_ADD_CONFIG_SET,
+ self._configMsg.addConfigSet)
+
+ confsetnamelistenertype_ = OpenRTM_aist.ConfigurationSetNameListenerType
+ self._configMsg.updateConfigSetListener = \
+ self._rtobj.addConfigurationSetNameListener(confsetnamelistenertype_.ON_UPDATE_CONFIG_SET,
+ self._configMsg.updateConfigSet)
+
+ self._configMsg.removeConfigSetListener = \
+ self._rtobj.addConfigurationSetNameListener(confsetnamelistenertype_.ON_REMOVE_CONFIG_SET,
+ self._configMsg.removeConfigSet)
+ self._configMsg.activateConfigSetListener = \
+ self._rtobj.addConfigurationSetNameListener(confsetnamelistenertype_.ON_ACTIVATE_CONFIG_SET,
+ self._configMsg.activateConfigSet)
+ return
+
+
+ ##
+ # @if jp
+ # @brief Configuration状態変化リスナの解除
+ # @else
+ # @brief Unsetting Configurationlistener
+ # @endif
+ #
+ # void unsetConfigurationListeners();
+ def unsetConfigurationListeners(self):
+ confprmlistenertype_ = OpenRTM_aist.ConfigurationParamListenerType
+ if self._configMsg.updateConfigParamListener:
+ self._rtobj.removeConfigurationParamListener(confprmlistenertype_.ON_UPDATE_CONFIG_PARAM,
+ self._configMsg.updateConfigParamListener)
+ self._configMsg.updateConfigParamListener = None
+
+ confsetlistenertype_ = OpenRTM_aist.ConfigurationSetListenerType
+ if self._configMsg.setConfigSetListener:
+ self._rtobj.removeConfigurationSetListener(confsetlistenertype_.ON_SET_CONFIG_SET,
+ self._configMsg.setConfigSetListener)
+ self._configMsg.setConfigSetListener = None
+
+ if self._configMsg.addConfigSetListener:
+ self._rtobj.removeConfigurationSetListener(confsetlistenertype_.ON_ADD_CONFIG_SET,
+ self._configMsg.addConfigSetListener)
+ self._configMsg.addConfigSetListener = None
+
+ confsetnamelistenertype_ = OpenRTM_aist.ConfigurationSetNameListenerType
+ if self._configMsg.updateConfigSetListener:
+ self._rtobj.removeConfigurationSetNameListener(confsetnamelistenertype_.ON_UPDATE_CONFIG_SET,
+ self._configMsg.updateConfigSetListener)
+ self._configMsg.updateConfigSetListener = None
+
+ if self._configMsg.removeConfigSetListener:
+ self._rtobj.removeConfigurationSetNameListener(confsetnamelistenertype_.ON_REMOVE_CONFIG_SET,
+ self._configMsg.removeConfigSetListener)
+ self._configMsg.removeConfigSetListener = None
+
+ if self._configMsg.activateConfigSetListener:
+ self._rtobj.removeConfigurationSetNameListener(confsetnamelistenertype_.ON_ACTIVATE_CONFIG_SET,
+ self._configMsg.activateConfigSetListener)
+ self._configMsg.activateConfigSetListener = None
+
+ return
+
+
+ ##
+ # @if jp
+ # @brief PostComponentActionListener class
+ # @else
+ # @brief PostComponentActionListener class
+ # @endif
+ #
+ class CompStatMsg:
+ """
+ """
+
+ #CompStatMsg(ComponentObserverConsumer& coc)
+ def __init__(self, coc):
+ self.activatedListener = None
+ self.deactivatedListener = None
+ self.resetListener = None
+ self.abortingListener = None
+ self.finalizeListener = None
+ self._coc = coc
+ return
+
+ def __del__(self):
+ del self._coc
+ return
+
+ #void onGeneric(const char* msgprefix, UniqueId ec_id, ReturnCode_t ret)
+ def onGeneric(self, msgprefix, ec_id, ret):
+ if ret == RTC.RTC_OK:
+ msg_ = msgprefix
+ msg_ += str(ec_id)
+ self._coc.updateStatus(OpenRTM.RTC_STATUS, msg_)
+ return
+
+ #void onActivated(UniqueId ec_id, ReturnCode_t ret)
+ def onActivated(self, ec_id, ret):
+ self.onGeneric("ACTIVE:", ec_id, ret)
+ return
+
+ #void onDeactivated(UniqueId ec_id, ReturnCode_t ret)
+ def onDeactivated(self, ec_id, ret):
+ self.onGeneric("INACTIVE:", ec_id, ret)
+ return
+
+ #void onReset(UniqueId ec_id, ReturnCode_t ret)
+ def onReset(self, ec_id, ret):
+ self.onGeneric("INACTIVE:", ec_id, ret)
+ return
+
+ #void onAborting(UniqueId ec_id, ReturnCode_t ret)
+ def onAborting(self, ec_id, ret):
+ self.onGeneric("ERROR:", ec_id, ret)
+ return
+
+ #void onFinalize(UniqueId ec_id, ReturnCode_t ret)
+ def onFinalize(self, ec_id, ret):
+ self.onGeneric("FINALIZE:", ec_id, ret)
+ return
+
+ ##
+ # @if jp
+ # @brief PortActionListener
+ # @else
+ # @brief PortActionListener
+ # @endif
+ #
+ class PortAction:
+ """
+ """
+
+ #PortAction(ComponentObserverConsumer& coc)
+ def __init__(self, coc):
+ self.portAddListener = None
+ self.portRemoveListener = None
+ self.portConnectListener = None
+ self.portDisconnectListener = None
+ self._coc = coc
+ return
+
+ def __del__(self):
+ del self._coc
+ return
+
+ #void onGeneric(const char* _msg, const char* portname)
+ def onGeneric(self, _msg, portname):
+ msg_ = _msg
+ msg_ += portname
+ self._coc.updateStatus(OpenRTM.PORT_PROFILE, msg_)
+ return
+
+ #void onAddPort(const ::RTC::PortProfile& pprof)
+ def onAddPort(self, pprof):
+ self.onGeneric("ADD:", str(pprof.name))
+ return
+
+ #void onRemovePort(const ::RTC::PortProfile& pprof)
+ def onRemovePort(self, pprof):
+ self.onGeneric("REMOVE:", str(pprof.name))
+ return
+
+ #void onConnect(const char* portname,
+ # ::RTC::ConnectorProfile& pprof, ReturnCode_t ret)
+ def onConnect(self, portname, pprof, ret):
+ if ret == RTC.RTC_OK:
+ self.onGeneric("CONNECT:", portname)
+ return
+
+ #void onDisconnect(const char* portname,
+ # ::RTC::ConnectorProfile& pprof, ReturnCode_t ret)
+ def onDisconnect(self, portname, pprof, ret):
+ if ret == RTC.RTC_OK:
+ self.onGeneric("DISCONNECT:", portname)
+ return
+
+
+ ##
+ # @if jp
+ # @brief ExecutionContextActionListener
+ # @else
+ # @brief ExecutionContextActionListener
+ # @endif
+ #
+ class ECAction:
+ """
+ """
+
+ #ECAction(ComponentObserverConsumer& coc)
+ def __init__(self, coc):
+ self.ecAttached = None
+ self.ecDetached = None
+ self.ecRatechanged = None
+ self.ecStartup = None
+ self.ecShutdown = None
+ self._coc = coc
+ return
+
+ def __del__(self):
+ del self._coc
+ return
+
+ #void onGeneric(const char* _msg, UniqueId ec_id)
+ def onGeneric(self, _msg, ec_id):
+ msg_ = _msg + str(ec_id)
+ self._coc.updateStatus(OpenRTM.EC_STATUS, msg_)
+ return
+
+ #void onAttached(UniqueId ec_id)
+ def onAttached(self, ec_id):
+ self.onGeneric("ATTACHED:", ec_id)
+ return
+
+ #void onDetached(UniqueId ec_id)
+ def onDetached(self, ec_id):
+ self.onGeneric("DETACHED:", ec_id)
+ return
+
+ #void onRateChanged(UniqueId ec_id, ReturnCode_t ret)
+ def onRateChanged(self, ec_id, ret):
+ if ret == RTC.RTC_OK:
+ self.onGeneric("RATE_CHANGED:", ec_id)
+ return
+
+ #void onStartup(UniqueId ec_id, ReturnCode_t ret)
+ def onStartup(self, ec_id, ret):
+ if ret == RTC.RTC_OK:
+ self.onGeneric("STARTUP:", ec_id)
+ return
+
+ #void onShutdown(UniqueId ec_id, ReturnCode_t ret)
+ def onShutdown(self, ec_id, ret):
+ if ret == RTC.RTC_OK:
+ self.onGeneric("SHUTDOWN:", ec_id)
+ return
+
+
+ ##
+ # @if jp
+ # @brief ConfigActionListener
+ # @else
+ # @brief ConfigActionListener
+ # @endif
+ #
+ class ConfigAction:
+ """
+ """
+
+ #ConfigAction(ComponentObserverConsumer& coc)
+ def __init__(self, coc):
+ self.updateConfigParamListener = None
+ self.setConfigSetListener = None
+ self.addConfigSetListener = None
+ self.updateConfigSetListener = None
+ self.removeConfigSetListener = None
+ self.activateConfigSetListener = None
+ self._coc = coc
+
+ def __del__(self):
+ del self._coc
+ return
+
+ #void updateConfigParam(const char* configsetname,
+ # const char* configparamname)
+ def updateConfigParam(self, configsetname, configparamname):
+ msg_ = "UPDATE_CONFIG_PARAM: "
+ msg_ += configsetname
+ msg_ += "."
+ msg_ += configparamname
+ self._coc.updateStatus(OpenRTM.CONFIGURATION, msg_)
+ return
+
+ #void setConfigSet(const coil::Properties& config_set)
+ def setConfigSet(self, config_set):
+ msg_ = "SET_CONFIG_SET: "
+ msg_ += config_set.getName()
+ self._coc.updateStatus(OpenRTM.CONFIGURATION, msg_)
+ return
+
+ #void addConfigSet(const coil::Properties& config_set)
+ def addConfigSet(self, config_set):
+ msg_ = "ADD_CONFIG_SET: "
+ msg_ += config_set.getName()
+ self._coc.updateStatus(OpenRTM.CONFIGURATION, msg_)
+ return
+
+ #void updateConfigSet(const char* config_set_name)
+ def updateConfigSet(self, config_set_name):
+ msg_ = "UPDATE_CONFIG_SET: "
+ msg_ += config_set_name
+ self._coc.updateStatus(OpenRTM.CONFIGURATION, msg_)
+ return
+
+ #void removeConfigSet(const char* config_set_name)
+ def removeConfigSet(self, config_set_name):
+ msg_ = "REMOVE_CONFIG_SET: "
+ msg_ += config_set_name
+ self._coc.updateStatus(OpenRTM.CONFIGURATION, msg_)
+ return
+
+ #void activateConfigSet(const char* config_set_name)
+ def activateConfigSet(self, config_set_name):
+ msg_ = "ACTIVATE_CONFIG_SET: "
+ msg_ += config_set_name
+ self._coc.updateStatus(OpenRTM.CONFIGURATION, msg_)
+ return
+
+def ComponentObserverConsumerInit(mgr=None):
+ factory = OpenRTM_aist.SdoServiceConsumerFactory.instance()
+ factory.addFactory(OpenRTM.ComponentObserver._NP_RepositoryId,
+ ComponentObserverConsumer,
+ OpenRTM_aist.Delete)
+ return
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/RTC.idl
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/RTC.idl (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/RTC.idl 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,2649 @@
+// RTC.idl
+
+#include "SDOPackage.idl"
+
+#pragma prefix "omg.org"
+
+#define EXECUTION_HANDLE_TYPE_NATIVE long
+
+module RTC
+{
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ExecutionContextHandle_t
+ *
+ * @section Description
+ *
+ * This data type represents the association between an RTC and an
+ * ExecutionContext in which it participates.
+ *
+ * @section Semantics
+ *
+ * This is an opaque DataType. It has no attributes or operations.
+ *
+ * @endif
+ */
+ typedef EXECUTION_HANDLE_TYPE_NATIVE ExecutionContextHandle_t;
+
+ typedef SDOPackage::UniqueIdentifier UniqueIdentifier;
+ typedef SDOPackage::NVList NVList;
+
+ /*!
+ * @if jp
+ * @brief ReturnCode_t
+ *
+ * OMG RTC 1.0 仕様中の多くのオペレーションは、クラインとに対して考え
+ * られるエラー状態を報告する必要がある。これは、ReturnCode_t型の所謂
+ * リターンコードにより行われる。
+ *
+ * OMG RTC 1.0 の PIM 内において、ReturnCode_t型の値を返さないオペレーションは
+ * それらの戻り値の型に依存して、次の方法によりエラーを報告するものとする。
+ * -オペレーションが正数値を返す場合 (OMG RTC 1.0 Section 5.2.2.6.4 の
+ * get_rateのように)、負数値を返すことによりエラーを示すものとする。
+ * - オペレーションがオブジェクトリファレンス(RTObject::get_component_profile
+ * OMG RTC 1.0 5.4.2.2.1を参照) を通常返す場合、nil参照を返すことにより
+ * エラーを示すものとする。
+ *
+ * @else
+ * @brief ReturnCode_t
+ *
+ * A number of operations in this specification will need to report
+ * potential error conditions to their clients. This task shall be
+ * accomplished by means of operation "return codes" of type
+ * ReturnCode_t
+ *
+ * Operations in the PIM that do not return a value of type
+ * ReturnCode_t shall report errors in the following ways, depending
+ * on their return type:
+ * - If an operation normally returns a positive numerical value (such as
+ * get_rate, see [OMG RTC 1.0 Section 5.2.2.6.4]), it shall indicate
+ * failure by returning a negative value.
+ * - If an operation normally returns an object reference (such as
+ * RTObject::get_component_profile, see [OMG RTC 1.0 Section 5.4.2.2.1]),
+ * it shall indicate failure by returning a nil reference.
+ *
+ * @param RTC_OK The operation completed successfully.
+ * @param RTC_ERROR The operation failed with a generic, unspecified error.
+ * @param BAD_PARAMETER The operation failed because an illegal argument was
+ * passed to it.
+ * @param UNSUPPORTED The operation is unsupported by the implementation
+ * (e.g., it belongs to a compliance point that is not implemented).
+ * @param OUT_OF_RESOURCES The target of the operation ran out of the
+ * resources needed to complete the operation.
+ * @param PRECONDITION_NOT_MET A pre-condition for the operation was not met.
+ *
+ * @endif
+ */
+ enum ReturnCode_t
+ {
+ RTC_OK,
+ RTC_ERROR,
+ BAD_PARAMETER,
+ UNSUPPORTED,
+ OUT_OF_RESOURCES,
+ PRECONDITION_NOT_MET
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief LifeCycleState
+ *
+ * @section Description
+ * LifeCycleState is an enumeration of the states in the lifecycle above.
+ *
+ * @endif
+ */
+ enum LifeCycleState
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief CREATED
+ *
+ * @section Description
+ *
+ * The RTC object has been instantiated but not yet fully initialized.
+ * @endif
+ */
+ CREATED_STATE,
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief INACTIVE
+ *
+ * @section Description
+ *
+ * The RTC is Alive but is not being invoked in any execution
+ * context (see Section 5.2.2.5), regardless of whether the context
+ * is Running or not.
+ *
+ * @section Semantics
+ *
+ * An instance of this state exists for each execution context in
+ * which the RTC participates. If the RTC does not participate in
+ * any execution context, a single instance of this state exists.
+ *
+ * @endif
+ */
+ INACTIVE_STATE,
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ACTIVE
+ *
+ * @section Description
+ *
+ * The RTC is Alive and will be invoked in the execution context
+ * if the context is Running.
+ *
+ * @section Semantics
+ *
+ * An instance of this state exists for each execution context in
+ * which the RTC participates. If the RTC does not participate in
+ * any execution context, this state shall never be observed.
+ *
+ * @endif
+ */
+ ACTIVE_STATE,
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ERROR
+ *
+ * @section Description
+ *
+ * The RTC has encountered a problem in a given execution context
+ * and cannot continue functioning in that context without being
+ * reset.
+ *
+ * @endif
+ */
+ ERROR_STATE
+ };
+
+ interface ExecutionContext;
+ typedef sequence<ExecutionContext> ExecutionContextList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ComponentAction
+ *
+ * @section Description
+ *
+ * The ComponentAction interface provides callbacks corresponding to
+ * the execution of the lifecycle operations of LightweightRTObject
+ * (see Section 5.2.2.2) and ExecutionContext (see Section
+ * 5.2.2.5). An RTC developer may implement these callback
+ * operations in order to execute application-specific logic
+ * pointing response to those transitions.
+ *
+ * @section Semantics
+ *
+ * Clients of an RTC are not expected to invoke these operations
+ * directly; they are provided for the benefit of the RTC middleware
+ * implementation.
+ *
+ * @endif
+ */
+ interface ComponentAction
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_initialize
+ *
+ * @section Description
+ *
+ * The RTC has been initialized and entered the Alive state.
+ *
+ * @section Semantics
+ *
+ * Any RTC-specific initialization logic should be performed here.
+ *
+ * @endif
+ */
+ ReturnCode_t on_initialize();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_finalize
+ *
+ * @section Description
+ *
+ * The RTC is being destroyed.
+ *
+ * @section Semantics
+ *
+ * Any final RTC-specific tear-down logic should be performed here.
+ *
+ * @endif
+ */
+ ReturnCode_t on_finalize();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_startup
+ *
+ * @section Description
+ *
+ * The given execution context, in which the RTC is participating,
+ * has transitioned from Stopped to Running.
+ *
+ * @endif
+ */
+ ReturnCode_t on_startup(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_shutdown
+ *
+ * @section Description
+ *
+ * The given execution context, in which the RTC is participating,
+ * has transitioned from Running to Stopped.
+ *
+ * @endif
+ */
+ ReturnCode_t on_shutdown(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_activated
+ *
+ * @section Description
+ *
+ * The RTC has been activated in the given execution context.
+ *
+ * @endif
+ */
+ ReturnCode_t on_activated(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_deactivated
+ *
+ * @section Description
+ *
+ * The RTC has been deactivated in the given execution context.
+ *
+ * @endif
+ */
+ ReturnCode_t on_deactivated(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_aborting
+ *
+ * @section Description
+ *
+ * The RTC is transitioning from the Active state to the Error
+ * state in some execution context.
+ *
+ * @section Semantics
+ *
+ * This callback is invoked only a single time for time that the
+ * RTC transitions into the Error state from another state. This
+ * behavior is in contrast to that of on_error.
+ *
+ * @endif
+ */
+ ReturnCode_t on_aborting(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_error
+ *
+ * @section Description
+ *
+ * The RTC remains in the Error state.
+ *
+ * @section Semantics
+ *
+ * If the RTC is in the Error state relative to some execution
+ * context when it would otherwise be invoked from that context
+ * (according to the context’s ExecutionKind), this callback
+ * shall be invoked instead. For example,
+ *
+ * - If the ExecutionKind is PERIODIC, this operation shall be
+ * invoked in sorted order at the rate of the context instead of
+ * DataFlowComponentAction::on_execute and on_state_update.
+ *
+ * - If the ExecutionKind is EVENT_DRIVEN, this operation shall be
+ * invoked whenever FsmParticipantAction::on_action would
+ * otherwise have been invoked.
+ *
+ * @endif
+ */
+ ReturnCode_t on_error(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_reset
+ *
+ * @section Description
+ *
+ * The RTC is in the Error state. An attempt is being made to
+ * recover it such that it can return to the Inactive state.
+ *
+ * @section Semantics
+ *
+ * If the RTC was successfully recovered and can safely return to
+ * the Inactive state, this method shall complete with
+ * ReturnCode_t::OK. Any other result shall indicate that the RTC
+ * should remain in the Error state.
+ *
+ * @endif
+ */
+ ReturnCode_t on_reset(in ExecutionContextHandle_t exec_handle);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief LightweightRTObject
+ *
+ * @section Description
+ *
+ * This interface is realized by all lightweight RTCs (as required
+ * by the lightweightRTComponent stereotype). It defines the states
+ * and transitions through which all RTCs will pass from the time
+ * they are created until the time they are destroyed.
+ *
+ * @section Semantics
+ * @subsection Initialization
+ *
+ * An RTC begins in the Created state; at this point, it has been
+ * instantiated but not yet fully initialized. Note that this state
+ * is highly implementation-dependent. For example, it may
+ * correspond to the invocation of a constructor in languages that
+ * support that concept, but not all languages do. Furthermore, how
+ * soon this state is entered before initialize is invoked is
+ * implementation-dependent. Therefore, it should be relied on by
+ * RTC implementers only to the minimum extent possible. An RTC
+ * that has completed its initialization and has not been finalized
+ * is said to be Alive.
+ *
+ * @subsection Execution Context
+ *
+ * An RTC in the Alive state may participate in any number of
+ * execution contexts (see Section 5.2.2.5 ). These contexts shall
+ * be represented to an RTC as distinct instances of the
+ * ExecutionContext class. The ExecutionContext manages the behavior
+ * of each RTC that participates in it. This relationship is defined
+ * by the following state machine, which is embedded within the
+ * ExecutionContext's own lifecycle (see Figure 5.5 ). Each
+ * participating RTC is represented as a separate parallel region.
+ *
+ * Relative to a given execution context, an RTC may either be
+ * Active, Inactive, or in Error. When the RTC is Active in a
+ * Running execution context, the ComponentAction callbacks (see
+ * Section 5.2.2.4) shall be invoked as appropriate for the context’
+ * s ExecutionKind. The callbacks shall not be invoked relative to
+ * that context when either the RTC is Inactive in that context or
+ * the context is Stopped. (Note that starting and stopping an
+ * execution context shall not impact whether its participating RTCs
+ * are Active or Inactive.) It may be that a given RTC does not
+ * directly participate in any execution contexts. Such an RTC is
+ * referred to as passive. A passive RTC may provide services to
+ * other components upon request. At any other time, it shall not be
+ * required to perform any ongoing activity of its own; therefore,
+ * instances of such an RTC typically exist only as parts (directly
+ * or indirectly) of a containing active RTC.
+ *
+ * @subsection Error Handling
+ *
+ * If an operation fails while the RTC is Active in a given
+ * execution context, the RTC will transition to the Error state
+ * corresponding to that context. While the RTC is in Error, the
+ * ComponentAction::on_error callback will be invoked in place of
+ * those callbacks that would otherwise have been invoked according
+ * to the context’s ExecutionKind. For example, if the kind is
+ * PERIODIC, on_error shall be invoked instead of the pair of
+ * on_execute, and on_state_update. When an RTC is in Error, it may
+ * be reset. If resetting is successful, the RTC shall return to the
+ * Inactive state. If resetting is unsuccessful, it shall remain in
+ * the Error state.
+ *
+ * @endif
+ */
+ interface LightweightRTObject
+ : ComponentAction
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief initialize
+ *
+ * @section Description
+ * Initialize the RTC that realizes this interface.
+ *
+ * @section Semantics
+ * The invocation of this operation shall result in the invocation
+ * of the callback ComponentAction::on_initialize.
+ *
+ * @section Constraints
+ *
+ * - An RTC may be initialized only while it is in the Created
+ * state. Any attempt to invoke this operation while in another
+ * state shall fail with ReturnCode_t::PRECONDITION_NOT_MET.
+ * - Application developers are not expected to call this operation
+ * directly; it exists for use by the RTC infrastructure.
+ *
+ * @endif
+ */
+ ReturnCode_t initialize();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief finalize
+ *
+ * @section Description
+ *
+ * Finalize the RTC that realizes this interface, preparing it for
+ * destruction.
+ *
+ * @section Semantics
+ *
+ * This invocation of this operation shall result in the
+ * invocation of the callback ComponentAction::on_finalize
+ *
+ * @section Constraints
+ *
+ * - An RTC may not be finalized while it is participating in any
+ * execution context. It must first be removed with
+ * ExecutionContextOperations::remove_component. Otherwise, this
+ * operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET. See Figure 5.9.
+ *
+ * - An RTC may not be finalized while it is in the Created state. Any
+ * attempt to invoke this operation while in that state shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * - Application developers are not expected to call this operation
+ * directly; it exists for use by the RTC infrastructure.
+ *
+ * @endif
+ */
+ ReturnCode_t finalize();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief is_alive
+ *
+ * @section Description
+ *
+ * A component is alive or not regardless of the execution context
+ * from which it is observed. However, whether or not it is
+ * Active, Inactive, or in Error is dependent on the execution
+ * context(s) (see Figure 5.7) in which it is running. That is, it
+ * may be Active in one context but Inactive in
+ * another. Therefore, this operation shall report whether this
+ * RTC is either Active, Inactive, or in Error; which of those
+ * states a component is in with respect to a particular context
+ * may be queried from the context itself.
+ *
+ * @endif
+ *
+ */
+ boolean is_alive(in ExecutionContext exec_context);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief exit
+ *
+ * @section Description
+ *
+ * Stop the RTC’s execution context(s) and finalize it along with
+ * its contents.
+ *
+ * @section Semantics
+ *
+ * Any execution contexts for which the RTC is the owner shall be
+ * stopped. If the RTC participates in any execution contexts
+ * belonging to another RTC that contains it, directly or
+ * indirectly (i.e., the containing RTC is the owner of the
+ * ExecutionContext), it shall be deactivated in those contexts.
+ * After the RTC is no longer Active in any Running execution
+ * context, it and any RTCs contained transitively within it shall
+ * be finalized.
+ *
+ * @section Constraints
+ *
+ * An RTC cannot be exited if it has not yet been initialized. Any
+ * attempt to exit an RTC that is in the Created state shall fail
+ * with ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * @endif
+ */
+ ReturnCode_t exit();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief attach_context
+ *
+ * @section Description
+ *
+ * Inform this RTC that it is participating in the given execution
+ * context. Return a handle that represents the association of
+ * this RTC with the context.
+ *
+ * @section Semantics
+ *
+ * This operation is intended to be invoked by
+ * ExecutionContextOperations::add_component (see Section
+ * 5.2.2.6.6). It is not intended for use by other clients.
+ *
+ * @endif
+ */
+ ExecutionContextHandle_t attach_context(in ExecutionContext exec_context);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief detach_context
+ * @section Description
+ *
+ * Inform this RTC that it is no longer participating in the given
+ * execution context.
+ *
+ * @section Semantics
+ *
+ * This operation is intended to be invoked by
+ * ExecutionContextOperations::remove_component (see Section
+ * 5.2.2.6.7). It is not intended for use by other clients.
+ *
+ * @section Constraints
+ *
+ * - This operation may not be invoked if this RTC is not already
+ * participating in the execution context. Such a call shall fail
+ * with ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * - This operation may not be invoked if this RTC is Active in
+ * the indicated execution context. Otherwise, it shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * @endif
+ */
+ ReturnCode_t detach_context(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_context
+ *
+ * @section Description
+ *
+ * Obtain a reference to the execution context represented by the
+ * given handle.
+ *
+ * @section Semantics
+ *
+ * The mapping from handle to context is specific to a particular
+ * RTC instance. The given handle must have been obtained by a
+ * previous call to attach_context on this RTC.
+ *
+ * @endif
+ */
+ ExecutionContext get_context(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief get_owned_contexts
+ *
+ * @section Description
+ *
+ * この RTC が所有する ExecutionContext のリストを取得する。
+ *
+ * @else
+ * @brief get_owned_contexts
+ *
+ * @section Description
+ *
+ * This operation returns a list of all execution contexts owned
+ * by this RTC.
+ *
+ * @endif
+ */
+ ExecutionContextList get_owned_contexts();
+
+ /*!
+ * @if jp
+ * @brief get_participating_contexts
+ *
+ * @section Description
+ *
+ * この RTC が参加しているすべての ExecutionContext のリストを取得する。
+ *
+ * @section Semantics
+ *
+ * このリストに含まれる実行コンテキストは、attach_context が呼び出
+ * されるごとに、リストに追加され、detach_context が呼び出されるご
+ * とに、リストから削除される。
+ *
+ * @else
+ * @brief* get_participating_contexts
+ *
+ * @section Description
+ *
+ * This operation returns a list of all execution contexts in
+ * which this RTC participates.
+ *
+ * @section Semantics
+ *
+ * Each call to attach_context causes the provided context to be
+ * added to this list. Each call to detach_context causes the
+ * provided context to be removed from this list.
+ *
+ * @endif
+ */
+ ExecutionContextList get_participating_contexts();
+
+ /*!
+ * @if jp
+ * ### [誤植] RTC.idl には含まれていないがPIMには含まれている。
+ * ### PIMが正しい。
+ *
+ * @brief
+ * @else
+ * @brief get_context_handle
+ *
+ * @section Description
+ *
+ * This operation returns a handle that is associated with the given
+ * execution context.
+ *
+ * @endif
+ */
+ ExecutionContextHandle_t get_context_handle(in ExecutionContext cxt);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ExecutionKind
+ *
+ * @sectioni Description
+ *
+ * The ExecutionKind enumeration defines the execution semantics
+ * (see Section 5.3) of the RTCs that participate in an execution
+ * context.
+ *
+ * @endif
+ */
+ enum ExecutionKind
+ {
+ /*!
+ * @if jp
+ * @brief
+ *
+ * @else
+ * @brief PERIODIC
+ *
+ * @section Description
+ *
+ * The participant RTCs are executing according to periodic
+ * sampled data semantics (see Section 5.3.1).
+ *
+ * @endif
+ */
+ PERIODIC,
+ /*!
+ * @if jp
+ * @brief
+ *
+ * @else
+ * @brief EVENT_DRIVEN
+ *
+ * @section Description
+ *
+ * The participant RTCs are executing according to stimulus
+ * response semantics (see Section 5.3.2).
+ *
+ * @endif
+ */
+ EVENT_DRIVEN,
+ /*!
+ * @if jp
+ * @brief
+ *
+ * @else
+ * @brief OTHER
+ *
+ * @section Description
+ *
+ * The participant RTCs are executing according to some semantics
+ * not defined by this specification.
+ *
+ * @endif
+ */
+ OTHER
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ExecutionContext
+ *
+ * @section Description
+ *
+ * An ExecutionContext allows the business logic of an RTC to be
+ * decoupled from the thread of control in which it is executed. The
+ * context represents a logical thread of control and is provided to
+ * RTCs at runtime as an argument to various operations, allowing
+ * them to query and modify their own state, and that of other RTCs
+ * executing within the same context, in the lifecycle. This
+ * separation of concerns is important for two primary reasons:
+ *
+ * - Large number of components may collaborate tightly within a
+ * single node or process. If each component were to run within its
+ * own thread of control, the infrastructure may not be able to
+ * satisfy the timeliness and determinism requirements of real-time
+ * applications due to the large number of threads and the required
+ * synchronization between them.
+ *
+ * - A single application may carry out a number of independent
+ * tasks that require different execution rates. For example, it may
+ * need to sample a sensor periodically at a very high rate and update a
+ * user interface at a much lower rate.
+ *
+ * @section Semantics
+ *
+ * The state machine of an ExecutionContext has two parts. The
+ * behavior of the ExecutionContext itself is defined by the upper
+ * region in the above figure. The behavior of the RTCs that
+ * participate in the context is defined by the lower region. The
+ * contents of that region are displayed in more detail in Figure
+ * 5.5 in Section 5.2.2.2. Ownership and Participation Each
+ * execution context is owned by a single RTC and may be used to
+ * execute that RTC and the RTCs contained within it, directly or
+ * indirectly. An RTC that owns one or more execution contexts is
+ * known as an autonomous RTC. An autonomous RTC and some subset of
+ * the RTCs within it (to be defined by the application developer)
+ * shall be executed by the infrastructure according to the context’
+ * s execution kind, which defines when each RTC’s operations will
+ * be invoked when and in which order. These RTCs are said to
+ * participate in the context. The available execution kinds are
+ * described in Section 5.2.2.7. The relationship between RTCs and
+ * execution contexts may be many-to-many in the general case:
+ * multiple RTCs may be invoked from the same execution context, and
+ * a single RTC may be invoked from multiple contexts. In the case
+ * where multiple RTCs are invoked from the same context, starting
+ * or stopping the context shall result in the corresponding
+ * lifecycle transitions for all of those components.
+ *
+ * @section Logical and Physical Threads
+ *
+ * Although an execution context represents a logical thread of
+ * control, the choice of how it maps to a physical thread shall be
+ * left to the application’s deployment
+ * environment. Implementations may elect to associate contexts with
+ * threads with a one-to-one mapping, to serve multiple contexts
+ * from a single thread, or by any other means. In the case where a
+ * given RTC may be invoked from multiple contexts, concurrency
+ * management is implementation-dependent.
+ *
+ * @endif
+ */
+ interface ExecutionContext
+ {
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief is_running
+ * @section Description
+ *
+ * This operation shall return true if the context is in the
+ * Running state.
+ *
+ * @section Semantics
+ *
+ * While the context is Running, all Active RTCs participating in
+ * the context shall be executed according to the context’s
+ * execution kind.
+ *
+ * @endif
+ */
+ boolean is_running();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ *
+ * @brief start
+ *
+ * @section Description
+ *
+ * Request that the context enter the Running state. Once the
+ * state transition occurs, the ComponentAction::on_startup
+ * operation (see Section 5.2.2.4.3) will be invoked. @section *
+ *
+ * @section Semantics
+ *
+ * An execution context may not be started
+ * until the RT components that participate in it have been
+ * initialized. An execution context may be started and stopped
+ * multiple times.
+ *
+ * @section Constraints
+ *
+ * - This operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET if the context is not in the
+ * Stopped state.
+ *
+ * - This operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET if any of the participating
+ * components are not in their Alive state.
+ *
+ * @endif
+ */
+ ReturnCode_t start();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief stop
+ *
+ * @section Description
+ *
+ * Request that the context enter the Stopped state. Once the
+ * transition occurs, the ComponentAction::on_shutdown operation
+ * (see Section 5.2.2.4.4) will be invoked.
+ *
+ * @section Semantics
+ *
+ * An execution context must be stopped before the RT components
+ * that participate in it are finalized.
+ *
+ * An execution context may be started and stopped multiple times.
+ *
+ * @section Constraints
+ *
+ * - This operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET if the context is not in the
+ * Running state.
+ *
+ * @endif
+ */
+ ReturnCode_t stop();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_rate
+ *
+ * @section Description
+ *
+ * This operation shall return the rate (in hertz) at which its
+ * Active participating RTCs are being invoked.
+ *
+ * @section Semantics
+ *
+ * An implementation is permitted to perform some periodic or
+ * quasi-periodic processing within an execution context with an
+ * ExecutionKind other than PERIODIC. In such a case, the result
+ * of this operation is implementation-defined. If no periodic
+ * processing of any kind is taking place within the context, this
+ * operation shall fail as described in Section 5.2.1.
+ *
+ * @section Constraints
+ *
+ * - If the context has an ExecutionKind of PERIODIC, this
+ * operation shall return a rate greater than zero.
+ *
+ * @endif
+ */
+ double get_rate();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief set_rate
+ *
+ * @section Description
+ *
+ * This operation shall set the rate (in hertz) at which this
+ * context’s Active participating RTCs are being called.
+ *
+ * @section Semantics
+ *
+ * If the execution kind of the context is PERIODIC, a rate change
+ * shall result in the invocation of on_rate_changed on any RTCs
+ * realizing DataFlowComponentAction that are registered with any
+ * RTCs participating in the context. An implementation is
+ * permitted to perform some periodic or quasi-periodic processing
+ * within an execution context with an ExecutionKind other than
+ * PERIODIC. If such is the case, and the implementation reports a
+ * rate from get_rate, this operation shall set that rate
+ * successfully provided that the given rate is valid. If no
+ * periodic processing of any kind is taking place within the
+ * context, this operation shall fail with
+ * ReturnCode_t::UNSUPPORTED.
+ *
+ * @section Constraints
+ *
+ * - The given rate must be greater than zero. Otherwise, this
+ * operation shall fail with ReturnCode_t::BAD_PARAMETER.
+ *
+ * @endif
+ */
+ ReturnCode_t set_rate(in double rate);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief add_component
+ *
+ * @section Description
+ *
+ * The operation causes the given RTC to begin participating in
+ * the execution context.
+ *
+ * @section Semantics
+ *
+ * The newly added RTC will receive a call to
+ * LightweightRTComponent::attach_context (see Section 5.2.2.2.5)
+ * and then enter the Inactive state.
+ *
+ * @section Constraints
+ *
+ * - If the ExecutionKind of this context is PERIODIC, the RTC
+ * must be a data flow component (see Section 5.3.1.1).
+ * Otherwise, this operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * - If the ExecutionKind of this context is EVENT_DRIVEN, the RTC
+ * must be an FSM participant (see Section 5.3.2.3). Otherwise,
+ * this operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * @endif
+ */
+ ReturnCode_t add_component(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief remove_component
+ *
+ * @section Description
+ *
+ * This operation causes a participant RTC to stop participating
+ * in the execution context.
+ *
+ * @section Semantics
+ *
+ * The removed RTC will receive a call to
+ * LightweightRTComponent::detach_context (see Section 5.2.2.2.6).
+ *
+ * @section Constraints
+ *
+ * - If the given RTC is not currently participating in the
+ * execution context, this operation shall fail with
+ * ReturnCode_t::BAD_PARAMETER.
+ *
+ * - An RTC must be deactivated before it can be removed from an
+ * execution context. If the given RTC is participating in the
+ * execution context but is still in the Active state, this
+ * operation shall fail with ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * @endif
+ */
+ ReturnCode_t remove_component(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief activate_component
+ *
+ * @section Description
+ *
+ * The given participant RTC is Inactive and is therefore not
+ * being invoked according to the execution context’s execution
+ * kind. This operation shall cause the RTC to transition to the
+ * Active state such that it may subsequently be invoked in this
+ * execution context.
+ *
+ * @section Semantics
+ *
+ * The callback on_activate shall be called as a result of calling
+ * this operation. This operation shall not return until the
+ * callback has returned, and shall result in an error if the
+ * callback does. The following figure is a non-normative example
+ * sequence diagram for activate_component.
+ *
+ * @section Constraints
+ *
+ * - An execution context can only activate its participant
+ * components. If the given RTC is not participating in the
+ * execution context, this operation shall fail with
+ * ReturnCode_t::BAD_PARAMETER.
+ *
+ * - An RTC that is in the Error state cannot be activated until
+ * after it has been reset. If the given RTC is in the Error
+ * state, this operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * - This operation shall fail with ReturnCode_t::BAD_PARAMETER if
+ * the given component is not in its Alive state.
+ *
+ * @endif
+ */
+ ReturnCode_t activate_component(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief deactivate_component
+ *
+ * @section Description
+ *
+ * The given RTC is Active in the execution context. Cause it to
+ * transition to the Inactive state such that it will not be
+ * subsequently invoked from the context unless and until it is
+ * activated again.
+ *
+ * @section Semantics
+ *
+ * The callback on_deactivate shall be called as a result of
+ * calling this operation. This operation shall not return until
+ * the callback has returned, and shall result in an error if the
+ * callback does. The following figure is a non-normative example
+ * sequence diagram for deactivate_component.
+ *
+ * @section Constraints
+ *
+ * - An execution context can only deactivate its participant
+ * components. If the given RTC is not participating in the
+ * execution context, this operation shall fail with
+ * ReturnCode_t::BAD_PARAMETER.
+ *
+ * - This operation shall fail with ReturnCode_t::BAD_PARAMETER if
+ * the given component is not in its Alive state.
+ *
+ * @endif
+ */
+ ReturnCode_t deactivate_component(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief reset_component
+ *
+ * @section Description
+ *
+ * Attempt to recover the RTC when it is in Error.
+ *
+ * @section Semantics
+ *
+ * The ComponentAction::on_reset callback shall be invoked. This
+ * operation shall not return until the callback has returned, and
+ * shall result in an error if the callback does. If possible, the
+ * RTC developer should implement that callback such that the RTC
+ * may be returned to a valid state. * If this operation fails,
+ * the RTC will remain in Error.
+ *
+ * @section Constraints
+ *
+ * - An RTC may only be reset in an execution context in which it
+ * is in error. If the RTC is not in Error in the identified
+ * context, this operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET. However, that failure shall
+ * not cause the RTC to enter the Error state.
+ *
+ * - An RTC may not be reset while in the Created state. Any
+ * attempt to invoke this operation while the RTC is in that state
+ * shall fail with ReturnCode_t::PRECONDITION_NOT_MET. However,
+ * that failure shall not cause the RTC to enter the Error state.
+ *
+ * @endif
+ */
+ ReturnCode_t reset_component(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_component_state
+ *
+ * @section Description
+ *
+ * This operation shall report the LifeCycleState of the given
+ * participant RTC.
+ *
+ * @section Constraints
+ *
+ * - The given RTC must be Alive.
+ *
+ * - The given RTC must be a participant in the target execution context.
+ *
+ * - The LifeCycleState returned by this operation shall be one of
+ * LifeCycleState::INACTIVE, ACTIVE, or ERROR.
+ *
+ * @endif
+ */
+ LifeCycleState get_component_state(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_kind
+ *
+ * @section Description
+ *
+ * This operation shall report the execution kind of the execution
+ * context.
+ *
+ * @endif
+ */
+ ExecutionKind get_kind();
+ };
+
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief DataFlowComponentAction
+ *
+ * @section Description
+ *
+ * DataFlowComponentAction is a companion to ComponentAction (see
+ * Section 5.2.2.4) that provides additional callbacks for
+ * intercepting the two execution passes defined in Section
+ * 5.3.1.1.2.
+ *
+ * @endif
+ */
+ interface DataFlowComponentAction
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_execute
+ * @section Description
+ *
+ * This operation will be invoked periodically at the rate of the
+ * given execution context as long as the following conditions
+ * hold:
+ *
+ * - The RTC is Active.
+ *
+ * - The given execution context is Running.
+ *
+ * @section Semantics
+ *
+ This callback occurs during the first execution pass.
+ *
+ * @section Constraints
+ *
+ * - The execution context of the given context shall be PERIODIC.
+ *
+ * @endif
+ */
+ ReturnCode_t on_execute(in ExecutionContextHandle_t exec_handle);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_state_update
+ *
+ * @section Description
+ *
+ * This operation will be invoked periodically at the rate of the
+ * given execution context as long as the following conditions hold:
+ *
+ * - The RTC is Active.
+ *
+ * - The given execution context is Running.
+ *
+ * @section Semantics
+ *
+ * This callback occurs during the second execution pass.
+ *
+ * @section Constraints
+ *
+ * - The execution context of the given context shall be PERIODIC.
+ *
+ *
+ * @endif
+ */
+ ReturnCode_t on_state_update(in ExecutionContextHandle_t exec_handle);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_rate_changed
+ *
+ * @section Description
+ *
+ * This operation is a notification that the rate of the indicated
+ * execution context (see Section 5.2.2.6.4) has changed.
+ *
+ * @section Constraints
+ *
+ * - The execution context of the given context shall be PERIODIC.
+ *
+ *
+ * @endif
+ */
+ ReturnCode_t on_rate_changed(in ExecutionContextHandle_t exec_handle);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief dataFlowComponent
+ *
+ * @section Description
+ *
+ * The dataFlowComponent stereotype may be applied to a component
+ * type to indicate that its instances should be executed in sorted
+ * order by a periodic execution context.
+ *
+ * @section Constraints
+ *
+ * - An instance of a component extended by the dataFlowComponent
+ * stereotype must participate in at least one * execution context
+ * of kind PERIODIC, which shall also be used for the execution of
+ * any contained data flow components.
+ *
+ * - A component extended by dataFlowComponent must realize the
+ * interface DataFlowComponentAction.
+ *
+ *
+ * @endif
+ */
+ interface DataFlowComponent
+ : LightweightRTObject, DataFlowComponentAction
+ {
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief fsm
+ *
+ * @section Description
+ *
+ * Applying the fsm stereotype to a component implies the ability to
+ * define component-specific states and transitions.
+ *
+ * @section Semantics
+ *
+ * In creating a state machine such as is depicted in Figure 5.22,
+ * the RTC developer is implicitly defining the Active state to be a
+ * submachine state. * The BehaviorStateMachines package described
+ * in [UML] is considered the normative definition of a state
+ * machine.
+ *
+ * @endif
+ */
+ interface Fsm
+ : LightweightRTObject
+ {
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief FsmParticipantAction
+ *
+ * @section Description
+ *
+ * FsmParticipantAction is companion to ComponentAction (see Section
+ * 5.2.2.4) that is intended for use with FSM participant RTCs. It
+ * adds a callback for the interception of state transitions, state
+ * entries, and state exits.
+ *
+ * @endif
+ */
+ interface FsmParticipantAction
+ {
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_action
+ *
+ * @section Description
+ *
+ * The indicated FSM participant RTC has been invoked as a result
+ * of a transition, state entry, or state exit in its containing
+ * FSM.
+ *
+ * @section Constraints
+ *
+ * - The given execution context shall be of kind EVENT_DRIVEN.
+ *
+ * @endif
+ */
+ ReturnCode_t on_action(in ExecutionContextHandle_t exec_handle);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief
+ * @endif
+ */
+ interface FsmParticipant
+ : LightweightRTObject, FsmParticipantAction
+ {
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief Mode
+ *
+ * @section Description
+ *
+ * Each mode defined by a given RTC shall be represented by an
+ * instance of Mode.
+ *
+ * @endif
+ */
+ interface Mode
+ {
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ModeCapable
+ *
+ * @section Description
+ *
+ * The ModeCapable interface provides access to an object’s modes
+ * and a means to set the current mode.
+ *
+ * @section Semantics
+ *
+ * A given RTC may support multiple modes as well as multiple
+ * execution contexts. In such a case, a request for a mode change
+ * (e.g., from "cruise control on" to "cruise control off") may
+ * come asynchronously with respect to one or more of those
+ * execution contexts. The mode of an RTC may therefore be observed
+ * to be different from one execution context to another. - A mode
+ * is pending in a given execution context when a mode change has
+ * been requested but the new mode has not yet been observed by that
+ * context.
+ *
+ * - The new mode has been committed in a given execution context
+ * when the context finally observes the new mode.
+ *
+ * - The new mode has stabilized once it has been committed in all
+ * execution contexts in which the RTC participates.
+ *
+ * Figure 5.26 depicts a state machine that describes mode
+ * changes. Each parallel region in the composite state Mode Pending
+ * represents an execution context. The trigger "sample" within
+ * that state is considered to have occurred: - …just before the
+ * next call to on_execute (see Section 5.3.1.2.1) in the case where
+ * immediate is false and the execution kind is PERIODIC, …
+ *
+ * - …just before the processing of the next stimulus in the case
+ * where immediate is false and the execution kind is
+ * EVENT_DRIVEN, or …- …immediately in all other cases.
+ *
+ * @endif
+ */
+ interface ModeCapable
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_default_mode
+ *
+ * @section Description
+ *
+ * This operation shall return the mode in which the RTC shall be
+ * when no other mode has been set.
+ *
+ * @section Constraints
+ *
+ * - This operation shall not return nil.
+ *
+ * @endif
+ */
+ Mode get_default_mode();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_current_mode
+ *
+ * @section Description
+ *
+ * This operation shall return the last mode to have
+ * stabilized. If no mode has been explicitly set, the current
+ * mode shall be the default mode.
+ *
+ * @section Constraints
+ *
+ * - This operation shall never return nil.
+ *
+ * @endif
+ */
+ Mode get_current_mode();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_current_mode_in_context
+ *
+ * @section Description
+ *
+ * This operation returns the current mode of the component as
+ * seen by the indicated execution context.
+ *
+ * @section Semantics
+ *
+ * The manner in which this property changes is described in Figure 5.26.
+ *
+ * @endif
+ */
+ Mode get_current_mode_in_context(in ExecutionContext exec_context);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_pending_mode
+ *
+ * @section Description
+ *
+ * This operation shall return the last mode to have been passed
+ * to set_mode that has not yet stabilized. Once the RTC’s mode
+ * has stabilized, this operation shall return nil.
+ *
+ * @endif
+ */
+ Mode get_pending_mode();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_pending_mode_in_context
+ *
+ * @section Description
+ *
+ * If the last mode to be requested by a call to set_mode is
+ * different than the current mode as seen by the indicated
+ * execution context (see get_current_mode_in_context), this
+ * operation returns the former. If the requested mode has already
+ * been seen in that context, it returns nil.
+ *
+ * @section Semantics
+ *
+ * See Figure 5.26 for a description of how the pending mode
+ * relates to the current mode within a given execution context.
+ *
+ * @endif
+ */
+ Mode get_pending_mode_in_context(in ExecutionContext exec_context);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief set_mode
+ *
+ * @section Description
+ *
+ * This operation shall request that the RTC change to the indicated mode.
+ *
+ * @section Semantics
+ *
+ * Usually, the new mode will be pending in each execution context
+ * in which the component executes until the next sample period
+ * (if the execution kind is PERIODIC); at that point it will
+ * become the current mode in that context and there will no
+ * longer be a pending mode. However, in some cases it is
+ * important for a mode change to take place immediately; for
+ * example, a serious fault has occurred and the component must
+ * enter an emergency mode to ensure fail-safe behavior in a
+ * safety-critical system. In such a case, immediate should be
+ * true and the mode change will take place in all contexts
+ * without waiting for the next sample period.
+ *
+ * @endif
+ */
+ ReturnCode_t set_mode(in Mode new_mode,
+ in boolean immediate);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief MultiModeComponentAction
+ *
+ * MultiModeComponentAction is a companion to ComponentAction that
+ is realized by RTCs that support multiple modes.
+ *
+ * @endif
+ */
+ interface MultiModeComponentAction
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_mode_changed
+ *
+ * @section Description
+ *
+ * This callback is invoked each time the observed mode of a
+ * component has changed with respect to a particular execution
+ * context.
+ *
+ * @section Semantics
+ *
+ * If the context is PERIODIC, this callback shall come before the
+ * next call to on_execute (see Section 5.3.1.2.1) within that
+ * context. The new mode can be retrieved with
+ * get_current_mode_in_context. If the result is the same as the
+ * result of get_current_mode, the mode has stabilized.
+ *
+ * @endif
+ */
+ ReturnCode_t on_mode_changed(in ExecutionContextHandle_t exec_handle);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief
+ * @endif
+ */
+ interface MultiModeObject
+ : LightweightRTObject, ModeCapable, MultiModeComponentAction
+ {
+ };
+
+ interface RTObject;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief PortInterfacePolarity
+ *
+ * @section Description
+ *
+ * The PortInterfacePolarity enumeration identifies exposed
+ * interface instances as provided or required. @endif
+ */
+ enum PortInterfacePolarity
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief PROVIDED
+ *
+ * @section Description
+ *
+ * The target interface is provided as an output by the target
+ * port.
+ *
+ * @endif
+ */
+ PROVIDED,
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief REQUIRED
+ *
+ * @section Description
+ *
+ * The target interface is required as an input by the target port.
+ *
+ * @endif
+ */
+ REQUIRED
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief PortInterfaceProfile
+ *
+ * @section Description
+ *
+ * PortInterfaceProfile describes an instance of a particular
+ * interface as it is exposed by a particular port. These objects
+ * are referred to below as the "target interface" and "target
+ * port" respectively.
+ *
+ * @endif
+ */
+ struct PortInterfaceProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief instance_name
+ *
+ * @section Description
+ *
+ * This attribute stores the name of the target interface instance.
+ *
+ * @endif
+ */
+ string instance_name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief type_name
+ *
+ * @section Description
+ *
+ * This attribute stores the name of the target interface type.
+ *
+ * @endif
+ */
+ string type_name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief polarity
+ *
+ * @section Description
+ *
+ * This attribute indicates whether the target interface instance
+ * is provided or required by the RTC.
+ *
+ * @endif
+ */
+ PortInterfacePolarity polarity;
+ };
+
+ typedef sequence<PortInterfaceProfile> PortInterfaceProfileList;
+
+ interface PortService;
+ typedef sequence<PortService> PortServiceList;
+ typedef sequence<RTObject> RTCList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ConnectorProfile
+ *
+ * @section Description
+ *
+ * The ConnectorProfile contains information about a connection
+ * between the ports of collaborating RTCs.
+ *
+ * @endif
+ */
+ struct ConnectorProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief name
+ *
+ * @section Description
+ *
+ * This attribute contains the name of this connection.
+ *
+ * @endif
+ */
+ string name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief connector_id
+ *
+ * @section Description
+ *
+ * Each connector has a unique identifier that is assigned when
+ * connection is established. This attribute stores that
+ * identifier.
+ *
+ * @endif
+ */
+ UniqueIdentifier connector_id;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ports
+ *
+ * @section Description
+ *
+ * This field stores references to all ports connected by the
+ * target connector.
+ *
+ * @endif
+ */
+ PortServiceList ports;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief properties
+ *
+ * @section Description
+ *
+ * This attribute contains additional properties of the connection.
+ *
+ * @section Semantics
+ *
+ * This attribute provides implementations the opportunity to
+ * describe additional characteristics of a particular connection
+ * that are outside of the scope of this specification.
+ *
+ * @endif
+ */
+ NVList properties;
+ };
+
+ typedef sequence<ConnectorProfile> ConnectorProfileList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief PortProfile
+ *
+ * @section Description
+ *
+ * A PortProfile describes a port of an RTC (referred to as the
+ * "target" RTC). This port is referred to as the "target" port.
+ * From this profile, other components and tools can obtain Port’s
+ * name, type, object reference, and so on.
+ *
+ * @endif
+ */
+ struct PortProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief name
+ *
+ * @section Description
+ *
+ * This attribute contains the name of the target port.
+ *
+ * @section Semantics
+ *
+ * Ports owned by an RTC are distinguished by their
+ * names. Therefore, this name should be unique within the target
+ * RTC.
+ *
+ * @endif
+ */
+ string name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief interfaces
+ *
+ * @section Description
+ *
+ * This attribute contains the name and polarity of each interface
+ * exposed by the target port.
+ *
+ * @endif
+ */
+ PortInterfaceProfileList interfaces;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief port_ref
+ *
+ * @section Description
+ *
+ * This attributes contains a reference to the target port.
+ *
+ * @endif
+ */
+ PortService port_ref;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief connector_profiles
+ *
+ * @section Description
+ *
+ * This attribute contains a collection of profiles describing the
+ * connections to the target port.
+ *
+ * @endif
+ */
+ ConnectorProfileList connector_profiles;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief owner
+ *
+ * @section Description
+ *
+ * This attribute contains a reference to the target RTC.
+ *
+ * @endif
+ */
+ RTObject owner;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief properties
+ *
+ * @section Description
+ *
+ * This attribute contains additional properties of the port.
+ *
+ * @section Semantics
+ *
+ * This attribute provides implementations the opportunity to
+ * describe additional characteristics of a particular port that
+ * are otherwise outside of the scope of this specification.
+ *
+ * @endif
+ */
+ NVList properties;
+ };
+
+ typedef sequence<PortProfile> PortProfileList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief
+ * @endif
+ */
+ struct ExecutionContextProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief kind
+ *
+ * @section Description
+ *
+ * This attribute stores the context’s ExecutionKind.
+ *
+ * @endif
+ */
+ ExecutionKind kind;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief rate
+ *
+ * @section Description
+ *
+ * This attribute stores execution rate.
+ *
+ * @section Semantics
+ *
+ * If the execution kind is not PERIODIC, the value here may not
+ * be valid (and should be negative in that case). See
+ * ExecutionContext::get_rate (see Section 5.2.2.6.4) and set_rate
+ * (see Section 5.2.2.6.5) for more information.
+ *
+ * @endif
+ */
+ double rate;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief owner
+ *
+ * @section Description
+ *
+ * This attribute stores a reference to the RTC that owns the context.
+ *
+ * @endif
+ */
+ RTObject owner;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief participants
+ *
+ * @section Description
+ *
+ * This attribute stores references to the context’s participant RTCs.
+ *
+ * @endif
+ */
+ RTCList participants;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief properties
+ *
+ * @section Description
+ *
+ * This attribute contains additional properties of the execution
+ * context.
+ *
+ * @section Semantics
+ *
+ * This attribute provides implementations the opportunity to
+ * describe additional characteristics of a particular execution
+ * context that are outside the scope of this specification.
+ *
+ * @endif
+ */
+ NVList properties;
+ };
+
+ typedef sequence<ExecutionContextProfile>
+ ExecutionContextProfileList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief FsmObject
+ *
+ * @section Description
+ *
+ * The FsmObject interface allows programs to send stimuli to a
+ * finite state machine, possibly causing it to change states.
+ *
+ * @endif
+ */
+ interface FsmObject
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief send_stimulus
+ *
+ * @section Description
+ *
+ * Send a stimulus to an FSM that realizes this interface.
+ *
+ * @section Semantics
+ *
+ * If the stimulus corresponds to any outgoing transition of the
+ * current state, that transition shall be taken and the state
+ * shall change. Any FSM participants associated with the exit of
+ * the current state, the transition to the new state, or the
+ * entry to the new state shall be invoked. If the stimulus does
+ * not correspond to any such transition, this operation shall
+ * succeed but have no effect.
+ *
+ * If the given execution context is a non-nil reference to a
+ * context in which this FSM participates, the transition shall be
+ * executed in that context. If the argument is nil, the FSM shall
+ * choose an EVENT_DRIVEN context in which to execute the
+ * transition. If the argument is non-nil, but this FSM does not
+ * participate in the given context, this operation shall fail
+ * with * ReturnCode_t::BAD_PARAMETER.
+ *
+ * @section Constraints
+ *
+ * - The given execution context shall be of kind EVENT_DRIVEN.
+ *
+ * @endif
+ */
+ ReturnCode_t send_stimulus(in string message,
+ in ExecutionContextHandle_t exec_handle);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief FsmBehaviorProfile
+ *
+ * @section Description
+ *
+ * FsmBehaviorProfile represents the association of an FSM
+ * participant with a transition, state entry, or state exit in an
+ * FSM.
+ *
+ * @section Semantics
+ *
+ * The assignment of identifiers to particular transitions, state
+ * entries, or state exits is implementation-dependent.
+ *
+ * @endif
+ */
+ struct FsmBehaviorProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief action_component
+ *
+ * @section Description
+ *
+ * This attribute stores a reference to the FSM participant that
+ * is invoked when the containing Fsm receives a message
+ * distinguished by id.
+ *
+ * @endif
+ */
+ FsmParticipantAction action_component;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief id
+ *
+ * @section Description
+ *
+ * This attribute stores the message identifier.
+ *
+ * @endif
+ */
+ UniqueIdentifier id;
+ };
+
+ typedef sequence<FsmBehaviorProfile> FsmBehaviorProfileList;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief FsmProfile
+ *
+ * @section Description
+ *
+ * The FsmProfile describes the correspondence between an FSM and
+ * its contained FSM participants. This Profile is necessary for
+ * Stimulus Response Processing.
+ *
+ * @endif
+ */
+ struct FsmProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief behavior_profiles
+ *
+ * @section Description
+ *
+ * This attribute lists the correspondences between an FSM and its
+ * contained FSM participants.
+ *
+ * @endif
+ */
+ FsmBehaviorProfileList behavior_profiles;
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief FsmService
+ *
+ * @section Description
+ *
+ * The FsmService interface defines operations necessary for
+ * Stimulus Response Processing as an SDO service.
+ *
+ * @endif
+ */
+ interface FsmService
+ : SDOPackage::SDOService
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_fsm_profile
+ *
+ * @section Description
+ *
+ * Get the current state of the FSM.
+ *
+ * @section Semantics
+ *
+ * Modifications to the object returned by this operation will not
+ * be reflected in the FSM until and unless set_fsm_profile is
+ * called.
+ *
+ * @endif
+ */
+ FsmProfile get_fsm_profile();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief set_fsm_profile
+ *
+ * @section Description
+ *
+ * This operation will be used to modify the behavior of an FSM as
+ * described in Stimulus Response Processing.
+ *
+ * @endif
+ */
+ ReturnCode_t set_fsm_profile(in FsmProfile fsm_profile);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ComponentProfile
+ *
+ * @section Description
+ *
+ * ComponentProfile represents the static state of an RTC that is
+ * referred to here as the "target" RTC.
+ *
+ * @endif
+ */
+ struct ComponentProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief instance_name
+ *
+ * @section Description
+ *
+ * This attribute shall contain the name of the target RTC instance.
+ *
+ * @section Semantics
+ *
+ * The instance_name should be unique among RTC instances
+ * contained within the same containing component.
+ *
+ * @endif
+ */
+ string instance_name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief type_name
+ *
+ * @section Description
+ *
+ * This attribute shall contain the name of the target RTC class.
+ *
+ * @section Semantics
+ *
+ * Each RTC class must have a name that is unique within an
+ * application.
+ *
+ * @endif
+ */
+ string type_name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief description
+ *
+ * @section Description
+ *
+ * This attribute shall briefly describe the target RTC for the
+ * benefit of a human operator.
+ *
+ * @endif
+ */
+ string description;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief version
+ *
+ * @section Description
+ *
+ * This attribute shall contain the version number of the target
+ * RTC class.
+ *
+ * @section Semantics
+ *
+ * The format of the version number is outside of the scope of
+ * this specification.
+ *
+ * @endif
+ */
+ string version;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief vendor
+ *
+ * @section Description
+ *
+ * The name of the individual or organization that produced the
+ * target RTC class.
+ *
+ * @endif
+ */
+ string vendor;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief category
+ *
+ * @section Description
+ *
+ * This attribute contains the name of a "category" or group to
+ * which the target RTC belongs.
+ *
+ *
+ * @endif
+ */
+ string category;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief port_profiles
+ *
+ * @section Description
+ *
+ * This attribute contains a list of PortProfiles that describe
+ * the ports of the target RTC.
+ *
+ * @section Semantics
+ *
+ * There shall be a one-to-one correspondence between the members
+ * of this list and the ports of the target RTC.
+ *
+ *
+ * @endif
+ */
+ PortProfileList port_profiles;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief parent
+ *
+ * @section Description
+ *
+ * This attribute contains a reference to the RTC that contains
+ * the target RTC instance. If the target RTC instance is not
+ * owned by any other RTC, this field stores a nil reference.
+ *
+ * @endif
+ */
+ RTObject parent;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief properties
+ *
+ * @section Description
+ *
+ * This attribute contains additional properties of the target RTC.
+ *
+ * @section Semantics
+ *
+ * This attribute provides implementations the opportunity to
+ * describe additional characteristics of a particular RTC that
+ * are otherwise outside of the scope of this specification.
+ *
+ * @endif
+ */
+ NVList properties;
+ };
+
+ typedef sequence<ComponentProfile> ComponentProfileList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief PortService
+ *
+ * @section Description
+ *
+ * An instance of the PortService interface represents a port (i.e.,
+ * UML::Composite Structures::Ports::Port) of an RTC. It provides
+ * operations that allow it to be connected to and disconnected from
+ * other ports.
+ *
+ * @section Semantics
+ *
+ * A port service can support unidirectional or bidirectional
+ * communication. A port service may allow for a service-oriented
+ * connection, in which other connected ports, invoke methods on
+ * it. It may also allow for a data-centric connection, in which
+ * data values are streamed in or out. In either case, the
+ * connection is described by an instance of
+ * ConnectorProfile. However, the behavioral contracts of such
+ * connections are dependent on the interfaces exposed by the ports
+ * and are not described normatively by this specification.
+ *
+ * @endif
+ */
+ interface PortService
+ : SDOPackage::SDOService
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_port_profile
+ *
+ * @section Description
+ *
+ * This operation returns the PortProfile of the PortService.
+ *
+ * @endif
+ */
+ PortProfile get_port_profile();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_connector_profiles
+ *
+ * @section Description
+ *
+ * This operation returns a list of the ConnectorProfiles of the
+ * PortService.
+ *
+ * @endif
+ */
+ ConnectorProfileList get_connector_profiles();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_connector_profiles
+ *
+ * @section Description
+ *
+ * This operation returns a list of the ConnectorProfiles of the
+ * PortService.
+ *
+ * @endif
+ */
+ ConnectorProfile get_connector_profile(in UniqueIdentifier connector_id);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief connect
+ *
+ * @section Description
+ *
+ * This operation establishes connection between this port and the
+ * peer ports according to given ConnectionProfile.
+ *
+ * @section Semantics
+ *
+ * A ConnectorProfile has a sequence of port references. This port
+ * invokes the notify_connect operation of one of the ports
+ * included in the sequence. It follows that the notification of
+ * connection is propagated by the notify_connect operation with
+ * ConnectorProfile. This operation returns ConnectorProfile
+ * return value and returns ReturnCode_t as return codes.
+ *
+ * @endif
+ */
+ ReturnCode_t connect(inout ConnectorProfile connector_profile);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief disconnect
+ *
+ * @section Description
+ *
+ * This operation destroys the connection between this port and
+ * its peer ports using the ID that was given when the connection
+ * was established.
+ *
+ * @section Semantics
+ *
+ * This port invokes the notify_disconnect operation of one of the
+ * ports included in the sequence of the ConnectorProfile stored
+ * when the connection was established. The notification of
+ * disconnection is propagated by the notify_disconnect operation.
+ *
+ * @endif
+ */
+ ReturnCode_t disconnect(in UniqueIdentifier connector_id);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief disconnect_all
+ *
+ * @section Description
+ *
+ * This operation destroys all connection channels owned by the
+ * PortService.
+ *
+ * @endif
+ */
+ ReturnCode_t disconnect_all();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief notify_connect
+ *
+ * @section Description
+ *
+ * This operation notifies this PortService of the connection
+ * between its corresponding port and the other ports and
+ * propagates the given ConnectionProfile.
+ *
+ * @section Semantics
+ *
+ * A ConnectorProfile has a sequence of port references. This
+ * PortService stores the ConnectorProfile and invokes the
+ * notify_connect operation of the next PortService in the
+ * sequence. As ports are added to the connector, PortService
+ * references are added to the ConnectorProfile and provided to
+ * the caller. In this way, notification of connection is
+ * propagated with the ConnectorProfile.
+ *
+ * @endif
+ */
+ ReturnCode_t notify_connect(inout ConnectorProfile connector_profile);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief notify_disconnect
+ *
+ * @section Description
+ *
+ * This operation notifies a PortService of a disconnection
+ * between its corresponding port and the other ports. The
+ * disconnected connector is identified by the given ID, which was
+ * given when the connection was established.
+ *
+ * @section Semantics
+ *
+ * This port invokes the notify_disconnect operation of the next
+ * PortService in the sequence of the ConnectorProfile that was
+ * stored when the connection was established. As ports are
+ * disconnected, PortService references are removed from the
+ * ConnectorProfile. In this way, the notification of
+ * disconnection is propagated by the notify_disconnect operation.
+ *
+ * @endif
+ */
+ ReturnCode_t notify_disconnect(in UniqueIdentifier connector_id);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ExecutionContextService
+ *
+ * @section Description
+ *
+ * An ExecutionContextService exposes an ExecutionContext as an SDO
+ * service such that the context may be controlled remotely.
+ *
+ * @section Semantics
+ *
+ * Depending on the implementation, this interface may itself be an
+ * execution context (that is, it may be passed to the operations of
+ * ComponentAction) or it may represent a remote execution context
+ * that is not of type ExecutionContextService. @endif
+ */
+ interface ExecutionContextService
+ : ExecutionContext, SDOPackage::SDOService
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_profile
+ *
+ * @section Description
+ *
+ * This operation provides a profile "descriptor" for the
+ * execution context.
+ *
+ * @endif
+ */
+ ExecutionContextProfile get_profile();
+ };
+
+ typedef sequence<ExecutionContextService>
+ ExecutionContextServiceList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief RTObject
+ *
+ * @section Description
+ *
+ * The RTObject interface defines the operations that all SDO-based
+ * RTCs must provide. It is required by the rtComponent stereotype.
+ *
+ * @endif
+ */
+ interface RTObject
+ : LightweightRTObject, SDOPackage::SDO
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_component_profile
+ *
+ * @section Description
+ *
+ * This operation returns the ComponentProfile of the RTC.
+ *
+ * @endif
+ */
+ ComponentProfile get_component_profile();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_ports
+ *
+ * @section Description
+ *
+ * This operation returns a list of the RTCs ports.
+ *
+ * @endif
+ */
+ PortServiceList get_ports();
+ };
+};
+
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/SDOPackage.idl
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/SDOPackage.idl (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/SDOPackage.idl 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,294 @@
+//Platform Independent Model (PIM) and Platform Specific Model (PSM)
+//for Super Distributed Objects (SDO) Specification, v1.1 - OMG IDL Summary File
+//Object Management Group, Inc.
+//Copyright (c) 2003, Fraunhofer FOKUS
+//Copyright (c) 2003, Hitachi, Ltd.
+//The companies listed above have granted to the Object Management Group, Inc.
+//(OMG) a nonexclusive, royalty-free, paid up, worldwide license to copy and
+//distribute this document and to modify this document and distribute copies of
+//the modified version. Each of the copyright holders listed above has agreed
+//that no person shall be deemed to have infringed the copyright in the included
+//material of any such copyright holder by reason of having used the
+//specification set forth herein or having conformed any computer software to
+//the specification.
+//
+//This file contains OMG IDL from the Naming Service Specification, v1.2.
+//OMG regularly publishes a summary file that contains all the "code" parts of
+//an OMG formal document. Every formal document line that is IDL, PIDL, or
+//language code is included in the summary file. The reason for such a listing
+//is to give readers an electronic version of the "code" so that they can
+//extract pieces of it. Readers might want to test an example, include it in
+//their own code, or use it for documentation purposes. Having the code lines
+//available electronically means there is less likelihood of a transcription
+//error.
+//
+// ver 1.0 formal/2004-11-02
+// ver 1.1 (RTF report: dtc/2008-03-05)
+//
+//SDOPackage.idl
+
+#ifndef _SDO_PACKAGE_IDL_
+#define _SDO_PACKAGE_IDL_
+
+#ifdef TAO_IDL
+#include <orb.idl>
+#endif
+#ifdef USE_MONITORING
+#include <CosNotifyComm.idl>
+#endif
+#ifndef ORBIT2_IDL
+#define TypeCode CORBA::TypeCode
+#endif
+/** CORBA specific model for SDOs */
+
+#pragma prefix "org.omg"
+#define exception_body { string description; }
+
+module SDOPackage
+{
+ interface SDO;
+ interface SDOService;
+ interface SDOSystemElement;
+ interface Configuration;
+ interface Monitoring;
+ interface Organization;
+
+ /** ------- Data Types -------*/
+ typedef sequence<string> StringList;
+ typedef sequence<SDO> SDOList;
+ typedef sequence<Organization> OrganizationList;
+ typedef string UniqueIdentifier;
+
+ struct NameValue
+ {
+ string name;
+ any value;
+ };
+
+ typedef sequence<NameValue> NVList;
+
+ enum NumericType
+ {
+ SHORT_TYPE,
+ LONG_TYPE,
+ FLOAT_TYPE,
+ DOUBLE_TYPE
+ };
+
+ union Numeric switch (NumericType)
+ {
+ case SHORT_TYPE: short short_value;
+ case LONG_TYPE: long long_value;
+ case FLOAT_TYPE: float float_value;
+ case DOUBLE_TYPE: double double_value;
+ };
+
+ struct EnumerationType
+ {
+ StringList enumerated_values;
+ };
+
+ struct RangeType
+ {
+ Numeric min;
+ Numeric max;
+ boolean min_inclusive;
+ boolean max_inclusive;
+ };
+
+ struct IntervalType
+ {
+ Numeric min;
+ Numeric max;
+ boolean min_inclusive;
+ boolean max_inclusive;
+ Numeric step;
+ };
+
+ enum ComplexDataType
+ {
+ ENUMERATION, RANGE, INTERVAL
+ };
+
+ union AllowedValues switch (ComplexDataType)
+ {
+ case ENUMERATION: EnumerationType allowed_enum;
+ case INTERVAL: IntervalType allowed_interval;
+ case RANGE: RangeType allowed_range;
+ };
+
+ struct Parameter
+ {
+ string name;
+ TypeCode type;
+ AllowedValues allowed_values;
+ };
+
+ typedef sequence<Parameter> ParameterList;
+ struct OrganizationProperty
+ {
+ NVList properties;
+ };
+ enum DependencyType
+ {
+ OWN,
+ OWNED,
+ NO_DEPENDENCY
+ };
+
+ struct DeviceProfile
+ {
+ string device_type;
+ string manufacturer;
+ string model;
+ string version;
+ NVList properties;
+ };
+
+ struct ServiceProfile
+ {
+ string id;
+ string interface_type;
+ NVList properties;
+ SDOService service;
+ };
+
+ typedef sequence <ServiceProfile> ServiceProfileList;
+ struct ConfigurationSet
+ {
+ string id;
+ string description;
+ NVList configuration_data;
+ };
+
+ typedef sequence<ConfigurationSet> ConfigurationSetList;
+
+
+ /** ------- Exceptions -------*/
+ exception NotAvailable exception_body;
+ exception InterfaceNotImplemented exception_body;
+ exception InvalidParameter exception_body;
+ exception InternalError exception_body;
+
+ /** ------- Interfaces -------*/
+ interface SDOSystemElement
+ {
+ OrganizationList get_owned_organizations()
+ raises (NotAvailable,InternalError);
+ };
+ interface SDO : SDOSystemElement
+ {
+ UniqueIdentifier get_sdo_id()
+ raises (NotAvailable, InternalError);
+ string get_sdo_type()
+ raises (NotAvailable, InternalError);
+ DeviceProfile get_device_profile ()
+ raises (NotAvailable, InternalError);
+ ServiceProfileList get_service_profiles ()
+ raises (NotAvailable, InternalError);
+ ServiceProfile get_service_profile (in UniqueIdentifier id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ SDOService get_sdo_service (in UniqueIdentifier id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ Configuration get_configuration ()
+ raises (InterfaceNotImplemented, NotAvailable, InternalError);
+ Monitoring get_monitoring ()
+ raises (InterfaceNotImplemented, NotAvailable, InternalError);
+ OrganizationList get_organizations ()
+ raises (NotAvailable, InternalError);
+ NVList get_status_list ()
+ raises (NotAvailable, InternalError);
+ any get_status (in string nme)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ };
+
+
+ interface Configuration
+ {
+ boolean set_device_profile (in DeviceProfile dProfile)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean add_service_profile (in ServiceProfile sProfile)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean add_organization (in Organization organization_object)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean remove_service_profile (in UniqueIdentifier id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean remove_organization (in UniqueIdentifier organization_id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ ParameterList get_configuration_parameters ()
+ raises (NotAvailable, InternalError);
+ NVList get_configuration_parameter_values ()
+ raises (NotAvailable, InternalError);
+ any get_configuration_parameter_value (in string name)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean set_configuration_parameter (in string name,
+ in any value)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ ConfigurationSetList get_configuration_sets ()
+ raises (NotAvailable, InternalError);
+ ConfigurationSet get_configuration_set (in UniqueIdentifier config_id)
+ raises (NotAvailable, InternalError);
+ boolean set_configuration_set_values (in ConfigurationSet configuration_set)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ ConfigurationSet get_active_configuration_set ()
+ raises (NotAvailable, InternalError);
+ boolean add_configuration_set (in ConfigurationSet configuration_set)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean remove_configuration_set (in UniqueIdentifier config_id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean activate_configuration_set (in UniqueIdentifier config_id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ };
+
+
+#ifdef USE_MONITORING
+ interface Monitoring : CosNotifyComm::StructuredPushConsumer,
+ CosNotifyComm::StructuredPushSupplier
+ {
+ any get_monitoring_parameter_value (in string name)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ ParameterList get_monitoring_parameters ()
+ raises (NotAvailable, InternalError);
+ NVList get_monitoring_parameter_values ()
+ raises (NotAvailable, InternalError);
+ };
+#else
+ interface Monitoring {};
+#endif
+
+ interface SDOService {};
+
+ interface Organization
+ {
+ UniqueIdentifier get_organization_id ()
+ raises (InvalidParameter, NotAvailable, InternalError);
+ OrganizationProperty get_organization_property ()
+ raises (NotAvailable, InternalError);
+ any get_organization_property_value (in string name)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean add_organization_property (in OrganizationProperty organization_property)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean set_organization_property_value (in string name,
+ in any value)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean remove_organization_property ( in string name )
+ raises (InvalidParameter, NotAvailable, InternalError);
+ SDOSystemElement get_owner ()
+ raises (NotAvailable, InternalError);
+ boolean set_owner (in SDOSystemElement sdo)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ SDOList get_members ()
+ raises (NotAvailable, InternalError);
+ boolean set_members (in SDOList sdos)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean add_members ( in SDOList sdo_list)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean remove_member (in UniqueIdentifier id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ DependencyType get_dependency()
+ raises (NotAvailable, InternalError);
+ boolean set_dependency (in DependencyType dependency)
+ raises (NotAvailable, InternalError);
+ };
+};
+#endif //_SDO_PACKAGE_IDL_
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/doxygen_idlref.conf
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/doxygen_idlref.conf (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/doxygen_idlref.conf 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,1122 @@
+# Doxyfile 1.3.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = EUC-JP
+INPUT_ENCODING = EUC-JP
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = ComponentObserver
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 1.0.0
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = doc
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch,
+# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en
+# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese,
+# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = Japanese
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is used
+# as the annotated text. Otherwise, the brief description is used as-is. If left
+# blank, the following values are used ("$name" is automatically replaced with the
+# name of the entity): "The $name class" "The $name widget" "The $name file"
+# "is" "provides" "specifies" "contains" "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
+# members of a class in the documentation of that class as if those members were
+# ordinary class members. Constructors, destructors and assignment operators of
+# the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. It is allowed to use relative paths in the argument list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES = "english=@if en" \
+ end_eng=@endif \
+ "japanese=@if ja" \
+ end_ja=@endif
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources
+# only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS = jp
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = ./
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
+# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc
+
+FILE_PATTERNS = ComponentObserver.idl
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
+# that are symbolic links (a Unix filesystem feature) are excluded from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+
+INPUT_FILTER =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = platex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = platex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse the
+# parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or
+# super classes. Setting the tag to NO turns the diagrams off. Note that this
+# option is superseded by the HAVE_DOT option below. This is only a fallback. It is
+# recommended to install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found on the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes that
+# lay further from the root node will be omitted. Note that setting this option to
+# 1 or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that a graph may be further truncated if the graph's image dimensions are
+# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT).
+# If 0 is used for the depth value (the default), the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/BasicDataType.idl
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/BasicDataType.idl (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/BasicDataType.idl 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,189 @@
+// -*- IDL -*-
+/*!
+ * @file DataType.idl
+ * @brief Basic Data Type definition
+ * @date $Date: 2007-01-09 15:36:29 $
+ * @author Noriaki Ando <n-ando at aist.go.jp>
+ *
+ * Copyright (C) 2003-2006
+ * Task-intelligence Research Group,
+ * Intelligent Systems Research Institute,
+ * National Institute of
+ * Advanced Industrial Science and Technology (AIST), Japan
+ * All rights reserved.
+ *
+ * $Id: BasicDataType.idl 1580 2009-12-07 08:54:10Z kurihara $
+ *
+ */
+
+#ifndef BasicDataType_idl
+#define BasicDataType_idl
+
+module RTC {
+ //------------------------------------------------------------
+ // Basic data type definition
+ //------------------------------------------------------------
+ struct Time
+ {
+ unsigned long sec; // sec
+ unsigned long nsec; // nano sec
+ };
+
+ struct TimedState
+ {
+ Time tm;
+ short data;
+ };
+
+ struct TimedShort
+ {
+ Time tm;
+ short data;
+ };
+
+ struct TimedLong
+ {
+ Time tm;
+ long data;
+ };
+
+ struct TimedUShort
+ {
+ Time tm;
+ unsigned short data;
+ };
+
+ struct TimedULong
+ {
+ Time tm;
+ unsigned long data;
+ };
+
+ struct TimedFloat
+ {
+ Time tm;
+ float data;
+ };
+
+ struct TimedDouble
+ {
+ Time tm;
+ double data;
+ };
+
+ struct TimedChar
+ {
+ Time tm;
+ char data;
+ };
+
+ struct TimedWChar
+ {
+ Time tm;
+ wchar data;
+ };
+
+ struct TimedBoolean
+ {
+ Time tm;
+ boolean data;
+ };
+
+ struct TimedOctet
+ {
+ Time tm;
+ octet data;
+ };
+
+ struct TimedString
+ {
+ Time tm;
+ string data;
+ };
+
+
+ struct TimedWString
+ {
+ Time tm;
+ wstring data;
+ };
+
+
+ /*!
+ * Sequence data type
+ */
+ struct TimedShortSeq
+ {
+ Time tm;
+ sequence<short> data;
+ };
+
+ struct TimedLongSeq
+ {
+ Time tm;
+ sequence<long> data;
+ };
+
+ struct TimedUShortSeq
+ {
+ Time tm;
+ sequence<unsigned short> data;
+ };
+
+ struct TimedULongSeq
+ {
+ Time tm;
+ sequence<unsigned long> data;
+ };
+
+ struct TimedFloatSeq
+ {
+ Time tm;
+ sequence<float> data;
+ };
+
+ struct TimedDoubleSeq
+ {
+ Time tm;
+ sequence<double> data;
+ };
+
+ struct TimedCharSeq
+ {
+ Time tm;
+ sequence<char> data;
+ };
+
+ struct TimedWCharSeq
+ {
+ Time tm;
+ sequence<wchar> data;
+ };
+
+ struct TimedBooleanSeq
+ {
+ Time tm;
+ sequence<boolean> data;
+ };
+
+ struct TimedOctetSeq
+ {
+ Time tm;
+ sequence<octet> data;
+ };
+
+ struct TimedStringSeq
+ {
+ Time tm;
+ sequence<string> data;
+ };
+
+ struct TimedWStringSeq
+ {
+ Time tm;
+ sequence<wstring> data;
+ };
+
+};
+
+#endif // end of BasicDataType_idl
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/ComponentObserver.idl
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/ComponentObserver.idl (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/ComponentObserver.idl 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,512 @@
+// -*- IDL -*-
+/*!
+ * @file ComponentObserver.idl
+ * @brief Component observer SDO service
+ * @date $Date$
+ * @author Noriaki Ando <n-ando at aist.go.jp>
+ *
+ * Copyright (C) 2011
+ * Noriaki Ando
+ * Intelligent Systems Research Institute,
+ * National Institute of
+ * Advanced Industrial Science and Technology (AIST), Japan
+ * All rights reserved.
+ *
+ * $Id$
+ *
+ */
+
+#include <SDOPackage.idl>
+#include <RTC.idl>
+
+/*!
+ * @if jp
+ * @brief コンポーネント状態オブザーバインターフェース
+ *
+ * コンポーネントの状態を監視するためのオブザーバインターフェース。オブ
+ * ザーバパターンに従い、外部ツールがコンポーネントにオブザーバオブジェ
+ * クトをセットし、コンポーネントは各種内部状態変更時にをオブザーバオブ
+ * ジェクトをコールし、オブザーバに対して変更を通知する。
+ *
+ * @since 1.1
+ *
+ * @else
+ * @brief Component state observer interface
+ *
+ * This interface defines observer interface for component states.
+ * According to the observer pattern, tools which want to observe
+ * component state set observer objects to the RT-Component, and weh
+ * RT-Component changes its status, the observer object is called and
+ * notice the changes to tools.
+ *
+ *
+ * @since 1.1
+ * @endif
+ */
+module OpenRTM
+{
+ /*!
+ * @if jp
+ *
+ * @brief 更新された状態の種類
+ *
+ * ターゲットRTCで更新された状態の種類を分類する列挙型。
+ *
+ * @else
+ *
+ * @brief A kind of updated status
+ *
+ * This is a enumeration type to classify updated status in target RTC.
+ *
+ * @endif
+ */
+ enum StatusKind
+ {
+ /*!
+ * @if jp
+ *
+ * @brief コンポーネントプロファイル
+ *
+ * コンポーネントプロファイル RTC::ComponentProfile が更新されたこ
+ * とを示す列挙型。
+ *
+ * RTC::ComponentProfile のメンバーのうち、instance_name,
+ * type_name, description, version, vendor, category はRTC動作中に
+ * 変更されることはない。これらが変更された場合には、
+ * ComponentObserver::updatestatus() の hint には、それぞれのメンバー
+ * 名が文字列で指定される。また、parent に対する変更は通知されない。
+ * さらに、properties に対する変更は、hint に "<key0>, <key1>,
+ * ..." の形で通知される。
+ *
+ * port_profiles に対する変更は、後述の PORT_PROFILE によって通知さ
+ * れるため、COMPONENT_PROFILE では通知されない。
+ *
+ * @else
+ *
+ * @brief Component profile
+ *
+ * This is enumeration member to specify that the target
+ * component's RTC::componentProfile has been changed.
+ *
+ * In the member of RTC::ComponentProfile, instance_name,
+ * type_name, description, version, vendor, category are not
+ * modified during RTC running. If these members are changed, each
+ * member's name is specified in the
+ * ComponentObserver::updateStatus() 's hint argument. And,
+ * modification to parent is not notified. In the properties, the
+ * modification is notified as "<key0>, <key1>, ..." in the hint
+ * argument.
+ *
+ * The modification to port_profiles is not notified as
+ * COMPONENT_PROFILE becauase it is notified as PORT_PROFILE.
+ *
+ * @endif
+ */
+ COMPONENT_PROFILE,
+ /*!
+ * @if jp
+ *
+ * @brief コンポーネントの状態
+ *
+ * コンポーネントの状態が変化したことを示す列挙子。
+ *
+ * RTCにはECの状態として、INACTIVE_STATE, ACTIVE_STATE,
+ * ERROR_STATE があるが、この状態が変化したことを通知するための列挙
+ * 子。
+ *
+ * ComponentObserver::updatestatus() の hint には、状態と、どの実行
+ * コンテキストで変化があったかを知らせる以下の文字列が hint に引数
+ * として与えられる。
+ *
+ * hint: (INACTIVE, ACTIVE, ERROR):<Execution Context ID>
+ * 例:
+ * ACTIVE:0 (デフォルトコンテキストでRTCがアクティブになった)
+ * ERROR:1002 (実行コンテキスト1002でRTCがエラーになった)
+ *
+ * @else
+ *
+ * @brief Component status
+ *
+ * This is INACTIVE_STATE, ACTIVE_STATE,
+ * ERROR_STATE status, and this enumerator specify a status of RTC changed.
+ *
+ * A status and ExecutionContext's id is specified in the argument of
+ * ComponentObserver::updateStatus() 's hint.
+ *
+ * hint: (INACTIVE, ACTIVE, ERROR):<Execution Context ID>
+ * Example:
+ * ACTIVE:0 (RTC is activated in the default ExecuionContext)
+ * ERROR:1002 (RTC go to ERROR state in the EC of id 1002)
+ *
+ * @endif
+ */
+ RTC_STATUS,
+ /*!
+ * @if jp
+ *
+ * @brief ExecutionContextの状態
+ *
+ * ExecutionContextの状態が変化したことを示す列挙子。
+ *
+ * RTCにECが attach/detach/rate_change/startup/shutdown されたことを
+ * 示す列挙子。
+ *
+ * ComponentObserver::updatestatus() の hint には、
+ * attach/detach/rate_change/startup/shutdow のいずれが行われたかと、
+ * 対象となるECのidが与えられる。
+ *
+ * hint: (ATTACHED, DETACHED, RATE_CHANGED, STARTUP,
+ * SHUTDOWN):<Execution Context ID>
+ *
+ * 例:
+ * ATTACHED:1002 (ECがアタッチされ、そのIDは1002)
+ *
+ * @else
+ *
+ * @brief The stauts of ExecutionContext
+ *
+ * This is enumerator notifies that ExecutionContext is
+ * attach/detach/rate_change/startup/shutdown. Attach or detach
+ * operation and target ExecutionContext's id is given in the
+ * argument of ComponentObserver::updateStatus() 's hint.
+ *
+ * hint: (ATTACHED, DETACHED, RATE_CHANGED, STARTUP,
+ * SHUTDOWN):<Execution Context ID>
+ *
+ * Example:
+ * ATTACHED:1002 (EC is attached and its ID is 1002)
+ *
+ * @endif
+ */
+ EC_STATUS,
+ /*!
+ * @if jp
+ *
+ * @brief Portの状態
+ *
+ * Portの状態が変化したことを示す列挙子。Portの追加、削除、接続、切
+ * 断が行われたことを示す。ComponentObserver::updatestatus() の
+ * hint には、いずれかのアクションが行われたかと、対象となるポート
+ * の名前が与えられる。
+ *
+ * hint: (ADD, REMOVE, CONNECT, DISCONNECT):<port name>
+ * 例:
+ * CONNECT:velocity (velocity ポートで接続が確立された)
+ *
+ * @else
+ *
+ * @brief The stauts of ports
+ *
+ * This is enumerator which notifies that port is added, removed,
+ * connected and/or disconnected. Which action is performed and
+ * target port's name is given to the hint argument in
+ * ComponentObserver::updateStatus() operation.
+ *
+ * hint: (ADD, REMOVE, CONNECT, DISCONNECT):<port name>
+ * Example:
+ * CONNECT:velocity (A connection established in the velocity port)
+ *
+ * @endif
+ */
+ PORT_PROFILE,
+ /*!
+ * @if jp
+ *
+ * @brief Configurationの状態
+ *
+ * Configurationの状態が変化したことを示す列挙子。Configurationに対
+ * して、コンフィギュレーションパラメータが更新された
+ * (UPDATE_CONFIG_PARAM)、コンフィギュレーションがセット(更新)さ
+ * れた (SET_CONFIG_SET)、コンフィギュレーションセットが追加された
+ * (ADD_CONFIG_SET)、コンフィギュレーションが更新された
+ * (UPDATE_CONFIG_SET)、コンフィギュレーションセットが削除された
+ * (REMOVE_CONFIG_SET)、コンフィギュレーションセットがアクティブに
+ * された (ACTIVATE_CONFIG_SET) といったアクションがあったことが通
+ * 知される。
+ *
+ * - UPDATE_CONFIG_PARAM: <config set name>.<config param name>
+ * - SDOPackage::Configuration::set_configuration_parameter
+ * - SET_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::set_configuration_set_values
+ * - ADD_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::add_configuration_set
+ * - UPDATE_CONFIG_SET: <config set name>
+ * - 内部のコンフィグセットを実際の変数に反映する
+ * - REMOVE_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::remove_configuration_set
+ * - ACTIVATE_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::activate_configuration_set
+ *
+ * @else
+ *
+ * @brief The stauts of ports
+ *
+ * This is enumerator which notifies that configuration is
+ * changed. To the configuration, a configuration parameter has
+ * been updated (UPDATE_CONFIG_PARAM), a configuration-set is set
+ * (SET_CONFIG_SET), a configuration set has been updated
+ * (UPDATE_CONFIG_SET), a configuration set has been added
+ * (ADD_CONFIG_SET) or removed (REMOVE_CONFIG_SET), the active
+ * configuration set has been changed (ACTIVATE_CONFIG_SET), these
+ * actions would be notified.
+ *
+ * - UPDATE_CONFIG_PARAM: <config set name>.<config param name>
+ * - SDOPackage::Configuration::set_configuration_parameter
+ * - SET_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::set_configuration_set_values
+ * - ADD_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::add_configuration_set
+ * - UPDATE_CONFIG_SET: <config set name>
+ * - Apply configuration-set values into actual variables.
+ * - REMOVE_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::remove_configuration_set
+ * - ACTIVATE_CONFIG_SET: <config set name>
+ * - SDOPackage::Configuration::activate_configuration_set
+ *
+ * @endif
+ */
+ CONFIGURATION,
+ /*!
+ * @if jp
+ *
+ * @brief ハートビートイベント
+ *
+ * 当該RTCが生存していることをオブザーバー側に通知する列挙子。
+ *
+ * ハートビートを利用するかどうか、およびハートビートの周期は、
+ * ServiceProfile::properties の以下のプロパティによって与えられる。
+ *
+ * heartbeat.enable: YES/NO
+ * heartbeat.interval: x [s]
+ *
+ * @else
+ *
+ * @brief The stauts of ports
+ *
+ * This enumerator is heart beat notification.
+ *
+ * Whether if the heart-beat function is used is specified in the
+ * ServiceProfile::properties as the following properties.
+ *
+ * heartbeat.enable: YES/NO
+ * heartbeat.interval: x [s]
+ *
+ * @endif
+ */
+ HEARTBEAT,
+
+ STATUS_KIND_NUM
+ };
+
+ /*!
+ * @if jp
+ *
+ * @interface ComponentObserver
+ *
+ * RTCの各種状態の更新を知らせるためのオブザーバーオブジェクトのため
+ * のインターフェース。SDO Service として、対象となるRTC/SDOに対して
+ * アタッチされ、RTC/SDO内の状態が変更された場合に、変更された状態の
+ * 種類とヒントを同時に通知する。ツールなどで、ポーリングによらずRTC
+ * の状態の変化を知りたい場合などに利用する。
+ *
+ * 想定している利用方法は以下のとおりである。
+ *
+ * -# SDO::get_configuration() により Configuration オブジェクトを取得
+ * -# Configuration::add_service_profile() によりTool側の
+ * ComponentObserver を ServiceProfile により RTC に与える。
+ * ServiceProfile のメンバーは以下のように設定すること
+ * - id: UUID など一意なIDを設定する。削除時にも必要になるので、Tool
+ * 側ではIDを保持しておかなければならない。
+ * - interface_type: 当該サービスのIFRのIDを文字列として指定。RTC側で
+ * はこの文字列により当該サービスオブジェクトを受け入れるか決定す
+ * るため指定は必須となる。
+ * - properties: RTC側のサービスの受け入れ側に通知するプロパティを設
+ * 定する。このサービスでは、下記の heartbeat 関連のプロパティを
+ * 指定する。
+ * - service: SDOService オブジェクトの参照を指定する。
+ * -# RTC側で状態の変化があった場合に update_status() オペレーション
+ * が StatusKind および hint の文字列とともに呼び出される。Tool側
+ * では、StatusKind と hint に基づき RTC のある部分の状態が変化し
+ * たことを知り、必要な処理を行う。
+ * -# 最終的にComponentObserverオブジェクトが不要になった場合には、
+ * Configuration::remove_service_profile() を id とともに呼び出し
+ * RTC から削除する。
+ *
+ * <pre>
+ *
+ * [RTC] [Configuration] [Observer] [Tool]
+ * | | | |
+ * | | get_configuration() | |
+ * |<------------------------------------------------|
+ * | | | |
+ * | | add_service_profile(prof) |
+ * | |<-----------------------------------|
+ * | | | |
+ * | | update_status(kind, hint) |
+ * |----------------------------------->| |
+ * | | update_status(kind, hint) |
+ * |----------------------------------->| |
+ * | | : | |
+ * | | | |
+ * | | remove_service_profile(id) |
+ * | |<-----------------------------------|
+ * | | | |
+ * | | x x
+ *
+ * </pre>
+ *
+ * なお、ServiceProfile::properties に指定するプロパティとしては、
+ *
+ * - observed_status: ALL or kind of status
+ * - heartbeat.enable: YES/NO
+ * - heartbeat.interval: x [s]
+ *
+ * がある。
+ *
+ * - observed_staus: ALL または状態の種類をカンマ区切りで指定
+ * 監視する状態を指定する。指定可能な状態を表す文字列は、
+ * COMPONENT_PROFILE, RTC_STATUS, EC_STATUS, PORT_PROFILE,
+ * CONFIGURATION 5種類である。監視したい対象をカンマで区切り複数指
+ * 定することができる。また、すべての状態を監視する場合、ALL を指定
+ * することができる。指定文字列は大文字、小文字を問わない。
+ *
+ * - heartbeat.interval: 秒単位で数値で指定
+ * ハートビートを送信する周期を秒単位で指定する。なお、指定した秒数
+ * でハートビートが必ず送信される保証はない。したがって、RTCが死ん
+ * だかどうかを確認するには、heartbeat.interval 数回分の時間を待つ
+ * 必要がある。
+ *
+ * - heartbeat.enable: YES または NOで指定
+ * Tool側では、状態に変化があるまで RTC が生存しているかどうか知る
+ * ことはできないため、突然RTCが死んだ場合には、これを知ることがで
+ * きない。そこで、HEART_BEAT イベントを周期的にRTC側から送らせるこ
+ * とができる。ハートビートを有効にするか否かをこのオプションで指定
+ * する。
+ *
+ *
+ * @else
+ *
+ * @interface ComponentObserver
+ *
+ * This is an interface to notify various status changed in RTC to
+ * others. This is attached into a target RTC/SDO as a SDO service,
+ * and if an RTC/SDO's status change, a kind of changed status and
+ * its hints are notified to observers. For example, it can be used
+ * to notify RTC's status changed without polling in certain tools.
+ *
+ * An assumed usage is as follows.
+ *
+ * -# SDO::get_configuration() is called to get a Configuration object
+ *
+ * -# Configuration::add_service_profile() is called by Tool.
+ * A ComponentObserver in a ServiceProfile is given to RTC.
+ * ServiceProfile members should be set as follows.
+ *
+ * - id: UUID and other unique ID should be specified. Since this ID
+ * is used when the service is removed, tools should remember
+ * this ID.
+ *
+ * - interface_type: IFR ID should be specified here. Since the RTC
+ * decides if the given SDO service object can be accepted by
+ * using the interface_type string, this member is mandatory.
+ *
+ * - properties: This member specifies properties to be notified to
+ * RTC side. In this service, the following heartbeat related
+ * properties should be specified.
+ *
+ * - service: SDOService object reference should be specified.
+ *
+ * -# If some changes happen in RTC, the update_status() operation
+ * is called with StatusKind and hint string. RTC's status change
+ * is notified to tool and some processes would be performed by
+ * the tool according to the StatusKind and hint.
+ *
+ * -# Finally, When the ComponentObserver object becomes
+ * unnecessary, Configuration::remove_service_profile() is called
+ * with id and it is removed from RTC.
+ *
+ * <pre>
+ *
+ * [RTC] [Configuration] [Observer] [Tool]
+ * | | | |
+ * | | get_configuration() | |
+ * |<------------------------------------------------|
+ * | | | |
+ * | | add_service_profile(prof) |
+ * | |<-----------------------------------|
+ * | | | |
+ * | | update_status(kind, hint) |
+ * |----------------------------------->| |
+ * | | update_status(kind, hint) |
+ * |----------------------------------->| |
+ * | | : | |
+ * | | | |
+ * | | remove_service_profile(id) |
+ * | |<-----------------------------------|
+ * | | | |
+ * | | x x
+ *
+ * </pre>
+ *
+ * Properties which is specified in ServiceProfile::properties is as follows.
+ *
+ * - observed_status: ALL or kind of status
+ * - heartbeat.enable: YES/NO
+ * - heartbeat.interval: x [s]
+ *
+ *
+ * - observed_staus: ALL or comma separated status kinds This
+ * property specifies kind of status to be observed. Available
+ * kind of statuses are COMPONENT_PROFILE, RTC_STATUS, EC_STATUS,
+ * PORT_PROFILE, CONFIGURATION. You can specify comma-separated
+ * status list to be observed. And if you want to observe all the
+ * status, you just specify ALL instead of all the status kind
+ * list. Uppercase, lowercase and mixture are allowed in the
+ * specified status kind.
+ *
+ * - heartbeat.enable: YES or NO
+ *
+ * Since tools cannot know whether the RTC is alive or not until
+ * status change happens, if the RTC suddenly died, the tools
+ * cannot know it forever. To eliminate this problems, Observer
+ * object can send periodic heartbeat signals to observers. The
+ * heartbeat.enable option specifies whether the functionality is
+ * activated or not.
+ *
+ * - heartbeat.interval: Heartbeat interval should be specified in
+ * seconds. This specification does not guarantee that heartbeat
+ * signals precisely send back to observer. Therefore if you need
+ * to decide whether an RTC died or not, you have to wait for
+ * several heartbeat signals.
+ *
+ * @endif
+ */
+ interface ComponentObserver
+ : SDOPackage::SDOService
+ {
+ /*!
+ * @if jp
+ *
+ * @brief 状態が更新されたことを知らせる
+ *
+ * 状態が更新されたことを知らせるオペレーション。status_kind によっ
+ * て更新された状態の種類、hint によってどのような状態が変更された
+ * かに関するヒントが与えられる。
+ *
+ * @param status_kind: StatusKind 型の状態の種類
+ * @param hint; StatusKind 毎に決まる状態変更に関するヒント
+ *
+ * @else
+ *
+ * @brief Notifies the status updated
+ *
+ * This operation notifies the updated status. The status_kind
+ * notifies kind of updated status, and the hint give some hint
+ * about updated status.
+ *
+ * @endif
+ */
+ oneway void update_status(in StatusKind status_kind, in string hint);
+ };
+
+};
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/DataPort.idl
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/DataPort.idl (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/DataPort.idl 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,48 @@
+// -*- IDL -*-
+/*!
+ * @file DataPort.idl
+ * @brief DataPort interface definition
+ * @date $Date: 2007-01-09 15:40:14 $
+ * @author Noriaki Ando <n-ando at aist.go.jp>
+ *
+ * Copyright (C) 2006
+ * Noriaki Ando
+ * Task-intelligence Research Group,
+ * Intelligent Systems Research Institute,
+ * National Institute of
+ * Advanced Industrial Science and Technology (AIST), Japan
+ *
+ * All rights reserved.
+ *
+ * $Id: DataPort.idl 1597 2009-12-22 02:26:17Z n-ando $
+ *
+ */
+
+#ifndef DataInPort_idl
+#define DataInPort_idl
+
+module OpenRTM
+{
+ enum PortStatus
+ {
+ PORT_OK,
+ PORT_ERROR,
+ BUFFER_FULL,
+ BUFFER_EMPTY,
+ BUFFER_TIMEOUT,
+ UNKNOWN_ERROR
+ };
+
+ typedef sequence<octet> CdrData;
+
+ interface InPortCdr
+ {
+ PortStatus put(in CdrData data);
+ };
+
+ interface OutPortCdr
+ {
+ PortStatus get(out CdrData data);
+ };
+};
+#endif
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/OpenRTM.idl
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/OpenRTM.idl (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/OpenRTM.idl 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,64 @@
+// -*- IDL -*-
+/*!
+ * @file OpenRTM.idl
+ * @brief OpenRTM interface definition
+ * @date $Date: 2007-09-21 09:19:33 $
+ * @author Noriaki Ando <n-ando at aist.go.jp>
+ *
+ * Copyright (C) 2007
+ * Task-intelligence Research Group,
+ * Intelligent Systems Research Institute,
+ * National Institute of
+ * Advanced Industrial Science and Technology (AIST), Japan
+ * All rights reserved.
+ *
+ * $Id: OpenRTM.idl 1338 2009-05-18 05:58:25Z n-ando $
+ *
+ */
+
+#include "RTC.idl"
+
+#pragma prefix "openrtm.aist.go.jp"
+
+module OpenRTM
+{
+
+ interface DataFlowComponent
+ : RTC::RTObject, RTC::DataFlowComponent
+ {
+ };
+
+// interface FiniteStateMachineComponent
+// : RTC::RTObject, RTC::FsmParticipant
+// {
+// };
+//
+// interface DataFlowFiniteStateMachineComponent
+// : RTC::RTObject, RTC::DataFlowComponent, RTC::FsmParticipant
+// {
+// };
+//
+// interface DataFlowMultiModeComponent
+// : RTC::RTObject, RTC::DataFlowComponent, RTC::MultiModeObject
+// {
+// };
+//
+// interface FiniteStateMachineMultiModeComponent
+// : RTC::RTObject, RTC::FsmParticipant, RTC::MultiModeObject
+// {
+// };
+//
+// interface DataFlowFiniteStateMachineMultiModeComponent
+// : RTC::RTObject, RTC::DataFlowComponent,
+// RTC::FsmParticipant, RTC::MultiModeObject
+// {
+// };
+
+
+ interface ExtTrigExecutionContextService
+ : RTC::ExecutionContextService
+ {
+ void tick();
+ };
+
+};
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/RTC.idl
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/RTC.idl (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/RTC.idl 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,2649 @@
+// RTC.idl
+
+#include "SDOPackage.idl"
+
+#pragma prefix "omg.org"
+
+#define EXECUTION_HANDLE_TYPE_NATIVE long
+
+module RTC
+{
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ExecutionContextHandle_t
+ *
+ * @section Description
+ *
+ * This data type represents the association between an RTC and an
+ * ExecutionContext in which it participates.
+ *
+ * @section Semantics
+ *
+ * This is an opaque DataType. It has no attributes or operations.
+ *
+ * @endif
+ */
+ typedef EXECUTION_HANDLE_TYPE_NATIVE ExecutionContextHandle_t;
+
+ typedef SDOPackage::UniqueIdentifier UniqueIdentifier;
+ typedef SDOPackage::NVList NVList;
+
+ /*!
+ * @if jp
+ * @brief ReturnCode_t
+ *
+ * OMG RTC 1.0 仕様中の多くのオペレーションは、クラインとに対して考え
+ * られるエラー状態を報告する必要がある。これは、ReturnCode_t型の所謂
+ * リターンコードにより行われる。
+ *
+ * OMG RTC 1.0 の PIM 内において、ReturnCode_t型の値を返さないオペレーションは
+ * それらの戻り値の型に依存して、次の方法によりエラーを報告するものとする。
+ * -オペレーションが正数値を返す場合 (OMG RTC 1.0 Section 5.2.2.6.4 の
+ * get_rateのように)、負数値を返すことによりエラーを示すものとする。
+ * - オペレーションがオブジェクトリファレンス(RTObject::get_component_profile
+ * OMG RTC 1.0 5.4.2.2.1を参照) を通常返す場合、nil参照を返すことにより
+ * エラーを示すものとする。
+ *
+ * @else
+ * @brief ReturnCode_t
+ *
+ * A number of operations in this specification will need to report
+ * potential error conditions to their clients. This task shall be
+ * accomplished by means of operation "return codes" of type
+ * ReturnCode_t
+ *
+ * Operations in the PIM that do not return a value of type
+ * ReturnCode_t shall report errors in the following ways, depending
+ * on their return type:
+ * - If an operation normally returns a positive numerical value (such as
+ * get_rate, see [OMG RTC 1.0 Section 5.2.2.6.4]), it shall indicate
+ * failure by returning a negative value.
+ * - If an operation normally returns an object reference (such as
+ * RTObject::get_component_profile, see [OMG RTC 1.0 Section 5.4.2.2.1]),
+ * it shall indicate failure by returning a nil reference.
+ *
+ * @param RTC_OK The operation completed successfully.
+ * @param RTC_ERROR The operation failed with a generic, unspecified error.
+ * @param BAD_PARAMETER The operation failed because an illegal argument was
+ * passed to it.
+ * @param UNSUPPORTED The operation is unsupported by the implementation
+ * (e.g., it belongs to a compliance point that is not implemented).
+ * @param OUT_OF_RESOURCES The target of the operation ran out of the
+ * resources needed to complete the operation.
+ * @param PRECONDITION_NOT_MET A pre-condition for the operation was not met.
+ *
+ * @endif
+ */
+ enum ReturnCode_t
+ {
+ RTC_OK,
+ RTC_ERROR,
+ BAD_PARAMETER,
+ UNSUPPORTED,
+ OUT_OF_RESOURCES,
+ PRECONDITION_NOT_MET
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief LifeCycleState
+ *
+ * @section Description
+ * LifeCycleState is an enumeration of the states in the lifecycle above.
+ *
+ * @endif
+ */
+ enum LifeCycleState
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief CREATED
+ *
+ * @section Description
+ *
+ * The RTC object has been instantiated but not yet fully initialized.
+ * @endif
+ */
+ CREATED_STATE,
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief INACTIVE
+ *
+ * @section Description
+ *
+ * The RTC is Alive but is not being invoked in any execution
+ * context (see Section 5.2.2.5), regardless of whether the context
+ * is Running or not.
+ *
+ * @section Semantics
+ *
+ * An instance of this state exists for each execution context in
+ * which the RTC participates. If the RTC does not participate in
+ * any execution context, a single instance of this state exists.
+ *
+ * @endif
+ */
+ INACTIVE_STATE,
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ACTIVE
+ *
+ * @section Description
+ *
+ * The RTC is Alive and will be invoked in the execution context
+ * if the context is Running.
+ *
+ * @section Semantics
+ *
+ * An instance of this state exists for each execution context in
+ * which the RTC participates. If the RTC does not participate in
+ * any execution context, this state shall never be observed.
+ *
+ * @endif
+ */
+ ACTIVE_STATE,
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ERROR
+ *
+ * @section Description
+ *
+ * The RTC has encountered a problem in a given execution context
+ * and cannot continue functioning in that context without being
+ * reset.
+ *
+ * @endif
+ */
+ ERROR_STATE
+ };
+
+ interface ExecutionContext;
+ typedef sequence<ExecutionContext> ExecutionContextList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ComponentAction
+ *
+ * @section Description
+ *
+ * The ComponentAction interface provides callbacks corresponding to
+ * the execution of the lifecycle operations of LightweightRTObject
+ * (see Section 5.2.2.2) and ExecutionContext (see Section
+ * 5.2.2.5). An RTC developer may implement these callback
+ * operations in order to execute application-specific logic
+ * pointing response to those transitions.
+ *
+ * @section Semantics
+ *
+ * Clients of an RTC are not expected to invoke these operations
+ * directly; they are provided for the benefit of the RTC middleware
+ * implementation.
+ *
+ * @endif
+ */
+ interface ComponentAction
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_initialize
+ *
+ * @section Description
+ *
+ * The RTC has been initialized and entered the Alive state.
+ *
+ * @section Semantics
+ *
+ * Any RTC-specific initialization logic should be performed here.
+ *
+ * @endif
+ */
+ ReturnCode_t on_initialize();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_finalize
+ *
+ * @section Description
+ *
+ * The RTC is being destroyed.
+ *
+ * @section Semantics
+ *
+ * Any final RTC-specific tear-down logic should be performed here.
+ *
+ * @endif
+ */
+ ReturnCode_t on_finalize();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_startup
+ *
+ * @section Description
+ *
+ * The given execution context, in which the RTC is participating,
+ * has transitioned from Stopped to Running.
+ *
+ * @endif
+ */
+ ReturnCode_t on_startup(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_shutdown
+ *
+ * @section Description
+ *
+ * The given execution context, in which the RTC is participating,
+ * has transitioned from Running to Stopped.
+ *
+ * @endif
+ */
+ ReturnCode_t on_shutdown(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_activated
+ *
+ * @section Description
+ *
+ * The RTC has been activated in the given execution context.
+ *
+ * @endif
+ */
+ ReturnCode_t on_activated(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_deactivated
+ *
+ * @section Description
+ *
+ * The RTC has been deactivated in the given execution context.
+ *
+ * @endif
+ */
+ ReturnCode_t on_deactivated(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_aborting
+ *
+ * @section Description
+ *
+ * The RTC is transitioning from the Active state to the Error
+ * state in some execution context.
+ *
+ * @section Semantics
+ *
+ * This callback is invoked only a single time for time that the
+ * RTC transitions into the Error state from another state. This
+ * behavior is in contrast to that of on_error.
+ *
+ * @endif
+ */
+ ReturnCode_t on_aborting(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_error
+ *
+ * @section Description
+ *
+ * The RTC remains in the Error state.
+ *
+ * @section Semantics
+ *
+ * If the RTC is in the Error state relative to some execution
+ * context when it would otherwise be invoked from that context
+ * (according to the context’s ExecutionKind), this callback
+ * shall be invoked instead. For example,
+ *
+ * - If the ExecutionKind is PERIODIC, this operation shall be
+ * invoked in sorted order at the rate of the context instead of
+ * DataFlowComponentAction::on_execute and on_state_update.
+ *
+ * - If the ExecutionKind is EVENT_DRIVEN, this operation shall be
+ * invoked whenever FsmParticipantAction::on_action would
+ * otherwise have been invoked.
+ *
+ * @endif
+ */
+ ReturnCode_t on_error(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_reset
+ *
+ * @section Description
+ *
+ * The RTC is in the Error state. An attempt is being made to
+ * recover it such that it can return to the Inactive state.
+ *
+ * @section Semantics
+ *
+ * If the RTC was successfully recovered and can safely return to
+ * the Inactive state, this method shall complete with
+ * ReturnCode_t::OK. Any other result shall indicate that the RTC
+ * should remain in the Error state.
+ *
+ * @endif
+ */
+ ReturnCode_t on_reset(in ExecutionContextHandle_t exec_handle);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief LightweightRTObject
+ *
+ * @section Description
+ *
+ * This interface is realized by all lightweight RTCs (as required
+ * by the lightweightRTComponent stereotype). It defines the states
+ * and transitions through which all RTCs will pass from the time
+ * they are created until the time they are destroyed.
+ *
+ * @section Semantics
+ * @subsection Initialization
+ *
+ * An RTC begins in the Created state; at this point, it has been
+ * instantiated but not yet fully initialized. Note that this state
+ * is highly implementation-dependent. For example, it may
+ * correspond to the invocation of a constructor in languages that
+ * support that concept, but not all languages do. Furthermore, how
+ * soon this state is entered before initialize is invoked is
+ * implementation-dependent. Therefore, it should be relied on by
+ * RTC implementers only to the minimum extent possible. An RTC
+ * that has completed its initialization and has not been finalized
+ * is said to be Alive.
+ *
+ * @subsection Execution Context
+ *
+ * An RTC in the Alive state may participate in any number of
+ * execution contexts (see Section 5.2.2.5 ). These contexts shall
+ * be represented to an RTC as distinct instances of the
+ * ExecutionContext class. The ExecutionContext manages the behavior
+ * of each RTC that participates in it. This relationship is defined
+ * by the following state machine, which is embedded within the
+ * ExecutionContext's own lifecycle (see Figure 5.5 ). Each
+ * participating RTC is represented as a separate parallel region.
+ *
+ * Relative to a given execution context, an RTC may either be
+ * Active, Inactive, or in Error. When the RTC is Active in a
+ * Running execution context, the ComponentAction callbacks (see
+ * Section 5.2.2.4) shall be invoked as appropriate for the context’
+ * s ExecutionKind. The callbacks shall not be invoked relative to
+ * that context when either the RTC is Inactive in that context or
+ * the context is Stopped. (Note that starting and stopping an
+ * execution context shall not impact whether its participating RTCs
+ * are Active or Inactive.) It may be that a given RTC does not
+ * directly participate in any execution contexts. Such an RTC is
+ * referred to as passive. A passive RTC may provide services to
+ * other components upon request. At any other time, it shall not be
+ * required to perform any ongoing activity of its own; therefore,
+ * instances of such an RTC typically exist only as parts (directly
+ * or indirectly) of a containing active RTC.
+ *
+ * @subsection Error Handling
+ *
+ * If an operation fails while the RTC is Active in a given
+ * execution context, the RTC will transition to the Error state
+ * corresponding to that context. While the RTC is in Error, the
+ * ComponentAction::on_error callback will be invoked in place of
+ * those callbacks that would otherwise have been invoked according
+ * to the context’s ExecutionKind. For example, if the kind is
+ * PERIODIC, on_error shall be invoked instead of the pair of
+ * on_execute, and on_state_update. When an RTC is in Error, it may
+ * be reset. If resetting is successful, the RTC shall return to the
+ * Inactive state. If resetting is unsuccessful, it shall remain in
+ * the Error state.
+ *
+ * @endif
+ */
+ interface LightweightRTObject
+ : ComponentAction
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief initialize
+ *
+ * @section Description
+ * Initialize the RTC that realizes this interface.
+ *
+ * @section Semantics
+ * The invocation of this operation shall result in the invocation
+ * of the callback ComponentAction::on_initialize.
+ *
+ * @section Constraints
+ *
+ * - An RTC may be initialized only while it is in the Created
+ * state. Any attempt to invoke this operation while in another
+ * state shall fail with ReturnCode_t::PRECONDITION_NOT_MET.
+ * - Application developers are not expected to call this operation
+ * directly; it exists for use by the RTC infrastructure.
+ *
+ * @endif
+ */
+ ReturnCode_t initialize();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief finalize
+ *
+ * @section Description
+ *
+ * Finalize the RTC that realizes this interface, preparing it for
+ * destruction.
+ *
+ * @section Semantics
+ *
+ * This invocation of this operation shall result in the
+ * invocation of the callback ComponentAction::on_finalize
+ *
+ * @section Constraints
+ *
+ * - An RTC may not be finalized while it is participating in any
+ * execution context. It must first be removed with
+ * ExecutionContextOperations::remove_component. Otherwise, this
+ * operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET. See Figure 5.9.
+ *
+ * - An RTC may not be finalized while it is in the Created state. Any
+ * attempt to invoke this operation while in that state shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * - Application developers are not expected to call this operation
+ * directly; it exists for use by the RTC infrastructure.
+ *
+ * @endif
+ */
+ ReturnCode_t finalize();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief is_alive
+ *
+ * @section Description
+ *
+ * A component is alive or not regardless of the execution context
+ * from which it is observed. However, whether or not it is
+ * Active, Inactive, or in Error is dependent on the execution
+ * context(s) (see Figure 5.7) in which it is running. That is, it
+ * may be Active in one context but Inactive in
+ * another. Therefore, this operation shall report whether this
+ * RTC is either Active, Inactive, or in Error; which of those
+ * states a component is in with respect to a particular context
+ * may be queried from the context itself.
+ *
+ * @endif
+ *
+ */
+ boolean is_alive(in ExecutionContext exec_context);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief exit
+ *
+ * @section Description
+ *
+ * Stop the RTC’s execution context(s) and finalize it along with
+ * its contents.
+ *
+ * @section Semantics
+ *
+ * Any execution contexts for which the RTC is the owner shall be
+ * stopped. If the RTC participates in any execution contexts
+ * belonging to another RTC that contains it, directly or
+ * indirectly (i.e., the containing RTC is the owner of the
+ * ExecutionContext), it shall be deactivated in those contexts.
+ * After the RTC is no longer Active in any Running execution
+ * context, it and any RTCs contained transitively within it shall
+ * be finalized.
+ *
+ * @section Constraints
+ *
+ * An RTC cannot be exited if it has not yet been initialized. Any
+ * attempt to exit an RTC that is in the Created state shall fail
+ * with ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * @endif
+ */
+ ReturnCode_t exit();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief attach_context
+ *
+ * @section Description
+ *
+ * Inform this RTC that it is participating in the given execution
+ * context. Return a handle that represents the association of
+ * this RTC with the context.
+ *
+ * @section Semantics
+ *
+ * This operation is intended to be invoked by
+ * ExecutionContextOperations::add_component (see Section
+ * 5.2.2.6.6). It is not intended for use by other clients.
+ *
+ * @endif
+ */
+ ExecutionContextHandle_t attach_context(in ExecutionContext exec_context);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief detach_context
+ * @section Description
+ *
+ * Inform this RTC that it is no longer participating in the given
+ * execution context.
+ *
+ * @section Semantics
+ *
+ * This operation is intended to be invoked by
+ * ExecutionContextOperations::remove_component (see Section
+ * 5.2.2.6.7). It is not intended for use by other clients.
+ *
+ * @section Constraints
+ *
+ * - This operation may not be invoked if this RTC is not already
+ * participating in the execution context. Such a call shall fail
+ * with ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * - This operation may not be invoked if this RTC is Active in
+ * the indicated execution context. Otherwise, it shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * @endif
+ */
+ ReturnCode_t detach_context(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_context
+ *
+ * @section Description
+ *
+ * Obtain a reference to the execution context represented by the
+ * given handle.
+ *
+ * @section Semantics
+ *
+ * The mapping from handle to context is specific to a particular
+ * RTC instance. The given handle must have been obtained by a
+ * previous call to attach_context on this RTC.
+ *
+ * @endif
+ */
+ ExecutionContext get_context(in ExecutionContextHandle_t exec_handle);
+
+ /*!
+ * @if jp
+ * @brief get_owned_contexts
+ *
+ * @section Description
+ *
+ * この RTC が所有する ExecutionContext のリストを取得する。
+ *
+ * @else
+ * @brief get_owned_contexts
+ *
+ * @section Description
+ *
+ * This operation returns a list of all execution contexts owned
+ * by this RTC.
+ *
+ * @endif
+ */
+ ExecutionContextList get_owned_contexts();
+
+ /*!
+ * @if jp
+ * @brief get_participating_contexts
+ *
+ * @section Description
+ *
+ * この RTC が参加しているすべての ExecutionContext のリストを取得する。
+ *
+ * @section Semantics
+ *
+ * このリストに含まれる実行コンテキストは、attach_context が呼び出
+ * されるごとに、リストに追加され、detach_context が呼び出されるご
+ * とに、リストから削除される。
+ *
+ * @else
+ * @brief* get_participating_contexts
+ *
+ * @section Description
+ *
+ * This operation returns a list of all execution contexts in
+ * which this RTC participates.
+ *
+ * @section Semantics
+ *
+ * Each call to attach_context causes the provided context to be
+ * added to this list. Each call to detach_context causes the
+ * provided context to be removed from this list.
+ *
+ * @endif
+ */
+ ExecutionContextList get_participating_contexts();
+
+ /*!
+ * @if jp
+ * ### [誤植] RTC.idl には含まれていないがPIMには含まれている。
+ * ### PIMが正しい。
+ *
+ * @brief
+ * @else
+ * @brief get_context_handle
+ *
+ * @section Description
+ *
+ * This operation returns a handle that is associated with the given
+ * execution context.
+ *
+ * @endif
+ */
+ ExecutionContextHandle_t get_context_handle(in ExecutionContext cxt);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ExecutionKind
+ *
+ * @sectioni Description
+ *
+ * The ExecutionKind enumeration defines the execution semantics
+ * (see Section 5.3) of the RTCs that participate in an execution
+ * context.
+ *
+ * @endif
+ */
+ enum ExecutionKind
+ {
+ /*!
+ * @if jp
+ * @brief
+ *
+ * @else
+ * @brief PERIODIC
+ *
+ * @section Description
+ *
+ * The participant RTCs are executing according to periodic
+ * sampled data semantics (see Section 5.3.1).
+ *
+ * @endif
+ */
+ PERIODIC,
+ /*!
+ * @if jp
+ * @brief
+ *
+ * @else
+ * @brief EVENT_DRIVEN
+ *
+ * @section Description
+ *
+ * The participant RTCs are executing according to stimulus
+ * response semantics (see Section 5.3.2).
+ *
+ * @endif
+ */
+ EVENT_DRIVEN,
+ /*!
+ * @if jp
+ * @brief
+ *
+ * @else
+ * @brief OTHER
+ *
+ * @section Description
+ *
+ * The participant RTCs are executing according to some semantics
+ * not defined by this specification.
+ *
+ * @endif
+ */
+ OTHER
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ExecutionContext
+ *
+ * @section Description
+ *
+ * An ExecutionContext allows the business logic of an RTC to be
+ * decoupled from the thread of control in which it is executed. The
+ * context represents a logical thread of control and is provided to
+ * RTCs at runtime as an argument to various operations, allowing
+ * them to query and modify their own state, and that of other RTCs
+ * executing within the same context, in the lifecycle. This
+ * separation of concerns is important for two primary reasons:
+ *
+ * - Large number of components may collaborate tightly within a
+ * single node or process. If each component were to run within its
+ * own thread of control, the infrastructure may not be able to
+ * satisfy the timeliness and determinism requirements of real-time
+ * applications due to the large number of threads and the required
+ * synchronization between them.
+ *
+ * - A single application may carry out a number of independent
+ * tasks that require different execution rates. For example, it may
+ * need to sample a sensor periodically at a very high rate and update a
+ * user interface at a much lower rate.
+ *
+ * @section Semantics
+ *
+ * The state machine of an ExecutionContext has two parts. The
+ * behavior of the ExecutionContext itself is defined by the upper
+ * region in the above figure. The behavior of the RTCs that
+ * participate in the context is defined by the lower region. The
+ * contents of that region are displayed in more detail in Figure
+ * 5.5 in Section 5.2.2.2. Ownership and Participation Each
+ * execution context is owned by a single RTC and may be used to
+ * execute that RTC and the RTCs contained within it, directly or
+ * indirectly. An RTC that owns one or more execution contexts is
+ * known as an autonomous RTC. An autonomous RTC and some subset of
+ * the RTCs within it (to be defined by the application developer)
+ * shall be executed by the infrastructure according to the context’
+ * s execution kind, which defines when each RTC’s operations will
+ * be invoked when and in which order. These RTCs are said to
+ * participate in the context. The available execution kinds are
+ * described in Section 5.2.2.7. The relationship between RTCs and
+ * execution contexts may be many-to-many in the general case:
+ * multiple RTCs may be invoked from the same execution context, and
+ * a single RTC may be invoked from multiple contexts. In the case
+ * where multiple RTCs are invoked from the same context, starting
+ * or stopping the context shall result in the corresponding
+ * lifecycle transitions for all of those components.
+ *
+ * @section Logical and Physical Threads
+ *
+ * Although an execution context represents a logical thread of
+ * control, the choice of how it maps to a physical thread shall be
+ * left to the application’s deployment
+ * environment. Implementations may elect to associate contexts with
+ * threads with a one-to-one mapping, to serve multiple contexts
+ * from a single thread, or by any other means. In the case where a
+ * given RTC may be invoked from multiple contexts, concurrency
+ * management is implementation-dependent.
+ *
+ * @endif
+ */
+ interface ExecutionContext
+ {
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief is_running
+ * @section Description
+ *
+ * This operation shall return true if the context is in the
+ * Running state.
+ *
+ * @section Semantics
+ *
+ * While the context is Running, all Active RTCs participating in
+ * the context shall be executed according to the context’s
+ * execution kind.
+ *
+ * @endif
+ */
+ boolean is_running();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ *
+ * @brief start
+ *
+ * @section Description
+ *
+ * Request that the context enter the Running state. Once the
+ * state transition occurs, the ComponentAction::on_startup
+ * operation (see Section 5.2.2.4.3) will be invoked. @section *
+ *
+ * @section Semantics
+ *
+ * An execution context may not be started
+ * until the RT components that participate in it have been
+ * initialized. An execution context may be started and stopped
+ * multiple times.
+ *
+ * @section Constraints
+ *
+ * - This operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET if the context is not in the
+ * Stopped state.
+ *
+ * - This operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET if any of the participating
+ * components are not in their Alive state.
+ *
+ * @endif
+ */
+ ReturnCode_t start();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief stop
+ *
+ * @section Description
+ *
+ * Request that the context enter the Stopped state. Once the
+ * transition occurs, the ComponentAction::on_shutdown operation
+ * (see Section 5.2.2.4.4) will be invoked.
+ *
+ * @section Semantics
+ *
+ * An execution context must be stopped before the RT components
+ * that participate in it are finalized.
+ *
+ * An execution context may be started and stopped multiple times.
+ *
+ * @section Constraints
+ *
+ * - This operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET if the context is not in the
+ * Running state.
+ *
+ * @endif
+ */
+ ReturnCode_t stop();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_rate
+ *
+ * @section Description
+ *
+ * This operation shall return the rate (in hertz) at which its
+ * Active participating RTCs are being invoked.
+ *
+ * @section Semantics
+ *
+ * An implementation is permitted to perform some periodic or
+ * quasi-periodic processing within an execution context with an
+ * ExecutionKind other than PERIODIC. In such a case, the result
+ * of this operation is implementation-defined. If no periodic
+ * processing of any kind is taking place within the context, this
+ * operation shall fail as described in Section 5.2.1.
+ *
+ * @section Constraints
+ *
+ * - If the context has an ExecutionKind of PERIODIC, this
+ * operation shall return a rate greater than zero.
+ *
+ * @endif
+ */
+ double get_rate();
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief set_rate
+ *
+ * @section Description
+ *
+ * This operation shall set the rate (in hertz) at which this
+ * context’s Active participating RTCs are being called.
+ *
+ * @section Semantics
+ *
+ * If the execution kind of the context is PERIODIC, a rate change
+ * shall result in the invocation of on_rate_changed on any RTCs
+ * realizing DataFlowComponentAction that are registered with any
+ * RTCs participating in the context. An implementation is
+ * permitted to perform some periodic or quasi-periodic processing
+ * within an execution context with an ExecutionKind other than
+ * PERIODIC. If such is the case, and the implementation reports a
+ * rate from get_rate, this operation shall set that rate
+ * successfully provided that the given rate is valid. If no
+ * periodic processing of any kind is taking place within the
+ * context, this operation shall fail with
+ * ReturnCode_t::UNSUPPORTED.
+ *
+ * @section Constraints
+ *
+ * - The given rate must be greater than zero. Otherwise, this
+ * operation shall fail with ReturnCode_t::BAD_PARAMETER.
+ *
+ * @endif
+ */
+ ReturnCode_t set_rate(in double rate);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief add_component
+ *
+ * @section Description
+ *
+ * The operation causes the given RTC to begin participating in
+ * the execution context.
+ *
+ * @section Semantics
+ *
+ * The newly added RTC will receive a call to
+ * LightweightRTComponent::attach_context (see Section 5.2.2.2.5)
+ * and then enter the Inactive state.
+ *
+ * @section Constraints
+ *
+ * - If the ExecutionKind of this context is PERIODIC, the RTC
+ * must be a data flow component (see Section 5.3.1.1).
+ * Otherwise, this operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * - If the ExecutionKind of this context is EVENT_DRIVEN, the RTC
+ * must be an FSM participant (see Section 5.3.2.3). Otherwise,
+ * this operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * @endif
+ */
+ ReturnCode_t add_component(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief remove_component
+ *
+ * @section Description
+ *
+ * This operation causes a participant RTC to stop participating
+ * in the execution context.
+ *
+ * @section Semantics
+ *
+ * The removed RTC will receive a call to
+ * LightweightRTComponent::detach_context (see Section 5.2.2.2.6).
+ *
+ * @section Constraints
+ *
+ * - If the given RTC is not currently participating in the
+ * execution context, this operation shall fail with
+ * ReturnCode_t::BAD_PARAMETER.
+ *
+ * - An RTC must be deactivated before it can be removed from an
+ * execution context. If the given RTC is participating in the
+ * execution context but is still in the Active state, this
+ * operation shall fail with ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * @endif
+ */
+ ReturnCode_t remove_component(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief activate_component
+ *
+ * @section Description
+ *
+ * The given participant RTC is Inactive and is therefore not
+ * being invoked according to the execution context’s execution
+ * kind. This operation shall cause the RTC to transition to the
+ * Active state such that it may subsequently be invoked in this
+ * execution context.
+ *
+ * @section Semantics
+ *
+ * The callback on_activate shall be called as a result of calling
+ * this operation. This operation shall not return until the
+ * callback has returned, and shall result in an error if the
+ * callback does. The following figure is a non-normative example
+ * sequence diagram for activate_component.
+ *
+ * @section Constraints
+ *
+ * - An execution context can only activate its participant
+ * components. If the given RTC is not participating in the
+ * execution context, this operation shall fail with
+ * ReturnCode_t::BAD_PARAMETER.
+ *
+ * - An RTC that is in the Error state cannot be activated until
+ * after it has been reset. If the given RTC is in the Error
+ * state, this operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET.
+ *
+ * - This operation shall fail with ReturnCode_t::BAD_PARAMETER if
+ * the given component is not in its Alive state.
+ *
+ * @endif
+ */
+ ReturnCode_t activate_component(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief deactivate_component
+ *
+ * @section Description
+ *
+ * The given RTC is Active in the execution context. Cause it to
+ * transition to the Inactive state such that it will not be
+ * subsequently invoked from the context unless and until it is
+ * activated again.
+ *
+ * @section Semantics
+ *
+ * The callback on_deactivate shall be called as a result of
+ * calling this operation. This operation shall not return until
+ * the callback has returned, and shall result in an error if the
+ * callback does. The following figure is a non-normative example
+ * sequence diagram for deactivate_component.
+ *
+ * @section Constraints
+ *
+ * - An execution context can only deactivate its participant
+ * components. If the given RTC is not participating in the
+ * execution context, this operation shall fail with
+ * ReturnCode_t::BAD_PARAMETER.
+ *
+ * - This operation shall fail with ReturnCode_t::BAD_PARAMETER if
+ * the given component is not in its Alive state.
+ *
+ * @endif
+ */
+ ReturnCode_t deactivate_component(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief reset_component
+ *
+ * @section Description
+ *
+ * Attempt to recover the RTC when it is in Error.
+ *
+ * @section Semantics
+ *
+ * The ComponentAction::on_reset callback shall be invoked. This
+ * operation shall not return until the callback has returned, and
+ * shall result in an error if the callback does. If possible, the
+ * RTC developer should implement that callback such that the RTC
+ * may be returned to a valid state. * If this operation fails,
+ * the RTC will remain in Error.
+ *
+ * @section Constraints
+ *
+ * - An RTC may only be reset in an execution context in which it
+ * is in error. If the RTC is not in Error in the identified
+ * context, this operation shall fail with
+ * ReturnCode_t::PRECONDITION_NOT_MET. However, that failure shall
+ * not cause the RTC to enter the Error state.
+ *
+ * - An RTC may not be reset while in the Created state. Any
+ * attempt to invoke this operation while the RTC is in that state
+ * shall fail with ReturnCode_t::PRECONDITION_NOT_MET. However,
+ * that failure shall not cause the RTC to enter the Error state.
+ *
+ * @endif
+ */
+ ReturnCode_t reset_component(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_component_state
+ *
+ * @section Description
+ *
+ * This operation shall report the LifeCycleState of the given
+ * participant RTC.
+ *
+ * @section Constraints
+ *
+ * - The given RTC must be Alive.
+ *
+ * - The given RTC must be a participant in the target execution context.
+ *
+ * - The LifeCycleState returned by this operation shall be one of
+ * LifeCycleState::INACTIVE, ACTIVE, or ERROR.
+ *
+ * @endif
+ */
+ LifeCycleState get_component_state(in LightweightRTObject comp);
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_kind
+ *
+ * @section Description
+ *
+ * This operation shall report the execution kind of the execution
+ * context.
+ *
+ * @endif
+ */
+ ExecutionKind get_kind();
+ };
+
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief DataFlowComponentAction
+ *
+ * @section Description
+ *
+ * DataFlowComponentAction is a companion to ComponentAction (see
+ * Section 5.2.2.4) that provides additional callbacks for
+ * intercepting the two execution passes defined in Section
+ * 5.3.1.1.2.
+ *
+ * @endif
+ */
+ interface DataFlowComponentAction
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_execute
+ * @section Description
+ *
+ * This operation will be invoked periodically at the rate of the
+ * given execution context as long as the following conditions
+ * hold:
+ *
+ * - The RTC is Active.
+ *
+ * - The given execution context is Running.
+ *
+ * @section Semantics
+ *
+ This callback occurs during the first execution pass.
+ *
+ * @section Constraints
+ *
+ * - The execution context of the given context shall be PERIODIC.
+ *
+ * @endif
+ */
+ ReturnCode_t on_execute(in ExecutionContextHandle_t exec_handle);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_state_update
+ *
+ * @section Description
+ *
+ * This operation will be invoked periodically at the rate of the
+ * given execution context as long as the following conditions hold:
+ *
+ * - The RTC is Active.
+ *
+ * - The given execution context is Running.
+ *
+ * @section Semantics
+ *
+ * This callback occurs during the second execution pass.
+ *
+ * @section Constraints
+ *
+ * - The execution context of the given context shall be PERIODIC.
+ *
+ *
+ * @endif
+ */
+ ReturnCode_t on_state_update(in ExecutionContextHandle_t exec_handle);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_rate_changed
+ *
+ * @section Description
+ *
+ * This operation is a notification that the rate of the indicated
+ * execution context (see Section 5.2.2.6.4) has changed.
+ *
+ * @section Constraints
+ *
+ * - The execution context of the given context shall be PERIODIC.
+ *
+ *
+ * @endif
+ */
+ ReturnCode_t on_rate_changed(in ExecutionContextHandle_t exec_handle);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief dataFlowComponent
+ *
+ * @section Description
+ *
+ * The dataFlowComponent stereotype may be applied to a component
+ * type to indicate that its instances should be executed in sorted
+ * order by a periodic execution context.
+ *
+ * @section Constraints
+ *
+ * - An instance of a component extended by the dataFlowComponent
+ * stereotype must participate in at least one * execution context
+ * of kind PERIODIC, which shall also be used for the execution of
+ * any contained data flow components.
+ *
+ * - A component extended by dataFlowComponent must realize the
+ * interface DataFlowComponentAction.
+ *
+ *
+ * @endif
+ */
+ interface DataFlowComponent
+ : LightweightRTObject, DataFlowComponentAction
+ {
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief fsm
+ *
+ * @section Description
+ *
+ * Applying the fsm stereotype to a component implies the ability to
+ * define component-specific states and transitions.
+ *
+ * @section Semantics
+ *
+ * In creating a state machine such as is depicted in Figure 5.22,
+ * the RTC developer is implicitly defining the Active state to be a
+ * submachine state. * The BehaviorStateMachines package described
+ * in [UML] is considered the normative definition of a state
+ * machine.
+ *
+ * @endif
+ */
+ interface Fsm
+ : LightweightRTObject
+ {
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief FsmParticipantAction
+ *
+ * @section Description
+ *
+ * FsmParticipantAction is companion to ComponentAction (see Section
+ * 5.2.2.4) that is intended for use with FSM participant RTCs. It
+ * adds a callback for the interception of state transitions, state
+ * entries, and state exits.
+ *
+ * @endif
+ */
+ interface FsmParticipantAction
+ {
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_action
+ *
+ * @section Description
+ *
+ * The indicated FSM participant RTC has been invoked as a result
+ * of a transition, state entry, or state exit in its containing
+ * FSM.
+ *
+ * @section Constraints
+ *
+ * - The given execution context shall be of kind EVENT_DRIVEN.
+ *
+ * @endif
+ */
+ ReturnCode_t on_action(in ExecutionContextHandle_t exec_handle);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief
+ * @endif
+ */
+ interface FsmParticipant
+ : LightweightRTObject, FsmParticipantAction
+ {
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief Mode
+ *
+ * @section Description
+ *
+ * Each mode defined by a given RTC shall be represented by an
+ * instance of Mode.
+ *
+ * @endif
+ */
+ interface Mode
+ {
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ModeCapable
+ *
+ * @section Description
+ *
+ * The ModeCapable interface provides access to an object’s modes
+ * and a means to set the current mode.
+ *
+ * @section Semantics
+ *
+ * A given RTC may support multiple modes as well as multiple
+ * execution contexts. In such a case, a request for a mode change
+ * (e.g., from "cruise control on" to "cruise control off") may
+ * come asynchronously with respect to one or more of those
+ * execution contexts. The mode of an RTC may therefore be observed
+ * to be different from one execution context to another. - A mode
+ * is pending in a given execution context when a mode change has
+ * been requested but the new mode has not yet been observed by that
+ * context.
+ *
+ * - The new mode has been committed in a given execution context
+ * when the context finally observes the new mode.
+ *
+ * - The new mode has stabilized once it has been committed in all
+ * execution contexts in which the RTC participates.
+ *
+ * Figure 5.26 depicts a state machine that describes mode
+ * changes. Each parallel region in the composite state Mode Pending
+ * represents an execution context. The trigger "sample" within
+ * that state is considered to have occurred: - …just before the
+ * next call to on_execute (see Section 5.3.1.2.1) in the case where
+ * immediate is false and the execution kind is PERIODIC, …
+ *
+ * - …just before the processing of the next stimulus in the case
+ * where immediate is false and the execution kind is
+ * EVENT_DRIVEN, or …- …immediately in all other cases.
+ *
+ * @endif
+ */
+ interface ModeCapable
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_default_mode
+ *
+ * @section Description
+ *
+ * This operation shall return the mode in which the RTC shall be
+ * when no other mode has been set.
+ *
+ * @section Constraints
+ *
+ * - This operation shall not return nil.
+ *
+ * @endif
+ */
+ Mode get_default_mode();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_current_mode
+ *
+ * @section Description
+ *
+ * This operation shall return the last mode to have
+ * stabilized. If no mode has been explicitly set, the current
+ * mode shall be the default mode.
+ *
+ * @section Constraints
+ *
+ * - This operation shall never return nil.
+ *
+ * @endif
+ */
+ Mode get_current_mode();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_current_mode_in_context
+ *
+ * @section Description
+ *
+ * This operation returns the current mode of the component as
+ * seen by the indicated execution context.
+ *
+ * @section Semantics
+ *
+ * The manner in which this property changes is described in Figure 5.26.
+ *
+ * @endif
+ */
+ Mode get_current_mode_in_context(in ExecutionContext exec_context);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_pending_mode
+ *
+ * @section Description
+ *
+ * This operation shall return the last mode to have been passed
+ * to set_mode that has not yet stabilized. Once the RTC’s mode
+ * has stabilized, this operation shall return nil.
+ *
+ * @endif
+ */
+ Mode get_pending_mode();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_pending_mode_in_context
+ *
+ * @section Description
+ *
+ * If the last mode to be requested by a call to set_mode is
+ * different than the current mode as seen by the indicated
+ * execution context (see get_current_mode_in_context), this
+ * operation returns the former. If the requested mode has already
+ * been seen in that context, it returns nil.
+ *
+ * @section Semantics
+ *
+ * See Figure 5.26 for a description of how the pending mode
+ * relates to the current mode within a given execution context.
+ *
+ * @endif
+ */
+ Mode get_pending_mode_in_context(in ExecutionContext exec_context);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief set_mode
+ *
+ * @section Description
+ *
+ * This operation shall request that the RTC change to the indicated mode.
+ *
+ * @section Semantics
+ *
+ * Usually, the new mode will be pending in each execution context
+ * in which the component executes until the next sample period
+ * (if the execution kind is PERIODIC); at that point it will
+ * become the current mode in that context and there will no
+ * longer be a pending mode. However, in some cases it is
+ * important for a mode change to take place immediately; for
+ * example, a serious fault has occurred and the component must
+ * enter an emergency mode to ensure fail-safe behavior in a
+ * safety-critical system. In such a case, immediate should be
+ * true and the mode change will take place in all contexts
+ * without waiting for the next sample period.
+ *
+ * @endif
+ */
+ ReturnCode_t set_mode(in Mode new_mode,
+ in boolean immediate);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief MultiModeComponentAction
+ *
+ * MultiModeComponentAction is a companion to ComponentAction that
+ is realized by RTCs that support multiple modes.
+ *
+ * @endif
+ */
+ interface MultiModeComponentAction
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief on_mode_changed
+ *
+ * @section Description
+ *
+ * This callback is invoked each time the observed mode of a
+ * component has changed with respect to a particular execution
+ * context.
+ *
+ * @section Semantics
+ *
+ * If the context is PERIODIC, this callback shall come before the
+ * next call to on_execute (see Section 5.3.1.2.1) within that
+ * context. The new mode can be retrieved with
+ * get_current_mode_in_context. If the result is the same as the
+ * result of get_current_mode, the mode has stabilized.
+ *
+ * @endif
+ */
+ ReturnCode_t on_mode_changed(in ExecutionContextHandle_t exec_handle);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief
+ * @endif
+ */
+ interface MultiModeObject
+ : LightweightRTObject, ModeCapable, MultiModeComponentAction
+ {
+ };
+
+ interface RTObject;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief PortInterfacePolarity
+ *
+ * @section Description
+ *
+ * The PortInterfacePolarity enumeration identifies exposed
+ * interface instances as provided or required. @endif
+ */
+ enum PortInterfacePolarity
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief PROVIDED
+ *
+ * @section Description
+ *
+ * The target interface is provided as an output by the target
+ * port.
+ *
+ * @endif
+ */
+ PROVIDED,
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief REQUIRED
+ *
+ * @section Description
+ *
+ * The target interface is required as an input by the target port.
+ *
+ * @endif
+ */
+ REQUIRED
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief PortInterfaceProfile
+ *
+ * @section Description
+ *
+ * PortInterfaceProfile describes an instance of a particular
+ * interface as it is exposed by a particular port. These objects
+ * are referred to below as the "target interface" and "target
+ * port" respectively.
+ *
+ * @endif
+ */
+ struct PortInterfaceProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief instance_name
+ *
+ * @section Description
+ *
+ * This attribute stores the name of the target interface instance.
+ *
+ * @endif
+ */
+ string instance_name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief type_name
+ *
+ * @section Description
+ *
+ * This attribute stores the name of the target interface type.
+ *
+ * @endif
+ */
+ string type_name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief polarity
+ *
+ * @section Description
+ *
+ * This attribute indicates whether the target interface instance
+ * is provided or required by the RTC.
+ *
+ * @endif
+ */
+ PortInterfacePolarity polarity;
+ };
+
+ typedef sequence<PortInterfaceProfile> PortInterfaceProfileList;
+
+ interface PortService;
+ typedef sequence<PortService> PortServiceList;
+ typedef sequence<RTObject> RTCList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ConnectorProfile
+ *
+ * @section Description
+ *
+ * The ConnectorProfile contains information about a connection
+ * between the ports of collaborating RTCs.
+ *
+ * @endif
+ */
+ struct ConnectorProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief name
+ *
+ * @section Description
+ *
+ * This attribute contains the name of this connection.
+ *
+ * @endif
+ */
+ string name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief connector_id
+ *
+ * @section Description
+ *
+ * Each connector has a unique identifier that is assigned when
+ * connection is established. This attribute stores that
+ * identifier.
+ *
+ * @endif
+ */
+ UniqueIdentifier connector_id;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ports
+ *
+ * @section Description
+ *
+ * This field stores references to all ports connected by the
+ * target connector.
+ *
+ * @endif
+ */
+ PortServiceList ports;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief properties
+ *
+ * @section Description
+ *
+ * This attribute contains additional properties of the connection.
+ *
+ * @section Semantics
+ *
+ * This attribute provides implementations the opportunity to
+ * describe additional characteristics of a particular connection
+ * that are outside of the scope of this specification.
+ *
+ * @endif
+ */
+ NVList properties;
+ };
+
+ typedef sequence<ConnectorProfile> ConnectorProfileList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief PortProfile
+ *
+ * @section Description
+ *
+ * A PortProfile describes a port of an RTC (referred to as the
+ * "target" RTC). This port is referred to as the "target" port.
+ * From this profile, other components and tools can obtain Port’s
+ * name, type, object reference, and so on.
+ *
+ * @endif
+ */
+ struct PortProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief name
+ *
+ * @section Description
+ *
+ * This attribute contains the name of the target port.
+ *
+ * @section Semantics
+ *
+ * Ports owned by an RTC are distinguished by their
+ * names. Therefore, this name should be unique within the target
+ * RTC.
+ *
+ * @endif
+ */
+ string name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief interfaces
+ *
+ * @section Description
+ *
+ * This attribute contains the name and polarity of each interface
+ * exposed by the target port.
+ *
+ * @endif
+ */
+ PortInterfaceProfileList interfaces;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief port_ref
+ *
+ * @section Description
+ *
+ * This attributes contains a reference to the target port.
+ *
+ * @endif
+ */
+ PortService port_ref;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief connector_profiles
+ *
+ * @section Description
+ *
+ * This attribute contains a collection of profiles describing the
+ * connections to the target port.
+ *
+ * @endif
+ */
+ ConnectorProfileList connector_profiles;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief owner
+ *
+ * @section Description
+ *
+ * This attribute contains a reference to the target RTC.
+ *
+ * @endif
+ */
+ RTObject owner;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief properties
+ *
+ * @section Description
+ *
+ * This attribute contains additional properties of the port.
+ *
+ * @section Semantics
+ *
+ * This attribute provides implementations the opportunity to
+ * describe additional characteristics of a particular port that
+ * are otherwise outside of the scope of this specification.
+ *
+ * @endif
+ */
+ NVList properties;
+ };
+
+ typedef sequence<PortProfile> PortProfileList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief
+ * @endif
+ */
+ struct ExecutionContextProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief kind
+ *
+ * @section Description
+ *
+ * This attribute stores the context’s ExecutionKind.
+ *
+ * @endif
+ */
+ ExecutionKind kind;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief rate
+ *
+ * @section Description
+ *
+ * This attribute stores execution rate.
+ *
+ * @section Semantics
+ *
+ * If the execution kind is not PERIODIC, the value here may not
+ * be valid (and should be negative in that case). See
+ * ExecutionContext::get_rate (see Section 5.2.2.6.4) and set_rate
+ * (see Section 5.2.2.6.5) for more information.
+ *
+ * @endif
+ */
+ double rate;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief owner
+ *
+ * @section Description
+ *
+ * This attribute stores a reference to the RTC that owns the context.
+ *
+ * @endif
+ */
+ RTObject owner;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief participants
+ *
+ * @section Description
+ *
+ * This attribute stores references to the context’s participant RTCs.
+ *
+ * @endif
+ */
+ RTCList participants;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief properties
+ *
+ * @section Description
+ *
+ * This attribute contains additional properties of the execution
+ * context.
+ *
+ * @section Semantics
+ *
+ * This attribute provides implementations the opportunity to
+ * describe additional characteristics of a particular execution
+ * context that are outside the scope of this specification.
+ *
+ * @endif
+ */
+ NVList properties;
+ };
+
+ typedef sequence<ExecutionContextProfile>
+ ExecutionContextProfileList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief FsmObject
+ *
+ * @section Description
+ *
+ * The FsmObject interface allows programs to send stimuli to a
+ * finite state machine, possibly causing it to change states.
+ *
+ * @endif
+ */
+ interface FsmObject
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief send_stimulus
+ *
+ * @section Description
+ *
+ * Send a stimulus to an FSM that realizes this interface.
+ *
+ * @section Semantics
+ *
+ * If the stimulus corresponds to any outgoing transition of the
+ * current state, that transition shall be taken and the state
+ * shall change. Any FSM participants associated with the exit of
+ * the current state, the transition to the new state, or the
+ * entry to the new state shall be invoked. If the stimulus does
+ * not correspond to any such transition, this operation shall
+ * succeed but have no effect.
+ *
+ * If the given execution context is a non-nil reference to a
+ * context in which this FSM participates, the transition shall be
+ * executed in that context. If the argument is nil, the FSM shall
+ * choose an EVENT_DRIVEN context in which to execute the
+ * transition. If the argument is non-nil, but this FSM does not
+ * participate in the given context, this operation shall fail
+ * with * ReturnCode_t::BAD_PARAMETER.
+ *
+ * @section Constraints
+ *
+ * - The given execution context shall be of kind EVENT_DRIVEN.
+ *
+ * @endif
+ */
+ ReturnCode_t send_stimulus(in string message,
+ in ExecutionContextHandle_t exec_handle);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief FsmBehaviorProfile
+ *
+ * @section Description
+ *
+ * FsmBehaviorProfile represents the association of an FSM
+ * participant with a transition, state entry, or state exit in an
+ * FSM.
+ *
+ * @section Semantics
+ *
+ * The assignment of identifiers to particular transitions, state
+ * entries, or state exits is implementation-dependent.
+ *
+ * @endif
+ */
+ struct FsmBehaviorProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief action_component
+ *
+ * @section Description
+ *
+ * This attribute stores a reference to the FSM participant that
+ * is invoked when the containing Fsm receives a message
+ * distinguished by id.
+ *
+ * @endif
+ */
+ FsmParticipantAction action_component;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief id
+ *
+ * @section Description
+ *
+ * This attribute stores the message identifier.
+ *
+ * @endif
+ */
+ UniqueIdentifier id;
+ };
+
+ typedef sequence<FsmBehaviorProfile> FsmBehaviorProfileList;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief FsmProfile
+ *
+ * @section Description
+ *
+ * The FsmProfile describes the correspondence between an FSM and
+ * its contained FSM participants. This Profile is necessary for
+ * Stimulus Response Processing.
+ *
+ * @endif
+ */
+ struct FsmProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief behavior_profiles
+ *
+ * @section Description
+ *
+ * This attribute lists the correspondences between an FSM and its
+ * contained FSM participants.
+ *
+ * @endif
+ */
+ FsmBehaviorProfileList behavior_profiles;
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief FsmService
+ *
+ * @section Description
+ *
+ * The FsmService interface defines operations necessary for
+ * Stimulus Response Processing as an SDO service.
+ *
+ * @endif
+ */
+ interface FsmService
+ : SDOPackage::SDOService
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_fsm_profile
+ *
+ * @section Description
+ *
+ * Get the current state of the FSM.
+ *
+ * @section Semantics
+ *
+ * Modifications to the object returned by this operation will not
+ * be reflected in the FSM until and unless set_fsm_profile is
+ * called.
+ *
+ * @endif
+ */
+ FsmProfile get_fsm_profile();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief set_fsm_profile
+ *
+ * @section Description
+ *
+ * This operation will be used to modify the behavior of an FSM as
+ * described in Stimulus Response Processing.
+ *
+ * @endif
+ */
+ ReturnCode_t set_fsm_profile(in FsmProfile fsm_profile);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ComponentProfile
+ *
+ * @section Description
+ *
+ * ComponentProfile represents the static state of an RTC that is
+ * referred to here as the "target" RTC.
+ *
+ * @endif
+ */
+ struct ComponentProfile
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief instance_name
+ *
+ * @section Description
+ *
+ * This attribute shall contain the name of the target RTC instance.
+ *
+ * @section Semantics
+ *
+ * The instance_name should be unique among RTC instances
+ * contained within the same containing component.
+ *
+ * @endif
+ */
+ string instance_name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief type_name
+ *
+ * @section Description
+ *
+ * This attribute shall contain the name of the target RTC class.
+ *
+ * @section Semantics
+ *
+ * Each RTC class must have a name that is unique within an
+ * application.
+ *
+ * @endif
+ */
+ string type_name;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief description
+ *
+ * @section Description
+ *
+ * This attribute shall briefly describe the target RTC for the
+ * benefit of a human operator.
+ *
+ * @endif
+ */
+ string description;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief version
+ *
+ * @section Description
+ *
+ * This attribute shall contain the version number of the target
+ * RTC class.
+ *
+ * @section Semantics
+ *
+ * The format of the version number is outside of the scope of
+ * this specification.
+ *
+ * @endif
+ */
+ string version;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief vendor
+ *
+ * @section Description
+ *
+ * The name of the individual or organization that produced the
+ * target RTC class.
+ *
+ * @endif
+ */
+ string vendor;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief category
+ *
+ * @section Description
+ *
+ * This attribute contains the name of a "category" or group to
+ * which the target RTC belongs.
+ *
+ *
+ * @endif
+ */
+ string category;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief port_profiles
+ *
+ * @section Description
+ *
+ * This attribute contains a list of PortProfiles that describe
+ * the ports of the target RTC.
+ *
+ * @section Semantics
+ *
+ * There shall be a one-to-one correspondence between the members
+ * of this list and the ports of the target RTC.
+ *
+ *
+ * @endif
+ */
+ PortProfileList port_profiles;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief parent
+ *
+ * @section Description
+ *
+ * This attribute contains a reference to the RTC that contains
+ * the target RTC instance. If the target RTC instance is not
+ * owned by any other RTC, this field stores a nil reference.
+ *
+ * @endif
+ */
+ RTObject parent;
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief properties
+ *
+ * @section Description
+ *
+ * This attribute contains additional properties of the target RTC.
+ *
+ * @section Semantics
+ *
+ * This attribute provides implementations the opportunity to
+ * describe additional characteristics of a particular RTC that
+ * are otherwise outside of the scope of this specification.
+ *
+ * @endif
+ */
+ NVList properties;
+ };
+
+ typedef sequence<ComponentProfile> ComponentProfileList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief PortService
+ *
+ * @section Description
+ *
+ * An instance of the PortService interface represents a port (i.e.,
+ * UML::Composite Structures::Ports::Port) of an RTC. It provides
+ * operations that allow it to be connected to and disconnected from
+ * other ports.
+ *
+ * @section Semantics
+ *
+ * A port service can support unidirectional or bidirectional
+ * communication. A port service may allow for a service-oriented
+ * connection, in which other connected ports, invoke methods on
+ * it. It may also allow for a data-centric connection, in which
+ * data values are streamed in or out. In either case, the
+ * connection is described by an instance of
+ * ConnectorProfile. However, the behavioral contracts of such
+ * connections are dependent on the interfaces exposed by the ports
+ * and are not described normatively by this specification.
+ *
+ * @endif
+ */
+ interface PortService
+ : SDOPackage::SDOService
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_port_profile
+ *
+ * @section Description
+ *
+ * This operation returns the PortProfile of the PortService.
+ *
+ * @endif
+ */
+ PortProfile get_port_profile();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_connector_profiles
+ *
+ * @section Description
+ *
+ * This operation returns a list of the ConnectorProfiles of the
+ * PortService.
+ *
+ * @endif
+ */
+ ConnectorProfileList get_connector_profiles();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_connector_profiles
+ *
+ * @section Description
+ *
+ * This operation returns a list of the ConnectorProfiles of the
+ * PortService.
+ *
+ * @endif
+ */
+ ConnectorProfile get_connector_profile(in UniqueIdentifier connector_id);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief connect
+ *
+ * @section Description
+ *
+ * This operation establishes connection between this port and the
+ * peer ports according to given ConnectionProfile.
+ *
+ * @section Semantics
+ *
+ * A ConnectorProfile has a sequence of port references. This port
+ * invokes the notify_connect operation of one of the ports
+ * included in the sequence. It follows that the notification of
+ * connection is propagated by the notify_connect operation with
+ * ConnectorProfile. This operation returns ConnectorProfile
+ * return value and returns ReturnCode_t as return codes.
+ *
+ * @endif
+ */
+ ReturnCode_t connect(inout ConnectorProfile connector_profile);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief disconnect
+ *
+ * @section Description
+ *
+ * This operation destroys the connection between this port and
+ * its peer ports using the ID that was given when the connection
+ * was established.
+ *
+ * @section Semantics
+ *
+ * This port invokes the notify_disconnect operation of one of the
+ * ports included in the sequence of the ConnectorProfile stored
+ * when the connection was established. The notification of
+ * disconnection is propagated by the notify_disconnect operation.
+ *
+ * @endif
+ */
+ ReturnCode_t disconnect(in UniqueIdentifier connector_id);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief disconnect_all
+ *
+ * @section Description
+ *
+ * This operation destroys all connection channels owned by the
+ * PortService.
+ *
+ * @endif
+ */
+ ReturnCode_t disconnect_all();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief notify_connect
+ *
+ * @section Description
+ *
+ * This operation notifies this PortService of the connection
+ * between its corresponding port and the other ports and
+ * propagates the given ConnectionProfile.
+ *
+ * @section Semantics
+ *
+ * A ConnectorProfile has a sequence of port references. This
+ * PortService stores the ConnectorProfile and invokes the
+ * notify_connect operation of the next PortService in the
+ * sequence. As ports are added to the connector, PortService
+ * references are added to the ConnectorProfile and provided to
+ * the caller. In this way, notification of connection is
+ * propagated with the ConnectorProfile.
+ *
+ * @endif
+ */
+ ReturnCode_t notify_connect(inout ConnectorProfile connector_profile);
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief notify_disconnect
+ *
+ * @section Description
+ *
+ * This operation notifies a PortService of a disconnection
+ * between its corresponding port and the other ports. The
+ * disconnected connector is identified by the given ID, which was
+ * given when the connection was established.
+ *
+ * @section Semantics
+ *
+ * This port invokes the notify_disconnect operation of the next
+ * PortService in the sequence of the ConnectorProfile that was
+ * stored when the connection was established. As ports are
+ * disconnected, PortService references are removed from the
+ * ConnectorProfile. In this way, the notification of
+ * disconnection is propagated by the notify_disconnect operation.
+ *
+ * @endif
+ */
+ ReturnCode_t notify_disconnect(in UniqueIdentifier connector_id);
+ };
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief ExecutionContextService
+ *
+ * @section Description
+ *
+ * An ExecutionContextService exposes an ExecutionContext as an SDO
+ * service such that the context may be controlled remotely.
+ *
+ * @section Semantics
+ *
+ * Depending on the implementation, this interface may itself be an
+ * execution context (that is, it may be passed to the operations of
+ * ComponentAction) or it may represent a remote execution context
+ * that is not of type ExecutionContextService. @endif
+ */
+ interface ExecutionContextService
+ : ExecutionContext, SDOPackage::SDOService
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_profile
+ *
+ * @section Description
+ *
+ * This operation provides a profile "descriptor" for the
+ * execution context.
+ *
+ * @endif
+ */
+ ExecutionContextProfile get_profile();
+ };
+
+ typedef sequence<ExecutionContextService>
+ ExecutionContextServiceList;
+
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief RTObject
+ *
+ * @section Description
+ *
+ * The RTObject interface defines the operations that all SDO-based
+ * RTCs must provide. It is required by the rtComponent stereotype.
+ *
+ * @endif
+ */
+ interface RTObject
+ : LightweightRTObject, SDOPackage::SDO
+ {
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_component_profile
+ *
+ * @section Description
+ *
+ * This operation returns the ComponentProfile of the RTC.
+ *
+ * @endif
+ */
+ ComponentProfile get_component_profile();
+ /*!
+ * @if jp
+ * @brief
+ * @else
+ * @brief get_ports
+ *
+ * @section Description
+ *
+ * This operation returns a list of the RTCs ports.
+ *
+ * @endif
+ */
+ PortServiceList get_ports();
+ };
+};
+
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/SDOPackage.idl
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/SDOPackage.idl (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/SDOPackage.idl 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,294 @@
+//Platform Independent Model (PIM) and Platform Specific Model (PSM)
+//for Super Distributed Objects (SDO) Specification, v1.1 - OMG IDL Summary File
+//Object Management Group, Inc.
+//Copyright (c) 2003, Fraunhofer FOKUS
+//Copyright (c) 2003, Hitachi, Ltd.
+//The companies listed above have granted to the Object Management Group, Inc.
+//(OMG) a nonexclusive, royalty-free, paid up, worldwide license to copy and
+//distribute this document and to modify this document and distribute copies of
+//the modified version. Each of the copyright holders listed above has agreed
+//that no person shall be deemed to have infringed the copyright in the included
+//material of any such copyright holder by reason of having used the
+//specification set forth herein or having conformed any computer software to
+//the specification.
+//
+//This file contains OMG IDL from the Naming Service Specification, v1.2.
+//OMG regularly publishes a summary file that contains all the "code" parts of
+//an OMG formal document. Every formal document line that is IDL, PIDL, or
+//language code is included in the summary file. The reason for such a listing
+//is to give readers an electronic version of the "code" so that they can
+//extract pieces of it. Readers might want to test an example, include it in
+//their own code, or use it for documentation purposes. Having the code lines
+//available electronically means there is less likelihood of a transcription
+//error.
+//
+// ver 1.0 formal/2004-11-02
+// ver 1.1 (RTF report: dtc/2008-03-05)
+//
+//SDOPackage.idl
+
+#ifndef _SDO_PACKAGE_IDL_
+#define _SDO_PACKAGE_IDL_
+
+#ifdef TAO_IDL
+#include <orb.idl>
+#endif
+#ifdef USE_MONITORING
+#include <CosNotifyComm.idl>
+#endif
+#ifndef ORBIT2_IDL
+#define TypeCode CORBA::TypeCode
+#endif
+/** CORBA specific model for SDOs */
+
+#pragma prefix "org.omg"
+#define exception_body { string description; }
+
+module SDOPackage
+{
+ interface SDO;
+ interface SDOService;
+ interface SDOSystemElement;
+ interface Configuration;
+ interface Monitoring;
+ interface Organization;
+
+ /** ------- Data Types -------*/
+ typedef sequence<string> StringList;
+ typedef sequence<SDO> SDOList;
+ typedef sequence<Organization> OrganizationList;
+ typedef string UniqueIdentifier;
+
+ struct NameValue
+ {
+ string name;
+ any value;
+ };
+
+ typedef sequence<NameValue> NVList;
+
+ enum NumericType
+ {
+ SHORT_TYPE,
+ LONG_TYPE,
+ FLOAT_TYPE,
+ DOUBLE_TYPE
+ };
+
+ union Numeric switch (NumericType)
+ {
+ case SHORT_TYPE: short short_value;
+ case LONG_TYPE: long long_value;
+ case FLOAT_TYPE: float float_value;
+ case DOUBLE_TYPE: double double_value;
+ };
+
+ struct EnumerationType
+ {
+ StringList enumerated_values;
+ };
+
+ struct RangeType
+ {
+ Numeric min;
+ Numeric max;
+ boolean min_inclusive;
+ boolean max_inclusive;
+ };
+
+ struct IntervalType
+ {
+ Numeric min;
+ Numeric max;
+ boolean min_inclusive;
+ boolean max_inclusive;
+ Numeric step;
+ };
+
+ enum ComplexDataType
+ {
+ ENUMERATION, RANGE, INTERVAL
+ };
+
+ union AllowedValues switch (ComplexDataType)
+ {
+ case ENUMERATION: EnumerationType allowed_enum;
+ case INTERVAL: IntervalType allowed_interval;
+ case RANGE: RangeType allowed_range;
+ };
+
+ struct Parameter
+ {
+ string name;
+ TypeCode type;
+ AllowedValues allowed_values;
+ };
+
+ typedef sequence<Parameter> ParameterList;
+ struct OrganizationProperty
+ {
+ NVList properties;
+ };
+ enum DependencyType
+ {
+ OWN,
+ OWNED,
+ NO_DEPENDENCY
+ };
+
+ struct DeviceProfile
+ {
+ string device_type;
+ string manufacturer;
+ string model;
+ string version;
+ NVList properties;
+ };
+
+ struct ServiceProfile
+ {
+ string id;
+ string interface_type;
+ NVList properties;
+ SDOService service;
+ };
+
+ typedef sequence <ServiceProfile> ServiceProfileList;
+ struct ConfigurationSet
+ {
+ string id;
+ string description;
+ NVList configuration_data;
+ };
+
+ typedef sequence<ConfigurationSet> ConfigurationSetList;
+
+
+ /** ------- Exceptions -------*/
+ exception NotAvailable exception_body;
+ exception InterfaceNotImplemented exception_body;
+ exception InvalidParameter exception_body;
+ exception InternalError exception_body;
+
+ /** ------- Interfaces -------*/
+ interface SDOSystemElement
+ {
+ OrganizationList get_owned_organizations()
+ raises (NotAvailable,InternalError);
+ };
+ interface SDO : SDOSystemElement
+ {
+ UniqueIdentifier get_sdo_id()
+ raises (NotAvailable, InternalError);
+ string get_sdo_type()
+ raises (NotAvailable, InternalError);
+ DeviceProfile get_device_profile ()
+ raises (NotAvailable, InternalError);
+ ServiceProfileList get_service_profiles ()
+ raises (NotAvailable, InternalError);
+ ServiceProfile get_service_profile (in UniqueIdentifier id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ SDOService get_sdo_service (in UniqueIdentifier id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ Configuration get_configuration ()
+ raises (InterfaceNotImplemented, NotAvailable, InternalError);
+ Monitoring get_monitoring ()
+ raises (InterfaceNotImplemented, NotAvailable, InternalError);
+ OrganizationList get_organizations ()
+ raises (NotAvailable, InternalError);
+ NVList get_status_list ()
+ raises (NotAvailable, InternalError);
+ any get_status (in string nme)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ };
+
+
+ interface Configuration
+ {
+ boolean set_device_profile (in DeviceProfile dProfile)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean add_service_profile (in ServiceProfile sProfile)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean add_organization (in Organization organization_object)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean remove_service_profile (in UniqueIdentifier id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean remove_organization (in UniqueIdentifier organization_id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ ParameterList get_configuration_parameters ()
+ raises (NotAvailable, InternalError);
+ NVList get_configuration_parameter_values ()
+ raises (NotAvailable, InternalError);
+ any get_configuration_parameter_value (in string name)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean set_configuration_parameter (in string name,
+ in any value)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ ConfigurationSetList get_configuration_sets ()
+ raises (NotAvailable, InternalError);
+ ConfigurationSet get_configuration_set (in UniqueIdentifier config_id)
+ raises (NotAvailable, InternalError);
+ boolean set_configuration_set_values (in ConfigurationSet configuration_set)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ ConfigurationSet get_active_configuration_set ()
+ raises (NotAvailable, InternalError);
+ boolean add_configuration_set (in ConfigurationSet configuration_set)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean remove_configuration_set (in UniqueIdentifier config_id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean activate_configuration_set (in UniqueIdentifier config_id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ };
+
+
+#ifdef USE_MONITORING
+ interface Monitoring : CosNotifyComm::StructuredPushConsumer,
+ CosNotifyComm::StructuredPushSupplier
+ {
+ any get_monitoring_parameter_value (in string name)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ ParameterList get_monitoring_parameters ()
+ raises (NotAvailable, InternalError);
+ NVList get_monitoring_parameter_values ()
+ raises (NotAvailable, InternalError);
+ };
+#else
+ interface Monitoring {};
+#endif
+
+ interface SDOService {};
+
+ interface Organization
+ {
+ UniqueIdentifier get_organization_id ()
+ raises (InvalidParameter, NotAvailable, InternalError);
+ OrganizationProperty get_organization_property ()
+ raises (NotAvailable, InternalError);
+ any get_organization_property_value (in string name)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean add_organization_property (in OrganizationProperty organization_property)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean set_organization_property_value (in string name,
+ in any value)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean remove_organization_property ( in string name )
+ raises (InvalidParameter, NotAvailable, InternalError);
+ SDOSystemElement get_owner ()
+ raises (NotAvailable, InternalError);
+ boolean set_owner (in SDOSystemElement sdo)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ SDOList get_members ()
+ raises (NotAvailable, InternalError);
+ boolean set_members (in SDOList sdos)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean add_members ( in SDOList sdo_list)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ boolean remove_member (in UniqueIdentifier id)
+ raises (InvalidParameter, NotAvailable, InternalError);
+ DependencyType get_dependency()
+ raises (NotAvailable, InternalError);
+ boolean set_dependency (in DependencyType dependency)
+ raises (NotAvailable, InternalError);
+ };
+};
+#endif //_SDO_PACKAGE_IDL_
Added: branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/test_ComponentObserverConsumer.py
===================================================================
--- branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/test_ComponentObserverConsumer.py (rev 0)
+++ branches/RELENG_1_1/OpenRTM-aist-Python/OpenRTM_aist/ext/sdo/observer/test/test_ComponentObserverConsumer.py 2011-08-04 07:19:10 UTC (rev 436)
@@ -0,0 +1,206 @@
+#!/usr/bin/env python
+# -*- coding: euc-jp -*-
+
+##
+# @file test_ComponentObserverConsumer.py
+# @brief test for ComponentObserverConsumer
+# @date $Date$
+# @author Shinji Kurihara
+#
+# Copyright (C) 2011
+# Noriaki Ando
+# Intelligent Systems Research Institute,
+# National Institute of
+# Advanced Industrial Science and Technology (AIST), Japan
+# All rights reserved.
+#
+
+import sys
+sys.path.insert(1,"../")
+
+import unittest
+import time
+
+from omniORB import CORBA, PortableServer
+import RTC
+import OpenRTM, OpenRTM__POA
+import SDOPackage
+import OpenRTM_aist
+
+from ComponentObserverConsumer import *
+
+class ComponentObserver_i(OpenRTM__POA.ComponentObserver):
+ def __init__(self):
+ pass
+
+ def update_status(self, status_kind, hint):
+ print "update_status: ", status_kind, ", ", hint
+ return
+
+
+class MockRTC(OpenRTM_aist.RTObject_impl):
+ def __init__(self):
+ self._orb = CORBA.ORB_init()
+ self._poa = self._orb.resolve_initial_references("RootPOA")
+ OpenRTM_aist.RTObject_impl.__init__(self, orb=self._orb, poa=self._poa)
+ pass
+
+##
+# @if jp
+# @else
+# @endif
+#
+class TestComponentObserverConsumer(unittest.TestCase):
+ """
+ """
+
+ def setUp(self):
+ self._orb = CORBA.ORB_init(sys.argv)
+ self._poa = self._orb.resolve_initial_references("RootPOA")
+ self._poa._get_the_POAManager().activate()
+ self.coc = ComponentObserverConsumer()
+ servant_ = ComponentObserver_i()
+ mgr_ = OpenRTM_aist.Manager.instance()
+ oid_ = mgr_.getPOA().servant_to_id(servant_)
+ self._provider = mgr_.getPOA().id_to_reference(oid_)
+ self._mock = MockRTC()
+ self._properties = [OpenRTM_aist.NVUtil.newNV("heartbeat.enable","YES"),
+ OpenRTM_aist.NVUtil.newNV("heartbeat.interval","0.1"),
+ OpenRTM_aist.NVUtil.newNV("observed_status","ALL")]
+ self._sprof = SDOPackage.ServiceProfile("test_id", "interface_type",
+ self._properties, self._provider)
+ self.coc.init(self._mock, self._sprof)
+ return
+
+ def tearDown(self):
+ self.coc.finalize()
+ del self.coc
+ self._mock.exit()
+ time.sleep(0.1)
+ OpenRTM_aist.Manager.instance().shutdownManager()
+ return
+
+
+ def test_reinit(self):
+ self.assertEqual(self.coc.reinit(self._sprof), True)
+ return
+
+
+ def test_getProfile(self):
+ self.coc.getProfile()
+ return
+
+
+ def test_finalize(self):
+ self.coc.finalize()
+ return
+
+
+ def test_updateStatus(self):
+ self.coc.updateStatus(OpenRTM.COMPONENT_PROFILE, "update Component profile")
+ return
+
+
+ def test_toString(self):
+ self.assertEqual("COMPONENT_PROFILE",self.coc.toString(OpenRTM.COMPONENT_PROFILE))
+ self.assertEqual("RTC_STATUS",self.coc.toString(OpenRTM.RTC_STATUS))
+ self.assertEqual("EC_STATUS",self.coc.toString(OpenRTM.EC_STATUS))
+ self.assertEqual("PORT_PROFILE",self.coc.toString(OpenRTM.PORT_PROFILE))
+ self.assertEqual("CONFIGURATION",self.coc.toString(OpenRTM.CONFIGURATION))
+ self.assertEqual("HEARTBEAT",self.coc.toString(OpenRTM.HEARTBEAT))
+ return
+
+
+ def test_setListeners(self):
+ prop = OpenRTM_aist.Properties()
+ prop.setProperty("observed_status",
+ "component_profile, rtc_status, port_profile, \
+ ec_status, port_profile , configuration")
+ self.coc.setListeners(prop)
+ return
+
+
+ def setfunc(self):
+ print "setfunc"
+ return
+
+ def unsetfunc(self):
+ print "unsetfunc"
+ return
+
+ def test_switchListeners(self):
+ self.coc.switchListeners(True, [True], 0, self.setfunc, self. unsetfunc)
+ self.coc.switchListeners(True, [False], 0, self.setfunc, self. unsetfunc)
+ self.coc.switchListeners(False, [True], 0, self.setfunc, self. unsetfunc)
+ self.coc.switchListeners(False, [False], 0, self.setfunc, self. unsetfunc)
+ return
+
+
+ def test_heartbeat(self):
+ self.coc.heartbeat()
+ return
+
+
+ def test_setHeartbeat(self):
+ prop = OpenRTM_aist.Properties()
+ prop.setProperty("heartbeat.enable","NO")
+ prop.setProperty("heartbeat.interval","1.0")
+ self.coc.setHeartbeat(prop)
+ prop = OpenRTM_aist.Properties()
+ prop.setProperty("heartbeat.enable","YES")
+ prop.setProperty("heartbeat.interval","0.01")
+ self.coc.setHeartbeat(prop)
+ prop = OpenRTM_aist.Properties()
+ prop.setProperty("heartbeat.enable","YES")
+ self.coc.setHeartbeat(prop)
+ return
+
+
+ def test_unsetHeartbeat(self):
+ self.coc.unsetHeartbeat()
+ return
+
+
+ def test_setComponentStatusListeners(self):
+ self.coc.setComponentStatusListeners()
+ return
+
+
+ def test_unsetComponentStatusListeners(self):
+ self.coc.unsetComponentStatusListeners()
+ return
+
+
+ def test_setPortProfileListeners(self):
+ self.coc.setPortProfileListeners()
+ return
+
+
+ def test_unsetPortProfileListeners(self):
+ self.coc.unsetPortProfileListeners()
+ return
+
+
+ def test_setExecutionContextListeners(self):
+ self.coc.setExecutionContextListeners()
+ return
+
+
+ def test_unsetExecutionContextListeners(self):
+ self.coc.unsetExecutionContextListeners()
+ return
+
+
+ def test_setConfigurationListeners(self):
+ self.coc.setConfigurationListeners()
+ return
+
+
+ def test_unsetConfigurationListeners(self):
+ self.coc.unsetConfigurationListeners()
+ return
+
+
+############### test #################
+if __name__ == '__main__':
+ unittest.main()
openrtm-commit メーリングリストの案内