入力コンポーネントと出力コンポーネントの通信

ここでは出力ポートを持つコンポーネントと,入力ポートを持つコンポーネントの通信を行ってみます.

出力ポートを持つコンポーネント

RtcTemplateでテンプレートを生成

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関数のコメントアウトを外します.

CPPファイルの編集

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)

入力ポートを持つコンポーネント

RtcTemplateでテンプレートを生成

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関数のコメントアウトを外します.

CPPファイルの編集

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から見ることが出来るはずです.

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でアクティブ化&接続するのではなく,プログラムから操作が出来るように練習しましょう.


RTミドルウェア入門