OpenRTM / OpenRTP-aist

OpenRTP-aist: RT-Middleware and OMG RTC based component and system development tools implemented by AIST
Other
1 stars 6 forks source link

独自IDLを使う場合のBuilderの生成するコードの問題 #165

Closed y-masutani closed 5 years ago

y-masutani commented 5 years ago

データポートとサービスポートの両方で同じ独自IDLを指定した場合, #157 の問題に加えて,そのIDLファイルの名前が xxx.idl の場合,xxxSVC_impl.h と xxxSVC_impl.cpp にクラスの宣言や定義が書かれないとい問題に遭遇しています.

データポートで独自IDLを設定した後に,サービスポートのインタフェースで「インタフェース型」を選ぼうとすると,選択肢の中に同じ名前が二つ現れます.それぞれを選択すると,「IDLファイル」欄のパスが切り替わります.一つは,データポートの設定の際に指定したIDLファイル,もう一つは,C:\Users\ユーザ名\AppData\Roaming.openrtp\idl にコピーされた同名のファイルです.前者を選んだ場合に問題が発生しています.

これは既知の問題でしょうか?

ところで,C:\Users\ユーザ名\AppData\Roaming.openrtp\idl にIDLファイルをコピーして使う狙いは何でしょうか?参照しているRTC外部のIDLファイルの名前や中身を変更したつもりでも,コード生成でそれが反映されず,混乱してしまいます.ユーザが指定したIDLを使うだけの方がわかりやすいと思うのですが.

Windowsでmsiでインストールした1.2.0の64bit版を使っています.

n-kawauchi commented 5 years ago

返事が遅くなり、申し訳ございません。 こちらで確認したところ、データポートでは独自IDLのデータ型を選択できましたが、サービスポートではインターフェース型の選択肢に含まれない状況しか確認できませんでした。 OpenRTPは1.2.1としてリリース予定のバイナリを使っております。 この不具合は、2.0.0 にて対応いたします。お手数をおかけして申し訳ございません。

@ga-sakamoto さん この件を下記手順で確認したところ、サービスポートのインターフェース型一覧に含まれませんでした。確認手順で問題がありましたらご指摘頂きたく、よろしくお願いします。

この環境でC++のRTCを生成し、データポートとサービスポートで独自IDLを指定します。データポートは独自IDLのデータ型を選択できますが、サービスポートはインターフェース型の一覧に存在しません。サービスポートタブでIDLパスを指定しているのに、IDLファイルは下記を探しているようです。 C:\Users\ユーザ名\AppData\Roaming\.openrtp\idl このため、正しいIDLファイルのパスに変更しても、上記のパスを見ているようです。 ここに使いたいidlファイルがコピーされて存在しているのに、インターフェース型の選択肢として表示されず、他のIDLファイルの型は表示されている状況です。

よろしくお願いします。

y-masutani commented 5 years ago

応答ありがとうございます.

  • 独自IDLファイルは単独で配置し、そのパスはOpenRTPの「ウィンドウ」→「設定」→「RtcBuilder」で指定

バージョン1.2では,独自IDLのパスは,「データポート」「サービスポート」のそれぞれのタブの「IDLファイル」の欄で指定するのではありませんか?当方では,そのようにして試しています.「ウィンドウ」→「設定」→「RtcBuilder」では指定していません.

Nobu19800 commented 5 years ago

C:\Users\ユーザ名\AppData\Roaming\.openrtp\idlにIDLファイルをコピーする仕組みを採用したのは、一度使用したデータ型やインターフェース型を次回以降に簡単に使用できるようにするためだったはずです。

独自データ型で指定したIDLファイルについては、IDLファイルの欄に指定したファイルを更新後にコード生成するとC:\Users\ユーザ名\AppData\Roaming\.openrtp\idl以下のファイルも更新されるようなので、これは問題ないと思います。(できればデータ型横のReloadボタンを押したタイミングでも更新してほしいですが)

サービスポートのインターフェース型の指定については、C:\Users\ユーザ名\AppData\Roaming\.openrtp\idl以下のパスが表示されること自体がおかしいので修正をお願いします。 @ga-sakamoto さん

またこれはバグだと思いますので、1.2.1で修正をお願いします。 @n-kawauchi さん

n-kawauchi commented 5 years ago

了解しました。修正を待って OpenRTP 1.2.1 を生成します。

y-masutani commented 5 years ago

データポートとサービスポートの両方で同じ独自IDLを指定した場合, #157 の問題に加えて,そのIDLファイルの名前が xxx.idl の場合,xxxSVC_impl.h と xxxSVC_impl.cpp にクラスの宣言や定義が書かれないとい問題に遭遇しています.

という問題は,そちらでは再現しないでしょうか?

Nobu19800 commented 5 years ago

こちらの環境でも同じ動作です。修正をお願いします。 @ga-sakamoto さん

y-masutani commented 5 years ago

再現しましたか! 修正をよろしくお願いいたします.

ga-sakamoto commented 5 years ago

申し訳ございません.こちらの環境で確認させて頂いたのですが,現象を再現する事ができませんでした.ご使用になられたIDLファイルなど,より詳細な情報を頂けませんでしょうか? (最新版ではなく,1.2.x版の問題かと思い,そちらでも試してみたのですが再現できませんでした)

また,今回の修正内容についてもご確認させてください.

サービスポートのインターフェース型の指定については、C:\Users\ユーザ名\AppData\Roaming.openrtp\idl以下のパスが表示されること自体がおかしいので修正をお願いします。

こちらはサービスポートのインターフェース型を検索する範囲から,ユーザディレクトリを外すように修正する,という事でしょうか?

Nobu19800 commented 5 years ago

こちらの環境で確認させて頂いたのですが,現象を再現する事ができませんでした.ご使用になられたIDLファイルなど,より詳細な情報を頂けませんでしょうか?

問題になるのは独自データ型を使うかどうかではなく、使用するIDLファイルが既にユーザーディレクトリにコピーされているかどうかだと思います。

  1. 以下のIDLファイルのSimpleService::MyServiceをインターフェース型に指定してコード生成する。(この時点でユーザーディレクトリにファイルがコピーされる)
  1. 新規にプロジェクトを作成。サービスポートの設定でIDLファイルに任意のディレクトリに配置したMyService.idlを指定する。

この手順で再現できるはずです。

こちらはサービスポートのインターフェース型を検索する範囲から,ユーザディレクトリを外すように修正する,という事でしょうか?

違います。データポートの場合にはユーザディレクトリのIDLファイルのデータ型を使う場合にはIDLファイルの欄が空欄になるようなので、サービスポートでもそのようにしてほしいという意味です。 IDLファイルの欄に任意のパスを入力している場合について、ユーザーディレクトリに同じIDLファイルがある場合は、IDLファイルの欄に指定したファイルの定義を優先してコード生成時にユーザーディレクトリのIDLファイルは上書きするようにしてください。

ga-sakamoto commented 5 years ago

何度も申し訳ございません. ご連絡頂きましたIDLファイル,手順で再度試してみたのですが,現象を再現する事ができませんでした. また,発生している現象の確認なのですが,上記の手順で実行した場合,MyServiceSVC_impl.h,MyServiceSVC_impl.cppにclass SimpleService_MyServiceSVC_implという記述がない状態で出力されてしまうのでしょうか?

後半のお話につきましては,次回のお打ち合わせ時に,安藤さんも含めてご相談させて頂けませんでしょうか? (指定したディレクトリとユーザディレクトリに同じIDLファイルが存在した場合,インターフェース型の選択部分で同じ名称が表示されると思います.この場合,それぞれがどのIDLファイル由来なのかを判断するために,ユーザディレクトリも表示された方がわかりやすいと思うのですが・・・)

Nobu19800 commented 5 years ago

申し訳ありません。説明が間違っていました。 記述がない状態のファイルを出力するためには独自データ型の設定が必要なようです。

以下のIDLファイルを使用して独自データ型、サービスポートを設定すると現象が再現するはずです。

(指定したディレクトリとユーザディレクトリに同じIDLファイルが存在した場合,インターフェース型の選択部分で同じ名称が表示されると思います.この場合,それぞれがどのIDLファイル由来なのかを判断するために,ユーザディレクトリも表示された方がわかりやすいと思うのですが・・・)

ユーザーがIDLファイルを指定したのに、指定のIDLファイルではなくユーザーディレクトリのIDLファイルを使いたいという状況が存在するのか疑問です。 IDLファイルを指定した場合は、指定のIDLファイルで定義したインターフェース型だけ表示するのが一番混乱しないかもしれません。

n-kawauchi commented 5 years ago

自己レスです

当初の動作確認の際に使用したIDLファイルですが、データタイプしか定義されていないものを使っておりました。申し訳ございません。

@Nobu19800 さんが用意してくれた MyService2.idl を使うことで、升谷先生の不具合を再現できました。お騒がせいたしました。

n-ando commented 5 years ago

@ga-sakamoto さん、ユーザがあえてidlを指定した場合には、指定されたidlのみインターフェースを表示するように変更いただけないでしょうか。よろしくお願いします。