21#include "absl/strings/str_cat.h"
25 "Name of the functional safety monitor.");
28 "Interval before sending estop after we found critical errors.");
34bool IsSafe(
const std::string& name,
const ComponentStatus& status) {
35 if (status.status() == ComponentStatus::ERROR ||
36 status.status() == ComponentStatus::FATAL) {
37 MonitorManager::Instance()->LogBuffer().ERROR(
38 absl::StrCat(name,
" triggers safe mode: ", status.message()));
50 auto* system_status = MonitorManager::Instance()->GetStatus();
53 system_status->clear_passenger_msg();
54 system_status->clear_safety_mode_trigger_time();
55 system_status->clear_require_emergency_stop();
58 if (system_status->require_emergency_stop()) {
64 system_status->set_passenger_msg(
"Error! Please disengage.");
65 if (!system_status->has_safety_mode_trigger_time()) {
66 system_status->set_safety_mode_trigger_time(current_time);
71 if (system_status->safety_mode_trigger_time() +
72 FLAGS_safety_mode_seconds_before_estop <
74 system_status->set_require_emergency_stop(
true);
78bool FunctionalSafetyMonitor::CheckSafety() {
80 auto manager = MonitorManager::Instance();
81 if (!manager->IsInAutonomousMode()) {
86 const auto& mode = manager->GetHMIMode();
87 const auto& hmi_modules = manager->GetStatus()->hmi_modules();
88 for (
const auto& iter : mode.
modules()) {
89 const std::string& module_name = iter.first;
90 const auto&
module = iter.second;
91 if (module.required_for_safety() &&
92 !IsSafe(module_name, hmi_modules.at(module_name))) {
98 const auto& components = manager->GetStatus()->components();
99 for (
const auto& iter : mode.monitored_components()) {
100 const std::string& component_name = iter.first;
101 const auto& component = iter.second;
102 if (component.required_for_safety() &&
103 !IsSafe(component_name, components.at(component_name).summary())) {
void RunOnce(const double current_time)
FunctionalSafetyMonitor()
DEFINE_string(functional_safety_monitor_name, "FunctionalSafetyMonitor", "Name of the functional safety monitor.")
DEFINE_double(safety_mode_seconds_before_estop, 10.0, "Interval before sending estop after we found critical errors.")