PublisherPeriodic.py

説明を見る。
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 ##
00005 # @file  PublisherPeriodic.py
00006 # @brief PublisherPeriodic class
00007 # @date  $Date: 2007/09/28 $
00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara
00009 #
00010 # Copyright (C) 2006-2008
00011 #     Noriaki Ando
00012 #     Task-intelligence Research Group,
00013 #     Intelligent Systems Research Institute,
00014 #     National Institute of
00015 #         Advanced Industrial Science and Technology (AIST), Japan
00016 #     All rights reserved.
00017 
00018 import threading
00019 from omniORB import any
00020 
00021 import OpenRTM
00022 
00023 
00024 ##
00025 # @if jp
00026 # @class PublisherPeriodic
00027 # @brief PublisherPeriodic クラス
00028 #
00029 # 一定周期でコンシューマの送出処理を呼び出す Publisher
00030 # 定期的にデータ送信を実行する場合に使用する。
00031 #
00032 # @else
00033 # @class PublisherPeriodic
00034 # @brief PublisherPeriodic class
00035 # @endif
00036 class PublisherPeriodic(OpenRTM.PublisherBase):
00037   """
00038   """
00039 
00040 
00041 
00042   ##
00043   # @if jp
00044   # @brief コンストラクタ
00045   #
00046   # コンストラクタ
00047   # 送出処理の呼び出し間隔を、Propertyオブジェクトのdataport.push_rateメンバ
00048   # に設定しておく必要がある。送出間隔は、Hz単位の浮動小数文字列で指定。
00049   # たとえば、1000.0Hzの場合は、「1000.0」を設定。
00050   # 上記プロパティが未設定の場合は、「1000Hz」を設定。
00051   #
00052   # @param self
00053   # @param consumer データ送出を待つコンシューマ
00054   # @param property 本Publisherの駆動制御情報を設定したPropertyオブジェクト
00055   #
00056   # @else
00057   # @brief Constructor
00058   # @endif
00059   def __init__(self, consumer, property):
00060     self._consumer = consumer
00061     self._running = True
00062     rate = property.getProperty("dataport.push_rate")
00063 
00064     if type(rate) == str or type(rate) == float or type(rate) == long :
00065       rate = float(rate)
00066     else:
00067       rate = float(any.from_any(rate,keep_structs=True))
00068 
00069     if rate:
00070       hz = rate
00071       if (hz == 0):
00072         hz = 1000.0
00073     else:
00074       hz = 1000.0
00075 
00076     self._usec = int(1000000.0/hz)
00077 
00078     self._running = True
00079     self._thread = threading.Thread(target=self.run)
00080     self._thread.start()
00081 
00082 
00083   ##
00084   # @if jp
00085   # @brief デストラクタ
00086   #
00087   # デストラクタ
00088   #
00089   # @param self
00090   #
00091   # @else
00092   # @brief Destructor
00093   # @endif
00094   def __del__(self):
00095     self._running = False
00096     del self._consumer
00097 
00098 
00099   ##
00100   # @if jp
00101   # @brief Observer関数(未実装)
00102   #
00103   # 本 Publisher では何も実行しない。
00104   #
00105   # @param self
00106   #
00107   # @else
00108   # @brief Observer function
00109   # @endif
00110   def update(self):
00111     pass
00112 
00113 
00114   ##
00115   # @if jp
00116   # @brief タスク開始関数
00117   #
00118   # 本Publisher駆動制御用スレッドの実行を開始する。
00119   #
00120   # @param self
00121   #
00122   # @else
00123   # @brief Thread execution function
00124   # @endif
00125   def run(self):
00126     import time
00127     while self._running:
00128       self._consumer.push()
00129       time.sleep(self._usec/1000000.0)
00130 
00131     return 0
00132 
00133 
00134   ##
00135   # @if jp
00136   # @brief タスク終了関数
00137   #
00138   # ACE_Task::release() のオーバーライド
00139   # 駆動フラグをfalseに設定し、本 Publisher の駆動を停止する。
00140   # ただし、最大1回コンシューマの送出処理が呼び出される場合がある。
00141   #
00142   # @param self
00143   #
00144   # @else
00145   # @brief Task terminate function
00146   #
00147   # ACE_Task::release() override function
00148   #
00149   # @endif
00150   def release(self):
00151     self._running = False

OpenRTMに対してMon Mar 17 15:11:06 2008に生成されました。  doxygen 1.5.4