TimeValue.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 
00005 ##
00006 # @file TimeValue.py
00007 # @brief TimeValue class
00008 # @date $Date: 2007/08/23$
00009 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara
00010 #
00011 # Copyright (C) 2007-2008
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 
00019 import OpenRTM_aist
00020 
00021 TIMEVALUE_ONE_SECOND_IN_USECS = 1000000 # 1 [sec] = 1000000 [usec]
00022 
00023 ##
00024 # @if jp
00025 # @class TimeValue
00026 # @brief 時間計算用クラス
00027 # 
00028 # 指定した時間値を保持するためのクラス。
00029 # 時間値に対する各種計算用オペレーションを提供する。
00030 #
00031 # @since 0.4.0
00032 #
00033 # @else
00034 #
00035 # @endif
00036 class TimeValue:
00037   """
00038   """
00039 
00040 
00041 
00042   ##
00043   # @if jp
00044   #
00045   # @brief コンストラクタ
00046   # 
00047   # コンストラクタ
00048   # 指定された秒,マイクロ秒で初期化する。
00049   #
00050   # @param self
00051   # @param sec 秒(デフォルト値:None)
00052   # @param usec マイクロ秒(デフォルト値:None)
00053   # 
00054   # @else
00055   #
00056   # @endif
00057   def __init__(self, sec=None, usec=None):
00058     global TIMEVALUE_ONE_SECOND_IN_USECS
00059 
00060     if type(sec) == str:
00061       sec = float(sec)
00062     if type(usec) == str:
00063       usec = float(usec)
00064 
00065     # TimeValue(double timeval)
00066     if sec and usec is None:
00067       if sec >= 0.0:
00068         dbHalfAdj_ = 0.5
00069       else:
00070         dbHalfAdj_ = -0.5
00071         
00072       self.tv_sec = long(sec)
00073       self.tv_usec = long((sec - float(self.tv_sec)) *
00074                           float(TIMEVALUE_ONE_SECOND_IN_USECS) + dbHalfAdj_)
00075       self.normalize()
00076       return
00077 
00078     if sec is None:
00079       self.tv_sec = long(0)
00080     else:
00081       self.tv_sec = long(sec)
00082 
00083     if usec is None:
00084       self.tv_usec = long(0)
00085     else:
00086       self.tv_usec = long(usec)
00087     self.normalize()
00088     return
00089 
00090 
00091   ##
00092   # @if jp
00093   #
00094   # @brief 時間減算
00095   # 
00096   # 設定された時間から引数で与えられた時間を減算する。
00097   #
00098   # @param self
00099   # @param tm 減算時間
00100   # 
00101   # @return 減算結果
00102   # 
00103   # @else
00104   #
00105   # @endif
00106   def __sub__(self, tm):
00107     global TIMEVALUE_ONE_SECOND_IN_USECS
00108     try:
00109       res = TimeValue()
00110     except:
00111       res = OpenRTM_aist.TimeValue()
00112 
00113     if self.tv_sec >= tm.tv_sec:
00114       # +
00115       if self.tv_usec >= tm.tv_usec:
00116         # 繰り下がり無し
00117         res.tv_sec  = self.tv_sec  - tm.tv_sec
00118         res.tv_usec = self.tv_usec - tm.tv_usec
00119       else:
00120         # self.tv_usec < tm.tv_usec 繰り下がり有り
00121         res.tv_sec  = self.tv_sec  - tm.tv_sec - 1
00122         res.tv_usec = (self.tv_usec + TIMEVALUE_ONE_SECOND_IN_USECS) - tm.tv_usec
00123     else:
00124       # self.tv_sec < tm.tv_sec # -
00125       if tm.tv_usec >= self.tv_usec:
00126         # 繰り下がり無し
00127         res.tv_sec  = -(tm.tv_sec  - self.tv_sec)
00128         res.tv_usec = -(tm.tv_usec - self.tv_usec)
00129       else:
00130         # tm.tv_usec < self.tv_usec 繰り下がり有り
00131         res.tv_sec  = -(tm.tv_sec - self.tv_sec - 1)
00132         res.tv_usec = -(tm.tv_usec + TIMEVALUE_ONE_SECOND_IN_USECS) + self.tv_usec
00133 
00134     self.normalize()
00135     return res
00136 
00137 
00138   ##
00139   # @if jp
00140   #
00141   # @brief 時間加算
00142   # 
00143   # 設定された時間に引数で与えられた時間を加算する。
00144   #
00145   # @param self
00146   # @param tm 加算時間
00147   # 
00148   # @return 加算結果
00149   # 
00150   # @else
00151   #
00152   # @endif
00153   def __add__(self, tm):
00154     global TIMEVALUE_ONE_SECOND_IN_USECS
00155     res = TimeValue()
00156     res.tv_sec  = self.tv_sec  + tm.tv_sec
00157     res.tv_usec = self.tv_usec + tm.tv_usec
00158     if res.tv_usec > TIMEVALUE_ONE_SECOND_IN_USECS:
00159       res.tv_sec += 1
00160       res.tv_usec -= TIMEVALUE_ONE_SECOND_IN_USECS
00161 
00162     self.normalize()
00163     return res
00164 
00165 
00166   def sec(self):
00167     return self.tv_sec
00168 
00169 
00170   def usec(self):
00171     return self.tv_usec
00172 
00173 
00174   ##
00175   # @if jp
00176   #
00177   # @brief double型→時間型変換
00178   # 
00179   # 引数で与えられたdouble型を時間型に変換する。
00180   #
00181   # @param self
00182   # @param time 変換元値
00183   # 
00184   # @return 変換結果
00185   # 
00186   # @else
00187   #
00188   # @endif
00189   def set_time(self, time):
00190     global TIMEVALUE_ONE_SECOND_IN_USECS
00191 
00192     self.tv_sec  = long(time)
00193     self.tv_usec = long((time - float(self.tv_sec)) * float(TIMEVALUE_ONE_SECOND_IN_USECS))
00194     return self
00195 
00196   ##
00197   # @if jp
00198   #
00199   # @brief 時間型→double型変換
00200   # 
00201   # 保持している内容をdouble型に変換する。
00202   #
00203   # @param self
00204   # @return double型変換結果
00205   # 
00206   # @else
00207   #
00208   # @endif
00209   def toDouble(self):
00210     global TIMEVALUE_ONE_SECOND_IN_USECS
00211     return float(self.tv_sec) + float(self.tv_usec / float(TIMEVALUE_ONE_SECOND_IN_USECS))
00212 
00213 
00214   ##
00215   # @if jp
00216   # @brief 設定時間を出力する
00217   #
00218   # 設定時間を文字列出力する。<br>
00219   #
00220   # @param self
00221   #
00222   # @return 設定時間文字列表示
00223   #
00224   # @else
00225   #
00226   # @endif
00227   def __str__(self):
00228     global TIMEVALUE_ONE_SECOND_IN_USECS
00229     return str(self.tv_sec + self.tv_usec / float(TIMEVALUE_ONE_SECOND_IN_USECS))
00230 
00231   ##
00232   # @if jp
00233   # @brief 符号判定
00234   #
00235   # 保持している内容の符号を判定する。<br>
00236   #
00237   # @param self
00238   #
00239   # @return 正ならば1を、負ならば-1を、0ならば0
00240   #
00241   # @else
00242   #
00243   # @endif
00244   def sign(self):
00245     if self.tv_sec > 0:
00246       return 1
00247     if self.tv_sec < 0:
00248       return -1
00249     if self.tv_usec > 0:
00250       return 1
00251     if self.tv_usec < 0:
00252       return -1
00253     return 0
00254 
00255   
00256   ##
00257   # @if jp
00258   # @brief 正規化
00259   # @else
00260   # @brief Normalize
00261   # @endif
00262   #
00263   def normalize(self):
00264     global TIMEVALUE_ONE_SECOND_IN_USECS
00265     if self.tv_usec >= TIMEVALUE_ONE_SECOND_IN_USECS:
00266       self.tv_sec += 1
00267       self.tv_usec -= TIMEVALUE_ONE_SECOND_IN_USECS
00268 
00269       while self.tv_usec >= TIMEVALUE_ONE_SECOND_IN_USECS:
00270         self.tv_sec += 1
00271         self.tv_usec -= TIMEVALUE_ONE_SECOND_IN_USECS
00272         
00273     elif self.tv_usec <= -TIMEVALUE_ONE_SECOND_IN_USECS:
00274       self.tv_sec -= 1
00275       self.tv_usec += TIMEVALUE_ONE_SECOND_IN_USECS
00276 
00277       while self.tv_usec <= -TIMEVALUE_ONE_SECOND_IN_USECS:
00278         self.tv_sec -= 1
00279         self.tv_usec += TIMEVALUE_ONE_SECOND_IN_USECS
00280         
00281     
00282     if self.tv_sec >= 1 and self.tv_usec < 0:
00283       self.tv_sec -= 1
00284       self.tv_usec += TIMEVALUE_ONE_SECOND_IN_USECS
00285 
00286     elif self.tv_sec < 0 and self.tv_usec > 0:
00287       self.tv_sec += 1
00288       self.tv_usec -= TIMEVALUE_ONE_SECOND_IN_USECS


openrtm_aist_python
Author(s): Shinji Kurihara
autogenerated on Thu Aug 27 2015 14:17:28