Skip to content

Commit

Permalink
Fix crash if no window_context exists (#523)
Browse files Browse the repository at this point in the history
In TrajectoryVisualization::onInitialize the existance of a window_context is checked and the trajectory_slider_panel_ and trajectory_slider_dock_panel_ are only created if it exists.
However later on these two pointers are assumed to be valid (non-NULL) and not checked any further.
  • Loading branch information
simonschmeisser authored and v4hn committed Jun 20, 2017
1 parent 83b167a commit a9e32a9
Showing 1 changed file with 17 additions and 9 deletions.
Expand Up @@ -159,7 +159,8 @@ void TrajectoryVisualization::onInitialize(Ogre::SceneNode* scene_node, rviz::Di

void TrajectoryVisualization::setName(const QString& name)
{
trajectory_slider_dock_panel_->setWindowTitle(name + " - Slider");
if (trajectory_slider_dock_panel_)
trajectory_slider_dock_panel_->setWindowTitle(name + " - Slider");
}

void TrajectoryVisualization::onRobotModelLoaded(robot_model::RobotModelConstPtr robot_model)
Expand Down Expand Up @@ -204,7 +205,7 @@ void TrajectoryVisualization::clearTrajectoryTrail()
void TrajectoryVisualization::changedLoopDisplay()
{
display_path_robot_->setVisible(display_->isEnabled() && displaying_trajectory_message_ && animating_path_);
if (loop_display_property_->getBool())
if (loop_display_property_->getBool() && trajectory_slider_panel_)
trajectory_slider_panel_->pauseButton(false);
}

Expand Down Expand Up @@ -312,7 +313,8 @@ void TrajectoryVisualization::onDisable()
trajectory_trail_[i]->setVisible(false);
displaying_trajectory_message_.reset();
animating_path_ = false;
trajectory_slider_panel_->onDisable();
if (trajectory_slider_panel_)
trajectory_slider_panel_->onDisable();
}

void TrajectoryVisualization::interruptCurrentDisplay()
Expand Down Expand Up @@ -358,15 +360,16 @@ void TrajectoryVisualization::update(float wall_dt, float ros_dt)
animating_path_ = true;
displaying_trajectory_message_ = trajectory_message_to_display_;
changedShowTrail();
trajectory_slider_panel_->update(trajectory_message_to_display_->getWayPointCount());
if (trajectory_slider_panel_)
trajectory_slider_panel_->update(trajectory_message_to_display_->getWayPointCount());
}
else if (displaying_trajectory_message_)
{
if (loop_display_property_->getBool())
{ // do loop? -> start over too
animating_path_ = true;
}
else if (trajectory_slider_panel_->isVisible())
else if (trajectory_slider_panel_ && trajectory_slider_panel_->isVisible())
{
if (trajectory_slider_panel_->getSliderPosition() == displaying_trajectory_message_->getWayPointCount() - 1)
{ // show the last waypoint if the slider is enabled
Expand All @@ -385,7 +388,8 @@ void TrajectoryVisualization::update(float wall_dt, float ros_dt)
current_state_time_ = std::numeric_limits<float>::infinity();
display_path_robot_->update(displaying_trajectory_message_->getFirstWayPointPtr());
display_path_robot_->setVisible(display_->isEnabled());
trajectory_slider_panel_->setSliderPosition(0);
if (trajectory_slider_panel_)
trajectory_slider_panel_->setSliderPosition(0);
}
}

Expand All @@ -396,14 +400,15 @@ void TrajectoryVisualization::update(float wall_dt, float ros_dt)
tm = displaying_trajectory_message_->getWayPointDurationFromPrevious(current_state_ + 1);
if (current_state_time_ > tm)
{
if (trajectory_slider_panel_->isVisible() && trajectory_slider_panel_->isPaused())
if (trajectory_slider_panel_ && trajectory_slider_panel_->isVisible() && trajectory_slider_panel_->isPaused())
current_state_ = trajectory_slider_panel_->getSliderPosition();
else
++current_state_;
int waypoint_count = displaying_trajectory_message_->getWayPointCount();
if ((std::size_t)current_state_ < waypoint_count)
{
trajectory_slider_panel_->setSliderPosition(current_state_);
if (trajectory_slider_panel_)
trajectory_slider_panel_->setSliderPosition(current_state_);
display_path_robot_->update(displaying_trajectory_message_->getWayPointPtr(current_state_));
for (std::size_t i = 0; i < trajectory_trail_.size(); ++i)
trajectory_trail_[i]->setVisible(
Expand All @@ -414,7 +419,7 @@ void TrajectoryVisualization::update(float wall_dt, float ros_dt)
{
animating_path_ = false; // animation finished
display_path_robot_->setVisible(loop_display_property_->getBool());
if (!loop_display_property_->getBool())
if (!loop_display_property_->getBool() && trajectory_slider_panel_)
trajectory_slider_panel_->pauseButton(true);
}
current_state_time_ = 0.0f;
Expand Down Expand Up @@ -490,6 +495,9 @@ void TrajectoryVisualization::setRobotColor(rviz::Robot* robot, const QColor& co

void TrajectoryVisualization::trajectorySliderPanelVisibilityChange(bool enable)
{
if (!trajectory_slider_panel_)
return;

if (enable)
trajectory_slider_panel_->onEnable();
else
Expand Down

0 comments on commit a9e32a9

Please sign in to comment.