Project

General

Profile

バグ #3649

onRateChangedコールバックが呼び出されない問題

Added by n-miyamoto over 6 years ago. Updated about 6 years ago.

Status:
終了
Priority:
通常
Assignee:
Target version:
-
Start date:
10/04/2016
Due date:
10/31/2016
% Done:

100%

Estimated time:

Description

Python版のver.1.1.1以降で実行周期を変更してもonRateChangedコールバックが呼び出されていない問題の調査、修正を行う。

補足:
C++版に関してもtrunkのソースコードはPython版と同じ実装なのでonRateChangedコールバックが呼び出されない問題が発生している。

Associated revisions

Revision 721 (diff)
Added by miyamoto over 6 years ago

[compat,bugfix] refs #3649

History

#1 Updated by n-miyamoto over 6 years ago

  • Assignee set to n-miyamoto
  • % Done changed from 0 to 50

onRateChanged関数内にprint文を書いてRTCの実行周期を変更してみたのですが何も表示されませんでした。
on_rate_changed関数がどこかで呼び出される必要があるとは思うのですが、調べた限りではどこでも呼び出されていません。
以前のバージョンではPeriodicExecutionContextのsetRate関数内で呼び出しています。

  def set_rate(self, rate):
    self._rtcout.RTC_TRACE("set_rate(%f)", rate)
    if rate > 0.0:
      self._profile.rate = rate
      self._usec = long(1000000/rate)
      if self._usec == 0:
        self._nowait = True

      for comp in self._comps:
        comp._sm.on_rate_changed()
      return RTC.RTC_OK
    return RTC.BAD_PARAMETER

現在の実装ではsetRate関数内でExecutionContextBaseクラスのsetRate関数を呼び出している。

解決方法としては、まずExecutionContextWorkerクラスに以下のonRateChanged関数を追加する。

  #
  # @if jp
  # @brief ExecutionContext の実行周期変更
  #
  # ExecutionContext の実行周期を変更した際にRTCのonRateChangedコールバックを呼び出す
  #
  # @return ReturnCode_t 型のリターンコード
  #
  # @else
  #
  # @brief 
  #
  # @return The return code of ReturnCode_t type
  #
  # @endif
  # RTC::ReturnCode_t stop(void);
  def onRateChanged(self):
    self._rtcout.RTC_TRACE("onRateChanged()")
    guard = OpenRTM_aist.ScopedLock(self._mutex)
    ret_ = RTC.RTC_OK
    for comp in self._comps:
      state = comp.onRateChanged()
      if state != RTC.RTC_OK:
        ret_ = state
    del guard
    return ret_

そしてExecutionContextBaseクラスのsetRate関数でonRateChanged関数を呼び出せばRTCのコールバックも呼び出される。

  def setRate(self, rate):
    self._rtcout.RTC_TRACE("setRate(%f)", rate)
    ret_ = self._profile.setRate(self.onSettingRate(rate))
    if ret_ != RTC.RTC_OK:
      self._rtcout.RTC_ERROR("Setting execution rate failed. %f", rate)
      return ret_

    ret_ = self.onSetRate(rate)
    if ret_ != RTC.RTC_OK:
      self._rtcout.RTC_ERROR("onSetRate(%f) failed.", rate)
      return ret_

    ret_ = self._worker.onRateChanged()
    if ret_ != RTC.RTC_OK:
      self._rtcout.RTC_ERROR("onSetRate(%f) failed.", rate)
      return ret_

    self._rtcout.RTC_INFO("setRate(%f) done", rate)
    return ret_

#2 Updated by n-miyamoto about 6 years ago

  • Status changed from 新規 to 解決
  • % Done changed from 50 to 100

#3 Updated by n-ando about 6 years ago

  • Status changed from 解決 to 終了

Also available in: Atom PDF