int main(int argc, char *argv[]) { os_time delay_2ms = { 0, 2000000 }; DDSEntityManager *mgr = new DDSEntityManager(); // create domain participant char partition_name[] = "Listener example"; mgr->createParticipant(partition_name); //create type MsgTypeSupport_var mt = new MsgTypeSupport(); mgr->registerType(mt.in()); //create Topic char topic_name[] = "ListenerData_Msg"; mgr->createTopic(topic_name); //create Publisher mgr->createPublisher(); // create DataWriter mgr->createWriter(); // Publish Events DataWriter_ptr dwriter = mgr->getWriter(); MsgDataWriter_var listenerWriter = MsgDataWriter::_narrow(dwriter); Msg msgInstance; /* Example on Stack */ msgInstance.userID = 1; msgInstance.message = CORBA::string_dup("Hello World"); cout << "=== [ListenerDataPublisher] writing a message containing :" << endl; cout << " userID : " << msgInstance.userID << endl; cout << " Message : \"" << msgInstance.message << "\"" << endl; ReturnCode_t status = listenerWriter->write(msgInstance, NULL); checkStatus(status, "MsgDataWriter::write"); os_nanoSleep(delay_2ms); /* Remove the DataWriters */ mgr->deleteWriter(listenerWriter.in ()); /* Remove the Publisher. */ mgr->deletePublisher(); /* Remove the Topics. */ mgr->deleteTopic(); /* Remove Participant. */ mgr->deleteParticipant(); delete mgr; return 0; }
DDSBroker::DDSBroker() { //create a default participant #ifdef USE_OPENSPLICE_DDS domain = DDS::DOMAIN_ID_DEFAULT; dpf = DomainParticipantFactory::get_instance(); #endif #ifdef USE_OPENDDS char* cfgFileName = getenv("DDS_CONFIG_FILE"); int argc = 3; char *argv[3]; argv[0] = ACE_OS_String::strdup (""); if ((cfgFileName != NULL) && (strlen(cfgFileName) != 0) && (access(cfgFileName, 0 ) != -1)) { argv[1] = ACE_OS_String::strdup ("-DCPSConfigFile"); argv[2] = cfgFileName; } else { ROS_ERROR("The environment variable DDS_CONFIG_FILE is not set or the file cannot be found."); ROS_ERROR("You should export this variable to a OpenDDS transport configuration file."); exit(1); } domain = 0; dpf = TheParticipantFactoryWithArgs(argc, argv); #endif ROS_ASSERT_MSG(dpf.in(), "[DDS] Failed to get DDS factory."); participant = dpf->create_participant(domain, PARTICIPANT_QOS_DEFAULT, NULL, STATUS_MASK_NONE); ROS_ASSERT_MSG(participant.in(), "[DDS] Failed to create DDS participant."); //register the default ROSDDS message type #ifdef USE_OPENSPLICE_DDS MsgTypeSupport_var mt = new ROSDDS::MsgTypeSupport(); #endif #ifdef USE_OPENDDS ROSDDS::MsgTypeSupport_var mt = new ROSDDS::MsgTypeSupportImpl(); #endif type_name = mt->get_type_name(); DDS::ReturnCode_t status; status = mt->register_type(participant.in(), type_name); ROS_ASSERT_MSG(status == DDS::RETCODE_OK, "[DDS] Failed to register DDS datatype"); ROS_INFO("[DDS] DDS Ready!"); }
int OSPL_MAIN (int argc, char *argv[]) { os_time delay_20ms = { 0, 20000000 }; os_time delay_200ms = { 0, 200000000 }; MsgSeq msgList; SampleInfoSeq infoSeq; // create domain participant char partition_name[] = "Lifecycle example"; //------------------ Msg topic --------------------// DDSEntityManager mgr; // create domain participant mgr.createParticipant(partition_name); //create type MsgTypeSupport_var mt = new MsgTypeSupport(); mgr.registerType(mt.in()); //create Topic char topic_name[] = "Lifecycle_Msg"; mgr.createTopic(topic_name); //create Subscriber mgr.createSubscriber(); // create DataReader mgr.createReader(); DataReader_var dreader = mgr.getReader(); MsgDataReader_var LifecycleReader = MsgDataReader::_narrow(dreader.in()); checkHandle(LifecycleReader.in(), "MsgDataReader::_narrow"); cout << "=== [Subscriber] Ready ..." << endl; bool closed = false; ReturnCode_t status; int nbIter = 1; int nbIterMax = 100; while ((closed == false) && (nbIter < nbIterMax)) { status = LifecycleReader->read(msgList, infoSeq, LENGTH_UNLIMITED, ANY_SAMPLE_STATE, ANY_VIEW_STATE, ANY_INSTANCE_STATE); checkStatus(status, "msgDataReader::read"); for (DDS::ULong j = 0; j < msgList.length(); j++) { cout << endl << " Message : " << msgList[j].message.in() << endl; cout << " writerStates : " << msgList[j].writerStates.in() << endl; cout << " valid_data : " << (int)infoSeq[j].valid_data << endl; cout << "sample_state:" << sSampleState[index(infoSeq[j].sample_state)] << "-view_state:" << sViewState[index(infoSeq[j].view_state)] << "-instance_state:" << sInstanceState[index(infoSeq[j].instance_state)] << endl; os_nanoSleep(delay_200ms); closed = (strcmp(msgList[j].writerStates.in(), "STOPPING_SUBSCRIBER") == 0); } status = LifecycleReader->return_loan(msgList, infoSeq); checkStatus(status, "MsgDataReader::return_loan"); os_nanoSleep(delay_20ms); nbIter++; } cout << "=== [Subscriber] stopping after "<< nbIter << " iterations - closed=" << closed << endl; if (nbIter == nbIterMax) cout << "*** Error : max " << nbIterMax << "iterations reached" << endl; //cleanup // Lifecycle topic mgr.deleteReader(LifecycleReader.in ()); mgr.deleteSubscriber(); mgr.deleteTopic(); mgr.deleteParticipant(); return 0; }
int OSPL_MAIN (int argc, char *argv[]) { bool automatic = true; ReturnCode_t status = - 1; os_time delay = { 20, 0 }; os_time delay_1s = { 1, 0 }; char buf[MAX_MSG_LEN]; if (argc < 4) { usage(); } if ((strcmp(argv[1], "transient") && strcmp(argv[1], "persistent")) || (strcmp(argv[2], "false") && strcmp(argv[2], "true"))) { usage(); } string durability_kind(argv[1]); bool autodispose_unregistered_instances = (strcmp(argv[2], "true") == 0); DDSEntityManager mgr (durability_kind, autodispose_unregistered_instances); automatic = (strcmp(argv[3], "true") == 0); // Wait for the Subscriber (case of transient = true && auto_dispose = true) os_nanoSleep(delay_1s); // create domain participant char partition_name[] = "Durability example"; mgr.createParticipant(partition_name); //create type MsgTypeSupport_var mt = new MsgTypeSupport(); mgr.registerType(mt.in()); //create Topic char topic_name[] = "DurabilityData_Msg"; mgr.createTopic(topic_name); //create Publisher mgr.createPublisher(); // create DataWriter mgr.createWriter(); // Publish Events DataWriter_var dwriter = mgr.getWriter(); MsgDataWriter_var DurabilityDataWriter = MsgDataWriter::_narrow(dwriter.in()); Msg *instances[10]; InstanceHandle_t userHandle[10]; for (int x = 0; x < 10; x++) { instances[x] = new Msg(); instances[x]->id = x; snprintf(buf, MAX_MSG_LEN, "%d", x); userHandle[x] = DurabilityDataWriter->register_instance(*instances[x]); instances[x]->content = DDS::string_dup(buf); cout << instances[x]->content << endl; DurabilityDataWriter->write(*instances[x], userHandle[x]); } if (! automatic) { char c = 0; cout << "Enter E to exit" << endl; while (c != 'E') { cin >> c; } }
int main(int argc, char *argv[]) { os_time delay_200ms = { 0, 200000000 }; os_time delay_500ms = { 0, 500000000 }; cout << "argc=" << argc << endl; if (argc < 3) { usage(); } if ((strcmp(argv[1], "false") != 0) && (strcmp(argv[1], "true") != 0) && (strcmp(argv[2], "dispose") != 0) && (strcmp(argv[2], "unregister") != 0) && (strcmp(argv[2], "stoppub") != 0)) { usage(); } bool autodispose_unregistered_instances = (strcmp(argv[1], "true") == 0); // create domain participant char partition_name[] = "Lifecycle example"; //------------------ Msg topic --------------------// DDSEntityManager *mgr = new DDSEntityManager (autodispose_unregistered_instances); // create domain participant mgr->createParticipant(partition_name); //create type MsgTypeSupport_var mt = new MsgTypeSupport(); mgr->registerType(mt.in()); //create Topic char topic_name[] = "Lifecycle_Msg"; mgr->createTopic(topic_name); //create Publisher mgr->createPublisher(); // create DataWriters mgr->createWriters(); DataWriter_ptr dwriter = mgr->getWriter(); MsgDataWriter_var LifecycleWriter = MsgDataWriter::_narrow(dwriter); DataWriter_ptr dwriter_stopper = mgr->getWriter_stopper(); MsgDataWriter_var LifecycleWriter_stopper = MsgDataWriter::_narrow(dwriter_stopper); os_nanoSleep(delay_500ms); ReturnCode_t status; if (strcmp(argv[2], "dispose") == 0) { Msg *msgInstance = new Msg(); msgInstance->userID = 1; msgInstance->message = CORBA::string_dup("Lifecycle_1"); msgInstance->writerStates = CORBA::string_dup("SAMPLE_SENT -> INSTANCE_DISPOSED -> DATAWRITER_DELETED"); cout << "=== [Publisher] :" << endl; cout << " userID : " << msgInstance->userID << endl; cout << " Message : \"" << msgInstance->message << "\"" << endl; cout << " writerStates : \"" << msgInstance->writerStates << "\"" << endl; status = LifecycleWriter->write(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::write"); os_nanoSleep(delay_500ms); // cout << "=== [Publisher] : SAMPLE_SENT" << endl; // Dispose instance status = LifecycleWriter->dispose(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::dispose"); cout << "=== [Publisher] : INSTANCE_DISPOSED" << endl; /* Release the data-samples. */ delete msgInstance; // msg allocated on heap: explicit de-allocation required!! } else if (strcmp(argv[2], "unregister") == 0) { Msg *msgInstance = new Msg(); msgInstance->userID = 2; msgInstance->message = CORBA::string_dup("Lifecycle_2"); msgInstance->writerStates = CORBA::string_dup("SAMPLE_SENT -> INSTANCE_UNREGISTERED -> DATAWRITER_DELETED"); cout << "=== [Publisher] :" << endl; cout << " userID : " << msgInstance->userID << endl; cout << " Message : \"" << msgInstance->message << "\"" << endl; cout << " writerStates : \"" << msgInstance->writerStates << "\"" << endl; status = LifecycleWriter->write(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::write"); os_nanoSleep(delay_500ms); // cout << "=== [Publisher] : SAMPLE_SENT" << endl; // Unregister instance : the auto_dispose_unregistered_instances flag // is currently ignored and the instance is never disposed automatically status = LifecycleWriter->unregister_instance(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::unregister_instance"); cout << "=== [Publisher] : INSTANCE_UNREGISTERED" << endl; /* Release the data-samples. */ delete msgInstance; // msg allocated on heap: explicit de-allocation required!! } else if (strcmp(argv[2], "stoppub") == 0) { Msg *msgInstance = new Msg(); msgInstance->userID = 3; msgInstance->message = CORBA::string_dup("Lifecycle_3"); msgInstance->writerStates = CORBA::string_dup("SAMPLE_SENT -> DATAWRITER_DELETED"); cout << "=== [Publisher] :" << endl; cout << " userID : " << msgInstance->userID << endl; cout << " Message : \"" << msgInstance->message << "\"" << endl; cout << " writerStates : \"" << msgInstance->writerStates << "\"" << endl; status = LifecycleWriter->write(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::write"); os_nanoSleep(delay_500ms); // cout << "=== [Publisher] : SAMPLE_SENT" << endl; /* Release the data-samples. */ delete msgInstance; // msg allocated on heap: explicit de-allocation required!! } // let the subscriber treat the previous writer state !!!! cout << "=== [Publisher] waiting 500ms to let the subscriber treat the previous write state ..." << endl; os_nanoSleep(delay_500ms); /* Remove the DataWriters */ mgr->deleteWriter(LifecycleWriter.in ()); os_nanoSleep(delay_500ms); cout << "=== [Publisher] : DATAWRITER_DELETED" << endl; // Stop the subscriber Msg *msgInstance = new Msg(); msgInstance->userID = 4; msgInstance->message = CORBA::string_dup("Lifecycle_4"); msgInstance->writerStates = CORBA::string_dup("STOPPING_SUBSCRIBER"); cout << "=== [Publisher] :" << endl; cout << " userID : " << msgInstance->userID << endl; cout << " Message : \"" << msgInstance->message << "\"" << endl; cout << " writerStates : \"" << msgInstance->writerStates << "\"" << endl; status = LifecycleWriter_stopper->write(*msgInstance, NULL); checkStatus(status, "MsgDataWriter::write"); os_nanoSleep(delay_500ms); // //cout << "=== [Publisher] : SAMPLE_SENT" << endl; /* Release the data-samples. */ delete msgInstance; // msg allocated on heap: explicit de-allocation required!! /* Remove the DataWriter_stopper */ mgr->deleteWriter(LifecycleWriter_stopper.in ()); /* Remove the Publisher. */ mgr->deletePublisher(); /* Remove the Topics. */ mgr->deleteTopic(); mgr->deleteParticipant(); delete mgr; return 0; }
int main(int argc, char *argv[]) { os_time delay_500ms = { 0, 500000000 }; DDSEntityManager *mgr = new DDSEntityManager(); // create domain participant // create domain participant char partition_name[] = "WaitSet example"; mgr->createParticipant(partition_name); //create type MsgTypeSupport_var mt = new MsgTypeSupport(); mgr->registerType(mt.in()); //create Topic char topic_name[] = "WaitSetData_Msg"; mgr->createTopic(topic_name); //create Publisher mgr->createPublisher(); // create DataWriter mgr->createWriter(); // Publish Events DataWriter_ptr dwriter = mgr->getWriter(); MsgDataWriter_var WaitSetDataWriter = MsgDataWriter::_narrow(dwriter); Msg msgInstance; /* Example on Stack */ msgInstance.userID = 1; msgInstance.message = CORBA::string_dup("First Hello"); cout << "=== [Publisher] writing a message containing :" << endl; cout << " userID : " << msgInstance.userID << endl; cout << " Message : \"" << msgInstance.message << "\"" << endl; ReturnCode_t status = WaitSetDataWriter->write(msgInstance, DDS::HANDLE_NIL); checkStatus(status, "MsgDataWriter::write1"); os_nanoSleep(delay_500ms); // Write a second message msgInstance.message = CORBA::string_dup("Hello again"); status = WaitSetDataWriter->write(msgInstance, DDS::HANDLE_NIL); checkStatus(status, "MsgDataWriter::write2"); cout << endl << "=== [Publisher] writing a message containing :" << endl; cout << " userID : " << msgInstance.userID << endl; cout << " Message : \"" << msgInstance.message << "\"" << endl; os_nanoSleep(delay_500ms); // clean up status = WaitSetDataWriter->dispose(msgInstance, DDS::HANDLE_NIL); checkStatus(status, "MsgDataWriter::dispose"); status = WaitSetDataWriter->unregister_instance(msgInstance, DDS::HANDLE_NIL); checkStatus(status, "MsgDataWriter::unregister_instance"); /* Remove the DataWriters */ mgr->deleteWriter(WaitSetDataWriter.in ()); /* Remove the Publisher. */ mgr->deletePublisher(); /* Remove the Topics. */ mgr->deleteTopic(); /* Remove Participant. */ mgr->deleteParticipant(); delete mgr; return 0; }
int OSPL_MAIN (int argc, char *argv[]) { MsgSeq msgList; SampleInfoSeq infoSeq; Duration_t timeout = { 0, 200000000 }; int count = 0; DDSEntityManager mgr; // create domain participant char partition_name[] = "Listener example"; mgr.createParticipant(partition_name); //create type MsgTypeSupport_var st = new MsgTypeSupport(); mgr.registerType(st.in()); //create Topic char topic_name[] = "ListenerData_Msg"; mgr.createTopic(topic_name); //create Subscriber mgr.createSubscriber(); // create DataReader mgr.createReader(); DataReader_var dreader = mgr.getReader(); ListenerDataListener *myListener = new ListenerDataListener(); myListener->m_MsgReader = MsgDataReader::_narrow(dreader.in()); checkHandle(myListener->m_MsgReader.in(), "MsgDataReader::_narrow"); cout << "=== [ListenerDataSubscriber] set_listener" << endl; DDS::StatusMask mask = DDS::DATA_AVAILABLE_STATUS | DDS::REQUESTED_DEADLINE_MISSED_STATUS; myListener->m_MsgReader->set_listener(myListener, mask); cout << "=== [ListenerDataSubscriber] Ready ..." << endl; myListener->m_closed = false; // waitset used to avoid spinning in the loop below DDS::WaitSet_var ws = new DDS::WaitSet(); ws->attach_condition(myListener->m_guardCond); DDS::ConditionSeq condSeq; while (!myListener->m_closed && count < 1500 ){ // To avoid spinning here. We can either use a sleep or better a WaitSet. ws->wait(condSeq, timeout); myListener->m_guardCond->set_trigger_value(false); ++count; } cout << "===[ListenerDataSubscriber] Market Closed" << endl; //cleanup mgr.deleteReader(myListener->m_MsgReader.in ()); mgr.deleteSubscriber(); mgr.deleteTopic(); mgr.deleteParticipant(); delete myListener; cout << "Completed Listener example." << endl; return 0; }