ここでは出力ポートを持つコンポーネントと,入力ポートを持つコンポーネントの通信を行ってみます.
| Programming language selection | C++(Windows) | |
| モジュール定義 | Module name | ConsoleIn |
| Module description | Console In Component | |
| Module version | 0.0.1 | |
| Module vender | あなたの名前 | |
| Module category | TEST | |
| Component type | DataFlowComponent | |
| Component's activity type | PERIODIC | |
| Number of maximum instance | 1 | |
| OutPort definition | 名前 | out |
| タイプ | TimedLong | |
| Output directory | 適当なフォルダを指定してください.(後述するConsoleOutと同じフォルダが良いでしょう) | |
onExecute関数のコメントアウトを外します.
onExecute関数のコメントアウトを外して編集します.
m_outOutというOutPortのオブジェクトがすでに宣言されて,m_outというTimedLong型の変数と関連付けられていますので,m_outにデータを書きこみ,m_outOutでデータをネットワークに送り出す,というのが手順です.
return RTC::RTC_OK;
}
*/
RTC::ReturnCode_t ConsoleIn::onExecute(RTC::UniqueId ec_id)
{
std::cout << "Please input number:" << std::endl;
std::cin >> m_out.data;
m_outOut.write();
return RTC::RTC_OK;
}
/*
RTC::ReturnCode_t ConsoleIn::onAborting(RTC::UniqueId ec_id)
| Programming language selection | C++(Windows) | |
| モジュール定義 | Module name | ConsoleOut |
| Module description | Console Out Component | |
| Module version | 0.0.1 | |
| Module vender | あなたの名前 | |
| Module category | TEST | |
| Component type | DataFlowComponent | |
| Component's activity type | PERIODIC | |
| Number of maximum instance | 1 | |
| InPort definition | 名前 | in |
| タイプ | TimedLong | |
| Output directory | 適当なフォルダを指定してください.(上記のConsoleInと同じフォルダが良いと思います) | |
TimedLong: Long型(32ビット整数)のデータのようです.
後で出力ポートを持つコンポーネントと同時に実行する必要があるので,ConsoleInのプロジェクトを開いたときに出来たソリューションに,このConsoleOutのプロジェクトを追加すると便利でしょう.
onExecute関数のコメントアウトを外します.
onExecute関数を編集します.InPort変数として宣言されているm_inInについて,データ更新があった場合はネットワークからの読み込みを行い,読み込んだデータを取り出し表示を行います.
return RTC::RTC_OK;
}
*/
RTC::ReturnCode_t ConsoleOut::onExecute(RTC::UniqueId ec_id)
{
if (m_inIn.isNew())
{
m_inIn.read();
std::cout << "Received: " << m_in.data << std::endl;
}
return RTC::RTC_OK;
}
/*
RTC::ReturnCode_t ConsoleOut::onAborting(RTC::UniqueId ec_id)
{
ここでrtc.confを設定し(corba.nameservers:の設定のみで十分.localhost:2809).Nameserverを実行してから,ConsoleIn,ConsoleOutの両方を実行します.VC++のプロジェクトエクスプローラーで,ConsoleInプロジェクトの上で右クリックし,デバッグで「新しいインスタンスを生成」で実行できます.
これで両方のコンソールがRtcLinkから見ることが出来るはずです.
次に両方のコンポーネントの接続を行います.
ファイル→「Open New System Editor」を選択し,SystemDiagramビューを開きます.このビューに両方のコンポーネントをドラッグ&ドロップすると,コンポーネントがビジュアル化されます.

次に二つのコンポーネントについている凸と凹をドラッグ&ドロップで接続します.接続した瞬間にダイアログが立ち上がりますが,これはOKを押してしまってかまいません.

この後に両方のコンポーネントをアクティブ化すると,ConsoleInコンポーネントのコンソール画面に"Please input number"の文字が出ます.
数字を入力して,Enterを入力すると,ConsoleOutの方に"Received:[あなたが入力した数字]"が表示されます.
いかがですか?これでコンポーネント同士のプログラム接続が可能になりました.ようやくRTCの存在価値に近づいてきた気がしませんか?
今回作成したプログラム ConsoleIO.zip (ver. 0.4.1)
ConsoleIO042.zip (ver. 0.4.2)
次回からはコンポーネントをRtcLinkでアクティブ化&接続するのではなく,プログラムから操作が出来るように練習しましょう.