Closed y-masutani closed 3 years ago
ご指摘ありがとうございます。調査してみます。
コメントの内容の通りの動作なので、動作が変わったのが仕様変更によるものなのかバグによるものなのかが問題だと思います。
原因がわかりました。修正してPRいたしました。#419 1.2のブランチにもコミットしてありますので1.2.1では修正されます。
https://github.com/OpenRTM/OpenRTM-aist/pull/419
申し訳ございませんが、このバグに関しては簡単な Workaround はありません。 きれいなやり方ではありませんが、RTC内にonActivateの戻り値を状態変数として持たせて、onExecuteやonDeactivateでそれを見てスキップするくらいしか回避方法がありません。
対応ありがとうございます.根幹のバグなのでかなり驚いています. 1.2.1はいつ頃リリースされますか?
対処法ですが,以下のようにするということでしょうか?
RTC::ReturnCode_t Hoge::onActivated(RTC::UniqueId ec_id)
{
m_rtcError = false;
デバイスのオープン
if (オープン失敗) {
m_rtcError = true;
return RTC::RTC_ERROR;
}
略
}
RTC::ReturnCode_t Hoge::onDeactivated(RTC::UniqueId ec_id)
{
if (m_rtcError) return RTC::RTC_ERROR;
略
}
RTC::ReturnCode_t Hoge::onExecute(RTC::UniqueId ec_id)
{
if (m_rtcError) return RTC::RTC_ERROR;
略
}
ご提示のコードの通りかと思います。 ただ、onDeactivate() の部分は、OMG RTC Specificationで見る限り、onActivatedでエラーになっても呼ばれるべきかと思いますので、スキップするのは、onExecuteと(使っていれば)onStateUpdate()だけでよろしいかと思います。
ECに関しては、Choreonoidなどで使用する外部トリガ型ECを導入するにあたって、ECの実装コードの構造がいまいちで、すべてのECが外部トリガ型のIDLインターフェースを継承する形で実装するしかありませんでした。1.2に変更するにあたり、ECの拡張性を上げるために内部の構造をすっかり入れ替えたのですが、この変更のために、今回の問題が発生したようです。(状態遷移する場合でも、その状態に定義されているentry/do/exitの実行を一通り実行してから、次の状態に移るというのがデフォルトで、それ以外の振る舞いをする場合は明示的に処理を記述する必要がある)
ちなみに、1.2.1のリリース予定は未定ですが、このバグは致命的なのでできるだけ早くリリースしたいと考えています。
対応済みなのでcloseします。
1.2.0でRTCのonActivated()におけるエラー処理がうまくいかないため,調べていたところ,onActivated() でreturn RTC::RTC_ERROR;しても,onExecute()が1回実行されていることがわかりました.1.1.2で同じことを確認しましたが,そのようなことはありませんでした.
これは,私の環境の問題でしょうか?何かを間違っていますか?
Windows 10にOpenRTM-aist-1.2.0-RELEASE_x86_64.msiをインストールして,VS2015でC++でプログラムしています.
onActivated()でデバイスが問題があった場合は,エラー状態に遷移させたいのに,onEecute()が実行されプログラムが異常終了するという悲しい目に遭っています.