プロジェクト

全般

プロフィール

バグ #3649

完了

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

n-miyamoto さんが約8年前に追加. ほぼ8年前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
-
開始日:
2016/10/04
期日:
2016/10/31
進捗率:

100%

予定工数:

説明

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

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

n-miyamoto さんが約8年前に更新

  • 担当者n-miyamoto にセット
  • 進捗率0 から 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_

n-miyamoto さんがほぼ8年前に更新

  • ステータス新規 から 解決 に変更
  • 進捗率50 から 100 に変更

n-ando さんがほぼ8年前に更新

  • ステータス解決 から 終了 に変更

他の形式にエクスポート: Atom PDF