CoreDX DDS Hello World Example in C#
Here is a CoreDX DDS version of the typical "Hello World" application.
This example consists of two applications: one application that publishes a simple string message Topic (the data contains the string "hello world!"); and one application that subscribes to this topic.
The source code presented here is the 'C#' programming language version of the 'hello world' applications. It can interoperate with 'hello world' applications written in other languages, or running on different hardware platforms.
file: hello.ddl
struct StringMsg { string msg; };
file: hello_pub.cs
/**************************************************************** * * file: hello_pub.cs * desc: Provides a simple C# 'hello world' DDS publisher. * This publishing application will send data * to the example 'hello world' subscribing * application (hello_sub). * **************************************************************** * * Coypright(C) 2009-2011 Twin Oaks Computing, Inc * All rights reserved. Castle Rock, CO 80108 * ***************************************************************** * * This file is provided by Twin Oaks Computing, Inc * as an example. It is provided in the hope that it will be * useful but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. TOC Inc assumes no liability or responsibilty for * the use of this information for any purpose. * ****************************************************************/ using System; using System.Runtime.InteropServices; using System.Threading; using System.Collections.Generic; using com.toc.coredx.DDS; public class hello_pub { public static void Main() { System.Console.WriteLine("STARTING -------------------------"); DomainParticipantFactory dpf = DomainParticipantFactory.get_instance(); DomainParticipant dp = null; System.Console.WriteLine("CREATE PARTICIPANT ---------------"); dp = dpf.create_participant(0, /* domain Id */ DDS.PARTICIPANT_QOS_DEFAULT, /* default qos */ null, /* no listener */ 0); System.Console.WriteLine("REGISTERING TYPE -----------------"); ReturnCode_t retval = StringMsgTypeSupport.register_type(dp, null); System.Console.WriteLine("CREATE TOPIC ---------------------"); Topic top = dp.create_topic("helloTopic", StringMsgTypeSupport.get_type_name(), null, // default qos null, 0); // no listener System.Console.WriteLine("CREATE PUBLISHER -----------------"); PublisherQos pub_qos = null; PublisherListener pub_listener = null; Publisher pub = dp.create_publisher(pub_qos, pub_listener, 0); System.Console.WriteLine("CREATE DATAWRITER ----------------"); DataWriterQos dw_qos = new DataWriterQos(); pub.get_default_datawriter_qos(dw_qos); DataWriterListener dw_listener = null; StringMsgDataWriter dw = (StringMsgDataWriter) pub.create_datawriter(top, dw_qos, dw_listener, 0); Thread.Sleep(500); while ( true ) { StringMsg data = new StringMsg(); data.msg = "Hello WORLD from C#!"; System.Console.WriteLine("WRITE SAMPLE. "); /* DDS.HANDLE_NIL says datawriter should compute handle */ retval = dw.write ( data, DDS.HANDLE_NIL ); if ( retval != ReturnCode_t.RETCODE_OK ) System.Console.WriteLine( " ==== DDS_DataWriter_write() error... "); Thread.Sleep(1000); // 1 second sleep } } };
file: hello_sub.cs
/**************************************************************** * * file: hello_sub.cs * desc: Provides a simple C# 'hello world' DDS subscriber. * This publishing application will send data * to the example 'hello world' subscribing * application. * **************************************************************** * * Coypright(C) 2009-2011 Twin Oaks Computing, Inc * All rights reserved. Castle Rock, CO 80108 * ***************************************************************** * * This file is provided by Twin Oaks Computing, Inc * as an example. It is provided in the hope that it will be * useful but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. TOC Inc assumes no liability or responsibilty for * the use of this information for any purpose. * ****************************************************************/ using System; using System.Runtime.InteropServices; using System.Threading; using System.Collections.Generic; using com.toc.coredx.DDS; public class hello_sub { class TestDataReaderListener : DataReaderListener { public TestDataReaderListener() { this.on_requested_deadline_missed = requested_deadline_missed; this.on_requested_incompatible_qos = requested_incompatible_qos; this.on_sample_rejected = sample_rejected; this.on_liveliness_changed = liveliness_changed; this.on_data_available = data_available; this.on_subscription_matched = subscription_matched; this.on_sample_lost = sample_lost; } public void requested_deadline_missed(DataReader dr, RequestedDeadlineMissedStatus status) { System.Console.WriteLine(" @@@@@@@@@@@ REQUESTED DEADLINE MISSED @@@@@"); System.Console.WriteLine(" @@@@@@@@@@@ @@@@@" ); System.Console.WriteLine(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); } public void requested_incompatible_qos(DataReader dr, RequestedIncompatibleQosStatus status) { System.Console.WriteLine(" @@@@@@@@@@@ REQUESTED INCOMPAT QOS @@@@@@@@"); System.Console.WriteLine(" @@@@@@@@@@@ dr = " + dr); System.Console.WriteLine(" @@@@@@@@@@@ @@@@@@@@" ); System.Console.WriteLine(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); } public void sample_rejected(DataReader dr, SampleRejectedStatus status) { } public void liveliness_changed(DataReader dr, LivelinessChangedStatus status) { TopicDescription td = dr.get_topicdescription(); System.Console.WriteLine(" @@@@@@@@@@@ LIVELINESS CHANGED @@@@@@@@@@"); System.Console.WriteLine(" @@@@@@@@@@@ topic = " + td.get_name() + " (type: " + td.get_type_name() + ")"); System.Console.WriteLine(" @@@@@@@@@@@ change = " + status.alive_count_change); System.Console.WriteLine(" @@@@@@@@@@@ current = " + status.alive_count); System.Console.WriteLine(" @@@@@@@@@@@ @@@@@@@@@@" ); System.Console.WriteLine(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); } public void subscription_matched(DataReader dr, SubscriptionMatchedStatus status) { TopicDescription td = dr.get_topicdescription(); System.Console.WriteLine(" @@@@@@@@@@@ SUBSCRIPTION MATCHED @@@@@@@@@@"); System.Console.WriteLine(" @@@@@@@@@@@ topic = " + td.get_name() + " (type: " + td.get_type_name() + ")"); System.Console.WriteLine(" @@@@@@@@@@@ current = " + status.current_count); System.Console.WriteLine(" @@@@@@@@@@@ @@@@@@@@@@" ); System.Console.WriteLine(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); } public void sample_lost(DataReader dr, SampleLostStatus status) { } public void data_available(DataReader dr) { TopicDescription td = dr.get_topicdescription(); System.Console.WriteLine(" @@@@@@@@@@@ DATA AVAILABLE @@@@@@@@@@"); System.Console.WriteLine(" @@@@@@@@@@@ topic = " + td.get_name() + " (type: " + td.get_type_name() + ")"); StringMsgDataReader string_dr = (StringMsgDataReader)dr; Listsamples = new List (); List si = new List (); ReturnCode_t retval = string_dr.take(samples, si, 100, DDS.ANY_SAMPLE_STATE, DDS.ANY_VIEW_STATE, DDS.ANY_INSTANCE_STATE); System.Console.WriteLine(" @@@@@@@@@@@ DR.read() ===> " + retval); if (retval == ReturnCode_t.RETCODE_OK) { System.Console.WriteLine(" @@@@@@@@@@@ samples.Count= " + samples.Count); for (int i = 0; i < samples.Count; i++) { System.Console.WriteLine(" State : " + (si[i].instance_state == DDS.ALIVE_INSTANCE_STATE?"ALIVE":"NOT ALIVE") ); System.Console.WriteLine(" TimeStamp : " + si[i].source_timestamp.sec + "." + si[i].source_timestamp.nanosec); System.Console.WriteLine(" Handle : " + si[i].instance_handle.value); System.Console.WriteLine(" WriterHandle: " + si[i].publication_handle.value); System.Console.WriteLine(" SampleRank : " + si[i].sample_rank); if (si[i].valid_data) System.Console.WriteLine(" msg : " + samples[i].msg); } string_dr.return_loan(samples, si); } System.Console.WriteLine(" @@@@@@@@@@@ @@@@@@@@@@" ); System.Console.WriteLine(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); } } // ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- public static void Main() { System.Console.WriteLine("STARTING -------------------------"); DomainParticipantFactory dpf = DomainParticipantFactory.get_instance(); DomainParticipant dp = null; System.Console.WriteLine("CREATE PARTICIPANT ---------------"); dp = dpf.create_participant(0, /* domain Id */ DDS.PARTICIPANT_QOS_DEFAULT, /* default qos */ null, /* no listener */ 0); System.Console.WriteLine("REGISTERING TYPE -----------------"); ReturnCode_t retval = StringMsgTypeSupport.register_type(dp, null); //"StringMsg"); System.Console.WriteLine("CREATE TOPIC ---------------------"); Topic top = dp.create_topic("helloTopic", StringMsgTypeSupport.get_type_name(), DDS.TOPIC_QOS_DEFAULT, null, 0); // no listener DomainParticipantFactory dpf = DomainParticipantFactory.get_instance(); DomainParticipant dp = null; System.Console.WriteLine("CREATE PARTICIPANT ---------------"); dp = dpf.create_participant(0, /* domain Id */ DDS.PARTICIPANT_QOS_DEFAULT, /* default qos */ null, /* no listener */ 0); System.Console.WriteLine("REGISTERING TYPE -----------------"); ReturnCode_t retval = StringMsgTypeSupport.register_type(dp, null); //"StringMsg"); System.Console.WriteLine("CREATE TOPIC ---------------------"); Topic top = dp.create_topic("helloTopic", StringMsgTypeSupport.get_type_name(), DDS.TOPIC_QOS_DEFAULT, null, 0); // no listener System.Console.WriteLine("CREATE SUBSCRIBER ----------------"); SubscriberQos sub_qos = null; SubscriberListener sub_listener = null; Subscriber sub = dp.create_subscriber(sub_qos, sub_listener, 0); System.Console.WriteLine("CREATE DATAREADER ----------------"); DataReaderQos dr_qos = new DataReaderQos(); sub.get_default_datareader_qos(dr_qos); dr_qos.history.depth = 10; DataReaderListener dr_listener = new TestDataReaderListener(); StringMsgDataReader dr = (StringMsgDataReader) sub.create_datareader(top, dr_qos, dr_listener, DDS.ALL_STATUS); while ( true ) { Thread.Sleep(5000); // 5 second sleep } } };