NECシステムテクノロジー 宇田様
産総研 安藤です
いつもお世話になっております。
サービスポートのインターフェースに継承を用いたいとのことですが、
今のところrtc-template自体は継承にはきちんと対応できていません。
従って、BaseService.idlはMyService.idlの中で継承およびincludeするだけでは
生成するコードには反映されません
少なくとも、BaseServiceのスタブとスケルトン(実装SVC_implはいらない)を生成
しないといけないので、以下のように--consumer-idlオプションに指定してください。
(この際--consumerはなにも指定しない。)
--service-idl=MyService.idl --consumer-idl=BaseService.idl
こうすると、BaseServiceのスタブとスケルトンが生成されますので、
makeすると、BaseService.hhも生成されるはずです。
ただし、MyService.hhにおいてBaseService.hhが<>でincludeされているので、
(これは、omniORBが生成するファイルなので、本来修正すべきではない。。。)
以下のようにMakefileを修正して、コンパイル時のインクルードサーチパスに
カレントディレクトリを追加しなければなりません。
CXXFLAGS = `rtm-config --cflags` -I.
一応、これでBaseServiceを継承したMyServiceをプロバイダとして持つ
コンポーネントが作成できるはずです。
MyServiceSVC_implに、MyServiceとBaseServiceのオペレーションを
実装すれば、希望のサービスを持ったコンポーネントが作成できるはずです。
申し訳ございませんが、現在出張中のため詳しくは検証できる環境がなく、
抜けがあるかもしれませんが、とりあえずこれで試していただいて、
問題がありましたらおしらせください。
また、うまくいった場合も今後の参考になりますので
メーリングリストにて紹介していただければと存じます。
よろしくお願いいたします。
> OpenRTM-aist-0.4.0のサービスポートのIDL構成についてお伺いします。
>
> 以下のように、複数種類のサービスが共通のベースサービスを取り込む
> よう、IDLに継承関係を持たせたいのですが、rtc-template はこのよう
> なIDLに対応されていますでしょうか?
>
>
> MyService.idl
> ┌──────────────────┐
> │#include "BaseService.idl" │
> │typedef sequence EchoList; │
> │typedef sequence ValueList; │
> │interface MyService : BaseService │
> │{ │
> │ string echo(in string msg); │
> │ EchoList get_echo_history(); │
> │ void set_value(in float value); │
> │ float get_value(); │
> │ ValueList get_value_history(); │
> │}; │
> └──────────────────┘
>
> BaseService.idl
> ┌──────────────────┐
> │interface BaseService │
> │{ │
> │ void base_service0(); │
> │ void base_service1(); │
> │ ... │
> │} │
> └──────────────────┘
>
>
> 単純に --service-idl および --consumer-idl スイッチで MyService.idl
> のみを指定し、--idl-include スイッチを BaseService.idl のフォルダに
> 設定すると、rtc-template は通るものの、コンパイル時に BaseService.hh
> が見つからない旨のエラーになるのですが、何か不足しているスイッチ等は
> ございますでしょうか?
>
いつも御世話になります。宇田@NECシステムテクノロジーです
OpenRTM-aist-0.4.0のサービスポートのIDL構成についてお伺いします。
以下のように、複数種類のサービスが共通のベースサービスを取り込む
よう、IDLに継承関係を持たせたいのですが、rtc-template はこのよう
なIDLに対応されていますでしょうか?
MyService.idl
┌──────────────────┐
│#include "BaseService.idl" │
│typedef sequence EchoList; │
│typedef sequence ValueList; │
│interface MyService : BaseService │
│{ │
│ string echo(in string msg); │
│ EchoList get_echo_history(); │
│ void set_value(in float value); │
│ float get_value(); │
│ ValueList get_value_history(); │
│}; │
└──────────────────┘
BaseService.idl
┌──────────────────┐
│interface BaseService │
│{ │
│ void base_service0(); │
│ void base_service1(); │
│ ... │
│} │
└──────────────────┘
単純に --service-idl および --consumer-idl スイッチで MyService.idl
のみを指定し、--idl-include スイッチを BaseService.idl のフォルダに
設定すると、rtc-template は通るものの、コンパイル時に BaseService.hh
が見つからない旨のエラーになるのですが、何か不足しているスイッチ等は
ございますでしょうか?