< Previous | Next >

Lesson 12: Add code to receive updates about your topic

In this lesson, you add code to receive updates about your MyTopic topic element.
Note: Like the code for the publishData operation, the following code contains parts that are DDS-implementation-specific.
  1. To receive updates about MyTopic, for the MyDataReaderListener class, open the Features window for the on_data_available operation (under the SubscriberPkg package), and on the Implementation tab, add the following code, and then click OK.
    #ifdef USE_OSPL_IMPLEMENTATION
    MyTopicStructDataReader* myTopicStructDataReader = dynamic_cast<MyTopicStructDataReader*>(reader);
    if (myTopicStructDataReader != NULL)
    {
    	DDS::SampleInfoSeq info;
    	DDS::ReturnCode_t retcode;
    	MyTopicStructSeq_var myTopicStruct = new MyTopicStructSeq;	
    	for(;;)
    	{
    		//MyTopicStruct_initialize(&myTopicStruct);
    		//retcode = myTopicStructDataReader->take_next_sample(myTopicStruct, info);				
    		retcode = myTopicStructDataReader->take(myTopicStruct, info, 1, DDS::ANY_SAMPLE_STATE, DDS::ANY_VIEW_STATE, DDS::ANY_INSTANCE_STATE);
    		if (retcode == DDS::RETCODE_NO_DATA)
    		{
    			break;
    		} 
    		else if (retcode != DDS::RETCODE_OK) 
    		{
    			printf("take_next_sample returned error %d\n", retcode);
                return;		
       		}
       		if (info[0].valid_data)
       		{   						
    			printf("myKeyAttribute: %ld, myLongAttribute: %ld, myBooleanAttribute: %d, myDoubleAttribute: %.3f, myStringAttribute: %s, myLongSequence: {%ld, %ld, %ld}\n", myTopicStruct[0].myKeyAttribute, myTopicStruct[0].myLongAttribute, myTopicStruct[0].myBooleanAttribute, myTopicStruct[0].myDoubleAttribute, myTopicStruct[0].myStringAttribute.m_ptr, myTopicStruct[0].myLongSequenceAttribute[0], myTopicStruct[0].myLongSequenceAttribute[1], myTopicStruct[0].myLongSequenceAttribute[2]);
    			break;
       		}		
       	}
    }
    #else //RTI
    MyTopicStructDataReader* myTopicStructDataReader = dynamic_cast<MyTopicStructDataReader*>(reader);
    if (myTopicStructDataReader != NULL)
    {
    	DDS::SampleInfo info;
    	DDS::ReturnCode_t retcode;
    	MyTopicStruct myTopicStruct;
    	for(;;)
    	{
    		MyTopicStruct_initialize(&myTopicStruct);
    		retcode = myTopicStructDataReader->take_next_sample(myTopicStruct, info);				
    		if (retcode == DDS::RETCODE_NO_DATA)
    		{
    			break;
    		} 
    		else if (retcode != DDS::RETCODE_OK) 
    		{
    			printf("take_next_sample returned error %d\n", retcode);
                return;		
       		}
       		if (info.valid_data)
       		{   			
    			//Copy the sequence elements to a local array.
    			signed int ar[3];
    			myTopicStruct.myLongSequenceAttribute.to_array(ar, 3);			
    			printf("myKeyAttribute: %ld, myLongAttribute: %ld, myBooleanAttribute: %d, myDoubleAttribute: %.3f, myStringAttribute: %s, myLongSequence: {%ld, %ld, %ld}\n", myTopicStruct.myKeyAttribute, myTopicStruct.myLongAttribute, myTopicStruct.myBooleanAttribute, myTopicStruct.myDoubleAttribute, myTopicStruct.myStringAttribute, ar[0], ar[1], ar[2]);
       		}
       		MyTopicStruct_finalize(&myTopicStruct);
       	}
    }
    #endif
  2. Generate code for MySubscribingApplication, build it, and then run it:
    1. Select Code > Generate > DefaultConfig
    2. Select Code > Build > BuildMySubscribingApplication.exe
    3. Select Code > Run MySubscribingApplication.exe
      Note: If you have a firewall installed, you might get a warning that MySubscribingApplication.exe is attempting to establish an Internet connection. Approve this attempt. Do the same for MyPublishingApplication.exe. On your first run of MyPublishingApplication.exe, because of the request to approve the connection, you might miss a few messages that the publisher sent and the output might be smaller than the sample output shown in this lesson.
  3. Set the active component to MyPublishingApplication: Right-click the DefaultConfig configuration under the PublishingPkg package and select Set as Active Configuration.
  4. Run MyPublishingApplication. The output for MySubscribingApplication is as follows.
    Note: To fit in this tutorial topic, the following sample output is formatted differently than how it displays when you do this lesson. The sample output has been formatted by inserting line breaks so that you can see the output for each line. These line breaks do not appear in your output when you do this tutorial. Each line begins with myKeyAttribute and ends with myLongSequence
    ready to receive data
    myKeyAttribute: 1, myLongAttribute: 1, myBooleanAttribute: 1, 
    myDoubleAttribute: 1.000, myStringAttribute: message number 1, 
    myLongSequence: {1, 2, 3}
    myKeyAttribute: 2, myLongAttribute: 2, myBooleanAttribute: 0, 
    myDoubleAttribute: 0.500, myStringAttribute: message number 2, 
    myLongSequence: {2, 3, 4}
    myKeyAttribute: 3, myLongAttribute: 3, myBooleanAttribute: 1, 
    myDoubleAttribute: 0.333, myStringAttribute: message number 3, 
    myLongSequence: {3, 4, 5}
    myKeyAttribute: 4, myLongAttribute: 4, myBooleanAttribute: 0, 
    myDoubleAttribute: 0.250, myStringAttribute: message number 4, 
    myLongSequence: {4, 5, 6}
    myKeyAttribute: 5, myLongAttribute: 5, myBooleanAttribute: 1, 
    myDoubleAttribute: 0.200, myStringAttribute: message number 5, 
    myLongSequence: {5, 6, 7}
    myKeyAttribute: 6, myLongAttribute: 6, myBooleanAttribute: 0, 
    myDoubleAttribute: 0.167, myStringAttribute: message number 6, 
    myLongSequence: {6, 7, 8}
    myKeyAttribute: 7, myLongAttribute: 7, myBooleanAttribute: 1, 
    myDoubleAttribute: 0.143, myStringAttribute: message number 7, 
    myLongSequence: {7, 8, 9}
    myKeyAttribute: 8, myLongAttribute: 8, myBooleanAttribute: 0, 
    myDoubleAttribute: 0.125, myStringAttribute: message number 8, 
    myLongSequence: {8, 9, 10}
    myKeyAttribute: 9, myLongAttribute: 9, myBooleanAttribute: 1, 
    myDoubleAttribute: 0.111, myStringAttribute: message number 9, 
    myLongSequence: {9, 10, 11}
    myKeyAttribute: 10, myLongAttribute: 10, myBooleanAttribute: 0, 
    myDoubleAttribute: 0.100, myStringAttribute: message number 10, 
    myLongSequence: {10, 11, 12}

Lesson checkpoint

In this lesson, you learned how to add code to receive updates on your MyTopic topic element.
In the next lesson, you will filter the updated data by using a content-filtered topic.
< Previous | Next >

Feedback