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;
}
Exemplo n.º 2
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;
     }
  }
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
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;
}
Exemplo n.º 7
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;
}