From 7f320aa56e3057dfe9260a026b9dd9750a3061ba Mon Sep 17 00:00:00 2001
From: veqcc <ryuta.kambe@tier4.jp>
Date: Thu, 29 Feb 2024 13:47:47 +0900
Subject: [PATCH] fix operation mode availability timeout

Signed-off-by: veqcc <ryuta.kambe@tier4.jp>
---
 .../include/mrm_handler/mrm_handler_core.hpp  |  2 ++
 .../src/mrm_handler/mrm_handler_core.cpp      | 31 ++++++++++++-------
 2 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/system/mrm_handler/include/mrm_handler/mrm_handler_core.hpp b/system/mrm_handler/include/mrm_handler/mrm_handler_core.hpp
index 8a6ec81cbafff..4b9df373401c5 100644
--- a/system/mrm_handler/include/mrm_handler/mrm_handler_core.hpp
+++ b/system/mrm_handler/include/mrm_handler/mrm_handler_core.hpp
@@ -143,6 +143,8 @@ class MrmHandler : public rclcpp::Node
   // Heartbeat
   rclcpp::Time stamp_operation_mode_availability_;
   std::optional<rclcpp::Time> stamp_autonomous_become_unavailable_ = std::nullopt;
+  bool is_operation_mode_availability_timeout;
+  void checkOperationModeAvailabilityTimeout();
 
   // Algorithm
   rclcpp::Time takeover_requested_time_;
diff --git a/system/mrm_handler/src/mrm_handler/mrm_handler_core.cpp b/system/mrm_handler/src/mrm_handler/mrm_handler_core.cpp
index 976f5b3164abd..9ebdfaa0e43b0 100644
--- a/system/mrm_handler/src/mrm_handler/mrm_handler_core.cpp
+++ b/system/mrm_handler/src/mrm_handler/mrm_handler_core.cpp
@@ -93,6 +93,7 @@ MrmHandler::MrmHandler() : Node("mrm_handler")
   mrm_state_.stamp = this->now();
   mrm_state_.state = autoware_adapi_v1_msgs::msg::MrmState::NORMAL;
   mrm_state_.behavior = autoware_adapi_v1_msgs::msg::MrmState::NONE;
+  is_operation_mode_availability_timeout = false;
 
   // Timer
   const auto update_period_ns = rclcpp::Rate(param_.update_rate).period();
@@ -369,22 +370,26 @@ bool MrmHandler::isDataReady()
   return true;
 }
 
+void MrmHandler::checkOperationModeAvailabilityTimeout() {
+  if ((this->now() - stamp_operation_mode_availability_).seconds() >
+    param_.timeout_operation_mode_availability) {
+    is_operation_mode_availability_timeout = true;
+    RCLCPP_WARN_THROTTLE(
+      this->get_logger(), *this->get_clock(), std::chrono::milliseconds(1000).count(),
+      "operation_mode_availability is timeout");
+  } else {
+    is_operation_mode_availability_timeout = false;
+  }
+}
+
 void MrmHandler::onTimer()
 {
   if (!isDataReady()) {
     return;
   }
-  const bool is_operation_mode_availability_timeout =
-    (this->now() - stamp_operation_mode_availability_).seconds() >
-    param_.timeout_operation_mode_availability;
-  if (is_operation_mode_availability_timeout) {
-    RCLCPP_WARN_THROTTLE(
-      this->get_logger(), *this->get_clock(), std::chrono::milliseconds(1000).count(),
-      "heartbeat operation_mode_availability is timeout");
-    mrm_state_.state = autoware_adapi_v1_msgs::msg::MrmState::MRM_OPERATING;
-    publishControlCommands();
-    return;
-  }
+
+  // Check whether operation_mode_availability is timeout
+  checkOperationModeAvailabilityTimeout();
 
   // Update Emergency State
   updateMrmState();
@@ -576,7 +581,9 @@ bool MrmHandler::isStopped()
 
 bool MrmHandler::isEmergency() const
 {
-  return !operation_mode_availability_->autonomous || is_emergency_holding_;
+  return !operation_mode_availability_->autonomous ||
+         is_emergency_holding_ ||
+         is_operation_mode_availability_timeout;
 }
 
 bool MrmHandler::isArrivedAtGoal()