4141
4242namespace rviz
4343{
44- ImageDisplayBase::ImageDisplayBase () : Display(), sub_(), tf_filter_(), messages_received_(0 )
44+ ImageDisplayBase::ImageDisplayBase ()
45+ : Display(), sub_(), tf_filter_(), messages_received_(0 ), last_received_(ros::Time())
4546{
4647 topic_property_ = new RosTopicProperty (
4748 " Image Topic" , " " , QString::fromStdString (ros::message_traits::datatype<sensor_msgs::Image>()),
@@ -65,6 +66,16 @@ ImageDisplayBase::ImageDisplayBase() : Display(), sub_(), tf_filter_(), messages
6566
6667 unreliable_property_ = new BoolProperty (" Unreliable" , false , " Prefer UDP topic transport" , this ,
6768 &ImageDisplayBase::updateTopic);
69+
70+ timeout_property_ =
71+ new FloatProperty (" Timeout" , 1.0 ,
72+ " Seconds to wait before resetting when no new image has been received.\n "
73+ " Zero disables the feature." ,
74+ this , &ImageDisplayBase::updateResetTimeout);
75+
76+ reset_timer_ = new QTimer (this );
77+ connect (reset_timer_, &QTimer::timeout, this , &ImageDisplayBase::onResetTimer);
78+ updateResetTimeout ();
6879}
6980
7081ImageDisplayBase::~ImageDisplayBase ()
@@ -113,6 +124,7 @@ void ImageDisplayBase::incomingMessage(const sensor_msgs::Image::ConstPtr& msg)
113124 setStatus (StatusProperty::Ok, " Image" , QString::number (messages_received_) + " images received" );
114125
115126 emitTimeSignal (msg->header .stamp );
127+ last_received_ = ros::Time::now ();
116128
117129 processMessage (msg);
118130}
@@ -137,6 +149,8 @@ void ImageDisplayBase::reset()
137149
138150 messages_received_ = 0 ;
139151 setStatus (StatusProperty::Warn, " Image" , " No Image received" );
152+
153+ last_received_ = ros::Time ();
140154}
141155
142156void ImageDisplayBase::updateQueueSize ()
@@ -261,6 +275,14 @@ void ImageDisplayBase::updateTopic()
261275 context_->queueRender ();
262276}
263277
278+ void ImageDisplayBase::updateResetTimeout ()
279+ {
280+ if (timeout_property_->getFloat () > 0 )
281+ reset_timer_->start (33 ); // frequently check for receive timeout
282+ else
283+ reset_timer_->stop ();
284+ }
285+
264286void ImageDisplayBase::fillTransportOptionList (EnumProperty* property)
265287{
266288 property->clearOptions ();
@@ -305,4 +327,11 @@ void ImageDisplayBase::fillTransportOptionList(EnumProperty* property)
305327 }
306328}
307329
330+ void ImageDisplayBase::onResetTimer ()
331+ {
332+ ros::Time last = last_received_;
333+ if (!last.isZero () && ros::Time::now () > last + ros::Duration (timeout_property_->getFloat ()))
334+ reset ();
335+ }
336+
308337} // end namespace rviz
0 commit comments