このレッスンでは、データを MyTopic トピック要素に公開できるように、一部のコードを追加します。
このレッスンでは、MyPublisher::publishMyDataWriter を使用してデータを MyTopic に公開します。
データを公開するには、MyTopicStruct のインスタンスを初期化して、その属性を完成させる必要があります。構造体の初期化に関連し、値をそれに追加するコードは、標準 DDS API コードではありません。
使用している DDS 実装 (RTI または OpenSplice) に固有のものです。
コードは、DDSMyTopicStructLib.idl ファイルから生成されたコードに基づいたものにします。
データをトピックに公開できるようにコードを追加するには、以下のようにします。
- 以下の手順で MyPublisher パブリッシャーに publishData 操作を追加します。
- 「MyPublisher」を右クリックして、と選択します。
- 操作の「フィーチャー」ウィンドウを開き、操作を publishData と命名します。
- 「実装」タブで、以下のコードを入力し、「OK」をクリックします。
char buff[32];
for (int i = 1; i <= 10; ++i)
{
OMDelay(1000);
MyTopicStruct myTopicStruct;
#ifndef USE_OSPL_IMPLEMENTATION
MyTopicStruct_initialize(&myTopicStruct;);
#endif
myTopicStruct.myKeyAttribute = i;
myTopicStruct.myLongAttribute = i;
myTopicStruct.myBooleanAttribute = (i % 2);
myTopicStruct.myDoubleAttribute = 1./i;
//Initializing myStringAttribute
sprintf(buff, "message number %d", i);
#ifdef USE_OSPL_IMPLEMENTATION
myTopicStruct.myStringAttribute = DDS::string_dup(buff);
#else //RTI
unsigned int buffLength = strlen(buff);
if (!RTICdrType_copyString(myTopicStruct.myStringAttribute, buff, buffLength + 1))
{
return;
}
#endif
//Initializing myLongSequence
#ifdef USE_OSPL_IMPLEMENTATION
myTopicStruct.myLongSequenceAttribute.length(3);
myTopicStruct.myLongSequenceAttribute[0] = i;
myTopicStruct.myLongSequenceAttribute[1] = i+1;
myTopicStruct.myLongSequenceAttribute[2] = i+2;
#else //RTI
const signed int ar[3] = {i, i+1, i+2};
if (!myTopicStruct.myLongSequenceAttribute.from_array(ar, 3))
{
return;
}
#endif
//publish myTopicStruct
publishMyDataWriter(myTopicStruct);
#ifndef USE_OSPL_IMPLEMENTATION
MyTopicStruct_finalize(&myTopicStruct;);
#endif
}
データによる MyTopicStruct の初期化方法を理解するために、MyTopicStructLib ドメイン参加者フォルダーの下の DefaultConfig フォルダー (例えば、<Rational® Rhapsody® インストール・フォルダー>¥DDSProject3¥MyTopicStructLib¥DefaultConfig) で、DDSMyTopicStructLib.cxx ファイルおよび DDSMyTopicStructLib.h ファイルをいずれかのテキスト・エディターで開きます。これらのファイルは、MyTopicStructLib のビルド・プロセスで DDSMyTopicStructLib.idl ファイルから生成されたものです。DDSMyTopicStructLib.h ファイルを検討すると、MyTopicStruct のインスタンスの初期化と最終処理のためにサンプル・コードで使用する MyTopicStruct_initialize および MyTopicStruct_finalize 関数を確認できます。配列から myLongSequenceAttribute を初期化する from_array 関数は、DDSMyTopicStructLib.h ファイル内のタイプ myLongSequenceAttribute である DDS_LongSeq の定義に関する何かのリサーチを行った後でディスカバーされました。RTI DDS 実装を使用している場合は、
DDSMyTopicStructLib.cxx ファイル内の MyTopicStruct_copy 関数を表示することで、myStringAttribute 属性の初期化のためにこのサンプル・コードで使用する RTICdrType_copyString 関数に対する呼び出しを確認できます。
- publishData 操作を MyPublisher パブリッシャーに追加した後で、以下の手順でそれを呼び出すコードを入力します。
- MyPublishingApplication ドメイン参加者の下で DefaultConfig 構成の「フィーチャー」ウィンドウを開きます。
- 「初期設定」タブの「初期設定コード」フィールドで、以下のコードを追加します。
p_MyPublisher->publishData();
- 「OK」をクリックします。
- MyPublishingApplication ドメイン参加者のコードを生成し、それをビルドします。
- コードを生成するには、とクリックします。再ロードするかどうかを尋ねられたら、「はい」をクリックします。
- アプリケーションをビルドするには、と選択します。