Skip to content

Commit

Permalink
ROS2 port of feature to report stale when no errors but stale items
Browse files Browse the repository at this point in the history
  • Loading branch information
Ferry Schoenmakers committed Apr 29, 2024
1 parent dc8331e commit 834e25e
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 18 deletions.
30 changes: 18 additions & 12 deletions diagnostic_aggregator/src/aggregator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ void Aggregator::publishData()
diag_toplevel_state.name = "toplevel_state";
diag_toplevel_state.level = DiagnosticStatus::STALE;
int max_level = -1;
int min_level = 255;
int8_t max_level_without_stale = 0;
int non_ok_status_depth = 0;
std::shared_ptr<DiagnosticStatus> msg_to_report;

Expand All @@ -244,8 +244,10 @@ void Aggregator::publishData()
non_ok_status_depth = depth;
msg_to_report = msg;
}
if (msg->level < min_level) {
min_level = msg->level;
if (
msg->level > max_level_without_stale &&
msg->level != diagnostic_msgs::msg::DiagnosticStatus::STALE) {
max_level_without_stale = msg->level;
}
}
// When a non-ok item was found, copy the complete status message once
Expand All @@ -272,8 +274,10 @@ void Aggregator::publishData()
non_ok_status_depth = depth;
msg_to_report = msg;
}
if (msg->level < min_level) {
min_level = msg->level;
if (
msg->level > max_level_without_stale &&
msg->level != diagnostic_msgs::msg::DiagnosticStatus::STALE) {
max_level_without_stale = msg->level;
}
}
// When a non-ok item was found, copy the complete status message once
Expand All @@ -287,14 +291,16 @@ void Aggregator::publishData()
diag_array.header.stamp = clock_->now();
agg_pub_->publish(diag_array);

diag_toplevel_state.level = max_level;
if (max_level < 0 ||
(max_level > DiagnosticStatus::ERROR && min_level <= DiagnosticStatus::ERROR))
{
// Top level is error if we got no diagnostic level or
// have stale items but not all are stale
diag_toplevel_state.level = DiagnosticStatus::ERROR;
if (
diag_toplevel_state.level == diagnostic_msgs::msg::DiagnosticStatus::STALE &&
max_level_without_stale < diagnostic_msgs::msg::DiagnosticStatus::ERROR) {
diag_toplevel_state.level = diagnostic_msgs::msg::DiagnosticStatus::STALE;
} else {
diag_toplevel_state.level = max_level_without_stale;
}



last_top_level_state_ = diag_toplevel_state.level;

toplevel_state_pub_->publish(diag_toplevel_state);
Expand Down
17 changes: 11 additions & 6 deletions diagnostic_aggregator/src/analyzer_group.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ std::vector<std::shared_ptr<diagnostic_msgs::msg::DiagnosticStatus>> AnalyzerGro
return output;
}

bool all_stale = true;
unsigned char max_level_without_stale = 0;

for (auto j = 0u; j < analyzers_.size(); ++j) {
std::string path = analyzers_[j]->getPath();
Expand All @@ -317,17 +317,22 @@ std::vector<std::shared_ptr<diagnostic_msgs::msg::DiagnosticStatus>> AnalyzerGro
kv.key = nice_name;
kv.value = processed[i]->message;

all_stale = all_stale &&
(processed[i]->level == diagnostic_msgs::msg::DiagnosticStatus::STALE);
if (processed[i]->level != diagnostic_msgs::msg::DiagnosticStatus::STALE) {
max_level_without_stale = max(max_level_without_stale, processed[i]->level);
}
header_status->level = max(header_status->level, processed[i]->level);
header_status->values.push_back(kv);
}
}
}

// Report stale as errors unless all stale
if (header_status->level == diagnostic_msgs::msg::DiagnosticStatus::STALE && !all_stale) {
header_status->level = diagnostic_msgs::msg::DiagnosticStatus::ERROR;
// If one STALE and no ERROR, report STALE
if (
header_status->level == diagnostic_msgs::msg::DiagnosticStatus::STALE &&
max_level_without_stale < diagnostic_msgs::msg::DiagnosticStatus::ERROR) {
header_status->level = diagnostic_msgs::msg::DiagnosticStatus::STALE;
} else {
header_status->level = max_level_without_stale;
}

header_status->message = valToMsg(header_status->level);
Expand Down

0 comments on commit 834e25e

Please sign in to comment.