void deadlineListener_on_offered_deadline_missed( void* listener_data, DDS_DataWriter* writer, const struct DDS_OfferedDeadlineMissedStatus *status) { deadline_contentfilter dummy; DDS_ReturnCode_t retcode = deadline_contentfilterDataWriter_get_key_value( deadline_contentfilterDataWriter_narrow(writer), &dummy, &status->last_instance_handle); if (retcode != DDS_RETCODE_OK) { printf("get_key_value error %d\n", retcode); return; } printf("Offered deadline missed on instance code = %d\n", dummy.code); }
static int publisher_main(int domainId, int sample_count) { DDS_DomainParticipant *participant = NULL; DDS_Publisher *publisher = NULL; DDS_Topic *topic = NULL; DDS_DataWriter *writer = NULL; deadline_contentfilterDataWriter *deadline_contentfilter_writer = NULL; DDS_ReturnCode_t retcode; const char *type_name = NULL; int count = 0; struct DDS_Duration_t deadline_period = {1, 500000000}; /* 1.5sec */ struct DDS_Duration_t send_period = {1,0}; deadline_contentfilter *instance0 = NULL; deadline_contentfilter *instance1 = NULL; DDS_InstanceHandle_t handle0 = DDS_HANDLE_NIL; DDS_InstanceHandle_t handle1 = DDS_HANDLE_NIL; /*struct DDS_DataWriterQos datawriter_qos = DDS_DataWriterQos_INITIALIZER;*/ /* To customize participant QoS, use the configuration file USER_QOS_PROFILES.xml */ participant = DDS_DomainParticipantFactory_create_participant( DDS_TheParticipantFactory, domainId, &DDS_PARTICIPANT_QOS_DEFAULT, NULL /* listener */, DDS_STATUS_MASK_NONE); if (participant == NULL) { printf("create_participant error\n"); publisher_shutdown(participant); return -1; } /* To customize publisher QoS, use the configuration file USER_QOS_PROFILES.xml */ publisher = DDS_DomainParticipant_create_publisher( participant, &DDS_PUBLISHER_QOS_DEFAULT, NULL /* listener */, DDS_STATUS_MASK_NONE); if (publisher == NULL) { printf("create_publisher error\n"); publisher_shutdown(participant); return -1; } /* Register type before creating topic */ type_name = deadline_contentfilterTypeSupport_get_type_name(); retcode = deadline_contentfilterTypeSupport_register_type( participant, type_name); if (retcode != DDS_RETCODE_OK) { printf("register_type error %d\n", retcode); publisher_shutdown(participant); return -1; } /* To customize topic QoS, use the configuration file USER_QOS_PROFILES.xml */ topic = DDS_DomainParticipant_create_topic( participant, "Example deadline_contentfilter", type_name, &DDS_TOPIC_QOS_DEFAULT, NULL /* listener */, DDS_STATUS_MASK_NONE); if (topic == NULL) { printf("create_topic error\n"); publisher_shutdown(participant); return -1; } /* To customize data writer QoS, use the configuration file USER_QOS_PROFILES.xml */ writer = DDS_Publisher_create_datawriter( publisher, topic, &DDS_DATAWRITER_QOS_DEFAULT, NULL /* listener */, DDS_STATUS_MASK_NONE); if (writer == NULL) { printf("create_datawriter error\n"); publisher_shutdown(participant); return -1; } /* If you want to change the DataWriter's QoS programmatically rather than * using the XML file, you will need to add the following lines to your * code and comment out the create_datawriter call above. * * In this case, we set the deadline period to 1.5 seconds to trigger * a deadline if the DataWriter does not update often enough. */ /* Start changes for Deadline */ /* writer_listener.on_offered_deadline_missed = deadlineListener_on_offered_deadline_missed; retcode = DDS_Publisher_get_default_datawriter_qos(publisher, &datawriter_qos); if (retcode != DDS_RETCODE_OK) { printf("get_default_datawriter_qos error\n"); return -1; } */ /* Set deadline QoS */ /* datawriter_qos.deadline.period = deadline_period; writer = DDS_Publisher_create_datawriter( publisher, topic, &datawriter_qos, &writer_listener, DDS_OFFERED_DEADLINE_MISSED_STATUS); if (writer == NULL) { printf("create_datawriter error\n"); publisher_shutdown(participant); return -1; } */ /* End changes for Deadline */ deadline_contentfilter_writer = deadline_contentfilterDataWriter_narrow(writer); if (deadline_contentfilter_writer == NULL) { printf("DataWriter narrow error\n"); publisher_shutdown(participant); return -1; } /* Start changes for Deadline */ /* Create data sample for writing */ instance0 = deadline_contentfilterTypeSupport_create_data_ex(DDS_BOOLEAN_TRUE); instance1 = deadline_contentfilterTypeSupport_create_data_ex(DDS_BOOLEAN_TRUE); if (instance0 == NULL || instance1 == NULL) { printf("deadlineTypeSupport_create_data error\n"); publisher_shutdown(participant); return -1; } /* Set keys -- we specify 'code' as the key field in the .idl */ instance0->code = 0; instance1->code = 1; /* For data type that has key, if the same instance is going to be written multiple times, initialize the key here and register the keyed instance prior to writing */ handle0 = deadline_contentfilterDataWriter_register_instance( deadline_contentfilter_writer, instance0); handle1 = deadline_contentfilterDataWriter_register_instance( deadline_contentfilter_writer, instance1); instance0->x = instance0->y = instance1->x = instance1->y = 0; /* Main loop */ for (count=0; (sample_count == 0) || (count < sample_count); ++count) { NDDS_Utility_sleep(&send_period); instance0->x++; instance0->y++; instance1->x++; instance1->y++; printf("Writing instance0, x = %d, y = %d\n", instance0->x, instance0->y); retcode = deadline_contentfilterDataWriter_write( deadline_contentfilter_writer, instance0, &handle0); if (retcode != DDS_RETCODE_OK) { printf("write error %d\n", retcode); } if (count < 15) { printf("Writing instance1, x = %d, y = %d\n", instance1->x, instance1->y); retcode = deadline_contentfilterDataWriter_write( deadline_contentfilter_writer, instance1, &handle1); if (retcode != DDS_RETCODE_OK) { printf("write error %d\n", retcode); } } else if (count == 15) { printf("Stopping writes to instance1\n"); } } retcode = deadline_contentfilterDataWriter_unregister_instance( deadline_contentfilter_writer, instance0, &handle0); if (retcode != DDS_RETCODE_OK) { printf("unregister instance error %d\n", retcode); } retcode = deadline_contentfilterDataWriter_unregister_instance( deadline_contentfilter_writer, instance1, &handle1); if (retcode != DDS_RETCODE_OK) { printf("unregister instance error %d\n", retcode); } /* Delete data sample */ retcode = deadline_contentfilterTypeSupport_delete_data_ex(instance0, DDS_BOOLEAN_TRUE); if (retcode != DDS_RETCODE_OK) { printf("deadline_contentfilterTypeSupport_delete_data_ex error %d\n", retcode); } retcode = deadline_contentfilterTypeSupport_delete_data_ex(instance1, DDS_BOOLEAN_TRUE); if (retcode != DDS_RETCODE_OK) { printf("deadline_contentfilterTypeSupport_delete_data_ex error %d\n", retcode); } /* End changes for Deadline */ /* Cleanup and delete delete all entities */ return publisher_shutdown(participant); }