使用するIDLファイルを作成します。 OpenRTM-aistのサンプルコンポーネントに付属しているMyService.idlを使用します。 以下のコードをコピーして使用する場合は、行頭のスペースを削除してください。
module SimpleService {
typedef sequence<string> EchoList;
typedef sequence<float> ValueList;
interface MyService
{
string echo(in string msg);
EchoList get_echo_history();
void set_value(in float value);
float get_value();
ValueList get_value_history();
};
};RTC Builderでモジュール名がMyServiceConsumerのRTCを作成してください。 アクティビティはonExecuteを有効にしてください。
次に、作成したIDLファイル(MyService.idl)をRTC Builderのパッケージエクスプローラーから、MyServiceConsumerのidlフォルダにドラッグアンドドロップして、ファイルをコピーします。
サービスポートの設定で、Add Portボタンを押してサービスポート、Add Interfaceボタンを押してサービスインターフェースを追加します。
今回は、ポート名をmyservice0、インターフェース名をMyService、方向をRequired、インターフェース型をSimpleService::MyServiceに設定します。
RTCの仕様をまとめると、以下のようになっています。
| コンポーネント名 | MyServiceConsumer |
| 言語 | C++ |
| アクティビティ | onInitialize、onExecute |
| Service | |
| ポート名 | myservice0 |
| Interface | |
| インターフェース名 | MyService |
| 方向 | Required |
| インターフェース型 | SimpleService::MyService |
RTC Builderでコード生成して、onExecute関数を以下のように編集してください。
RTC::ReturnCode_t MyServiceConsumer::onExecute(RTC::UniqueId /*ec_id*/)
{
try
{
std::cout << m_MyService._ptr()->echo("test") << std::endl;
}
catch (...)
{
}
return RTC::RTC_OK;
}IDLファイルで定義したMyServiceインターフェースのecho関数を呼び出しています。 サービスポートを接続すると、Provided側で実装したecho関数が呼ばれます。 Provided側のRTCがアクティブ状態ではない場合、echo関数は例外を投げるためtry~catchで例外処理しています。例外処理をしなかった場合、RTCがError状態に遷移することがあります。
後はビルドして実行ファイルを生成してください。
RTC Builderで以下の仕様のRTCを作成してください。 インターフェースの方向はProvidedに設定してください。
| コンポーネント名 | MyServiceProvider |
| 言語 | C++ |
| アクティビティ | onInitialize |
| Service | |
| ポート名 | myservice0 |
| Interface | |
| インターフェース名 | MyService |
| 方向 | Provided |
| インターフェース型 | SimpleService::MyService |
コード生成したら、MyServiceSVC_impl.cppのSimpleService_MyServiceSVC_impl::echo関数を編集します。
#include <iostream>
/*
* Methods corresponding to IDL attributes and operations
*/
char* SimpleService_MyServiceSVC_impl::echo(const char* msg)
{
std::cout << msg << std::endl;
return CORBA::string_dup(msg);
}MyServiceConsumerのonExecute関数でecho関数を呼びましたが、サービスポート接続時にはSimpleService_MyServiceSVC_impl::echo関数が呼ばれます。 戻り値の型が文字列(char*)の場合、CORBA::string_dup関数でmsgからメモリをコピーする必要があります。
編集が完了したらビルドしてください。
以下のようにRT System Editorでポートを接続して、RTCをアクティブ化してください。
ウィンドウにtestと連続して表示されていたら正常に動作しています。 これはRequired側ではProvided側のecho関数を呼び出して文字列を渡しています。 Provided側では、受け取った文字列を標準出力後に、Required側に返しています。 最後にRequired側で返された文字列を標準出力しています。
文字列以外のデータを利用する方法、Python、Java、Luaでの使用方法は以下のサンプルコンポーネントを参考にしてください。