Rxhandler : remove run_once flag handler am: 6caa7c1e68

Original change: https://android-review.googlesource.com/c/platform/hardware/nxp/uwb/+/3356295

Change-Id: Ic78db46ac9ef2282cfaa34f5b731c56cacc06263
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/halimpl/hal/phNxpUciHal.cc b/halimpl/hal/phNxpUciHal.cc
index cd5da12..34c1e9d 100644
--- a/halimpl/hal/phNxpUciHal.cc
+++ b/halimpl/hal/phNxpUciHal.cc
@@ -63,24 +63,18 @@
  * RX packet handler
  ******************************************************************************/
 struct phNxpUciHal_RxHandler {
+  phNxpUciHal_RxHandler(uint8_t mt, uint8_t gid, uint8_t oid,
+    bool run_once, RxHandlerCallback callback) :
+      mt(mt), gid(gid), oid(oid),
+      run_once(run_once),
+      callback(callback) { }
+
   // mt, gid, oid: packet type
   uint8_t mt;
   uint8_t gid;
   uint8_t oid;
-
-  // skip_reporting: not reports the packet to upper layer if it's true
-  bool skip_reporting;
   bool run_once;
-
-  std::function<void(size_t packet_len, const uint8_t *packet)> callback;
-
-  phNxpUciHal_RxHandler(uint8_t mt, uint8_t gid, uint8_t oid,
-    bool skip_reporting, bool run_once,
-    std::function<void(size_t packet_len, const uint8_t *packet)> callback) :
-      mt(mt), gid(gid), oid(oid),
-      skip_reporting(skip_reporting),
-      run_once(run_once),
-      callback(callback) { }
+  RxHandlerCallback callback;
 };
 
 static std::list<std::shared_ptr<phNxpUciHal_RxHandler>> rx_handlers;
@@ -88,11 +82,11 @@
 
 std::shared_ptr<phNxpUciHal_RxHandler> phNxpUciHal_rx_handler_add(
   uint8_t mt, uint8_t gid, uint8_t oid,
-  bool skip_reporting, bool run_once,
-  std::function<void(size_t packet_len, const uint8_t *packet)> callback)
+  bool run_once,
+  RxHandlerCallback callback)
 {
-  auto handler = std::make_shared<phNxpUciHal_RxHandler>(mt, gid, oid,
-    skip_reporting, run_once, callback);
+  auto handler = std::make_shared<phNxpUciHal_RxHandler>(
+    mt, gid, oid, run_once, callback);
   std::lock_guard<std::mutex> guard(rx_handlers_lock);
   rx_handlers.push_back(handler);
   return handler;
@@ -116,8 +110,7 @@
 
   for (auto handler : rx_handlers) {
     if (mt == handler->mt && gid == handler->gid && oid == handler->oid) {
-      handler->callback(packet_len, packet);
-      if (handler->skip_reporting) {
+      if (handler->callback(packet_len, packet)) {
         skip_packet = true;
       }
     }
@@ -798,14 +791,14 @@
 
 static bool cacheDevInfoRsp()
 {
-  auto dev_info_cb = [](size_t packet_len, const uint8_t *packet) mutable {
+  auto dev_info_cb = [](size_t packet_len, const uint8_t *packet) mutable -> bool {
     if (packet_len < 5 || packet[UCI_RESPONSE_STATUS_OFFSET] != UWBSTATUS_SUCCESS) {
       NXPLOG_UCIHAL_E("Failed to get valid CORE_DEVICE_INFO_RSP");
-      return;
+      return true;
     }
     if (packet_len > sizeof(nxpucihal_ctrl.dev_info_resp)) {
       NXPLOG_UCIHAL_E("FIXME: CORE_DEVICE_INFO_RSP buffer overflow!");
-      return;
+      return true;
     }
 
     // FIRA UCIv2.0 packet size = 14
@@ -815,7 +808,7 @@
 
     if (packet_len < firaDevInfoRspSize) {
       NXPLOG_UCIHAL_E("DEVICE_INFO_RSP packet size mismatched.");
-      return;
+      return true;
     }
 
     const uint8_t vendorSpecificLen = packet[firaDevInfoVendorLenOffset];
@@ -844,10 +837,11 @@
     memcpy(nxpucihal_ctrl.dev_info_resp, packet, packet_len);
     nxpucihal_ctrl.isDevInfoCached = true;
     NXPLOG_UCIHAL_D("Device Info cached.");
+    return true;
   };
 
   nxpucihal_ctrl.isDevInfoCached = false;
-  UciHalRxHandler devInfoRspHandler(UCI_MT_RSP, UCI_GID_CORE, UCI_MSG_CORE_DEVICE_INFO, true, dev_info_cb);
+  UciHalRxHandler devInfoRspHandler(UCI_MT_RSP, UCI_GID_CORE, UCI_MSG_CORE_DEVICE_INFO, dev_info_cb);
 
   const uint8_t CoreGetDevInfoCmd[] = {(UCI_MT_CMD << UCI_MT_SHIFT) | UCI_GID_CORE, UCI_MSG_CORE_DEVICE_INFO, 0, 0};
   tHAL_UWB_STATUS status = phNxpUciHal_send_ext_cmd(sizeof(CoreGetDevInfoCmd), CoreGetDevInfoCmd);
@@ -879,16 +873,16 @@
   // Device Status Notification
   UciHalSemaphore devStatusNtfWait;
   uint8_t dev_status = UWB_DEVICE_ERROR;
-  auto dev_status_ntf_cb = [&dev_status,
-                            &devStatusNtfWait](size_t packet_len,
-                                               const uint8_t *packet) mutable {
+  auto dev_status_ntf_cb = [&dev_status, &devStatusNtfWait]
+      (size_t packet_len, const uint8_t *packet) mutable -> bool {
     if (packet_len >= 5) {
       dev_status = packet[UCI_RESPONSE_STATUS_OFFSET];
       devStatusNtfWait.post();
     }
+    return true;
   };
   UciHalRxHandler devStatusNtfHandler(UCI_MT_NTF, UCI_GID_CORE, UCI_MSG_CORE_DEVICE_STATUS_NTF,
-                                      true, dev_status_ntf_cb);
+                                      dev_status_ntf_cb);
 
   // FW download and enter UCI operating mode
   status = nxpucihal_ctrl.uwb_chip->chip_init();
diff --git a/halimpl/hal/phNxpUciHal.h b/halimpl/hal/phNxpUciHal.h
index c7a08d2..28cc97e 100644
--- a/halimpl/hal/phNxpUciHal.h
+++ b/halimpl/hal/phNxpUciHal.h
@@ -308,22 +308,28 @@
 void phNxpUciHal_send_dev_error_status_ntf();
 bool phNxpUciHal_parse(uint16_t data_len, const uint8_t *p_data);
 
+// RX packet handler
+// handler should returns true if the packet is handled and
+// shouldn't report it to the upper layer.
+
+using RxHandlerCallback = std::function<bool(size_t packet_len, const uint8_t *packet)>;
+
 std::shared_ptr<phNxpUciHal_RxHandler> phNxpUciHal_rx_handler_add(
   uint8_t mt, uint8_t gid, uint8_t oid,
-  bool skip_reporting, bool run_once,
-  std::function<void(size_t packet_len, const uint8_t *packet)> callback);
+  bool run_once,
+  RxHandlerCallback callback);
 void phNxpUciHal_rx_handler_del(std::shared_ptr<phNxpUciHal_RxHandler> handler);
 
-// Helper class for rx handler with once=false
+// Helper class for rx handler with run_once=false
 // auto-unregistered from destructor
+
 class UciHalRxHandler {
 public:
   UciHalRxHandler() {
   }
   UciHalRxHandler(uint8_t mt, uint8_t gid, uint8_t oid,
-                 bool skip_reporting,
-                 std::function<void(size_t packet_len, const uint8_t *packet)> callback) {
-    handler_ = phNxpUciHal_rx_handler_add(mt, gid, oid, skip_reporting, false, callback);
+                  RxHandlerCallback callback) {
+    handler_ = phNxpUciHal_rx_handler_add(mt, gid, oid, false, callback);
   }
   UciHalRxHandler& operator=(UciHalRxHandler &&handler) {
     handler_ = std::move(handler.handler_);
diff --git a/halimpl/hal/sessionTrack.cc b/halimpl/hal/sessionTrack.cc
index be63067..56d2697 100644
--- a/halimpl/hal/sessionTrack.cc
+++ b/halimpl/hal/sessionTrack.cc
@@ -153,7 +153,7 @@
     // register SESSION_STATUS_NTF rx handler
     rx_handler_session_status_ntf_ = phNxpUciHal_rx_handler_add(
       UCI_MT_NTF, UCI_GID_SESSION_MANAGE, UCI_MSG_SESSION_STATUS_NTF,
-      false, false,
+      false,
       std::bind(&SessionTrack::OnSessionStatusNtf, this, std::placeholders::_1, std::placeholders::_2));
   }
 
@@ -179,15 +179,15 @@
 
     // Check SESSION_INIT_RSP for SessionID - Handle matching
     auto session_init_rsp_cb =
-      [this, session_id, session_type](size_t packet_len, const uint8_t *packet)
+      [this, session_id, session_type](size_t packet_len, const uint8_t *packet) -> bool
     {
       if (packet_len != UCI_MSG_SESSION_STATE_INIT_RSP_LEN )
-        return;
+        return false;
 
       uint8_t status = packet[UCI_MSG_SESSION_STATE_INIT_RSP_STATUS_OFFSET];
       uint32_t handle = le_bytes_to_cpu<uint32_t>(&packet[UCI_MSG_SESSION_STATE_INIT_RSP_HANDLE_OFFSET]);
       if (status != UWBSTATUS_SUCCESS)
-        return;
+        return false;
 
       bool was_idle;
       {
@@ -203,12 +203,14 @@
         auto msg = std::make_shared<SessionTrackMsg>(SessionTrackWorkType::ACTIVATE, false);
         QueueSessionTrackWork(msg);
       }
+
+      return false;
     };
 
     // XXX: This rx handler can be called multiple times on
     // UCI_STATUS_COMMAND_RETRY(0xA) from SESSION_INIT_CMD
     phNxpUciHal_rx_handler_add(UCI_MT_RSP, UCI_GID_SESSION_MANAGE,
-      UCI_MSG_SESSION_STATE_INIT, false, true, session_init_rsp_cb);
+      UCI_MSG_SESSION_STATE_INIT, true, session_init_rsp_cb);
   }
 
   // Called by upper-layer's SetAppConfig command handler
@@ -342,20 +344,21 @@
     phNxpUciHal_init_cb_data(&urskDeleteNtfWait, NULL);
 
     phNxpUciHal_rx_handler_add(UCI_MT_RSP, UCI_GID_PROPRIETARY_0X0F,
-      UCI_MSG_URSK_DELETE, true, true,
-      [](size_t packet_len, const uint8_t *packet) {
+      UCI_MSG_URSK_DELETE, true,
+      [](size_t packet_len, const uint8_t *packet) -> bool {
         if (packet_len < 5)
-          return;
+          return true;
         if (packet[4] != UWBSTATUS_SUCCESS) {
           NXPLOG_UCIHAL_E("SessionTrack: URSR_DELETE failed, rsp status=0x%x", packet[4]);
         }
+        return true;
       }
     );
     phNxpUciHal_rx_handler_add(UCI_MT_NTF, UCI_GID_PROPRIETARY_0X0F,
-      UCI_MSG_URSK_DELETE, true, true,
-      [&urskDeleteNtfWait](size_t packet_len, const uint8_t *packet) {
+      UCI_MSG_URSK_DELETE, true,
+      [&urskDeleteNtfWait](size_t packet_len, const uint8_t *packet) -> bool {
         if (packet_len < 6)
-          return;
+          return true;
         uint8_t status = packet[4];
         uint8_t nr = packet[5];
 
@@ -384,6 +387,7 @@
           }
         }
         SEM_POST(&urskDeleteNtfWait);
+        return true;
       }
     );
 
@@ -418,29 +422,30 @@
     bool result = false;
 
     phNxpUciHal_rx_handler_add(UCI_MT_RSP, UCI_GID_SESSION_MANAGE,
-      UCI_MSG_SESSION_GET_APP_CONFIG, true, true,
-      [&val, &result, tag](size_t packet_len, const uint8_t *packet) {
+      UCI_MSG_SESSION_GET_APP_CONFIG, true,
+      [&val, &result, tag](size_t packet_len, const uint8_t *packet) -> bool {
         if (packet_len != 12)
-          return;
+          return true;
 
         if (packet[4] != UWBSTATUS_SUCCESS) {
           NXPLOG_UCIHAL_E("SessionTrack: GetAppConfig failed, status=0x%02x", packet[4]);
-          return;
+          return true;
         }
         if (packet[5] != 1) {
           NXPLOG_UCIHAL_E("SessionTrack: GetAppConfig failed, nr=%u", packet[5]);
-          return;
+          return true;
         }
         if (packet[6] != tag) {
           NXPLOG_UCIHAL_E("SessionTrack: GetAppConfig failed, tag=0x%02x, expected=0x%02x", packet[6], tag);
-          return;
+          return true;
         }
         if (packet[7] != 4) {
           NXPLOG_UCIHAL_E("SessionTrack: GetAppConfig failed, len=%u", packet[7]);
-          return;
+          return true;
         }
         val = le_bytes_to_cpu<uint32_t>(&packet[8]);
         result = true;
+        return true;
       }
     );
 
@@ -512,10 +517,10 @@
   }
 
   // UCI_MSG_SESSION_STATUS_NTF rx handler
-  void OnSessionStatusNtf(size_t packet_len, const uint8_t* packet) {
+  bool OnSessionStatusNtf(size_t packet_len, const uint8_t* packet) {
     if (packet_len != UCI_MSG_SESSION_STATUS_NTF_LENGTH) {
       NXPLOG_UCIHAL_E("SessionTrack: SESSION_STATUS_NTF packet parse error");
-      return;
+      return false;
     }
 
     uint32_t session_handle = le_bytes_to_cpu<uint32_t>(&packet[UCI_MSG_SESSION_STATUS_NTF_HANDLE_OFFSET]);
@@ -553,6 +558,8 @@
       auto msg = std::make_shared<SessionTrackMsg>(SessionTrackWorkType::IDLE, false);
       QueueSessionTrackWork(msg);
     }
+
+    return false;
   }
 
   static void IdleTimerCallback(uint32_t TimerId, void* pContext) {
diff --git a/halimpl/hal/sr1xx/NxpUwbChipSr1xx.cc b/halimpl/hal/sr1xx/NxpUwbChipSr1xx.cc
index d24a32f..2183d97 100644
--- a/halimpl/hal/sr1xx/NxpUwbChipSr1xx.cc
+++ b/halimpl/hal/sr1xx/NxpUwbChipSr1xx.cc
@@ -47,7 +47,7 @@
   // NXP_READ_CALIB_DATA_NTF
   bool received = false;
   auto read_calib_ntf_cb =
-  [&] (size_t packet_len, const uint8_t *packet) mutable
+  [&] (size_t packet_len, const uint8_t *packet) mutable -> bool
   {
     // READ_CALIB_DATA_NTF: status(1), length-of-payload(1), payload(N)
     const uint8_t plen = packet[3]; // payload-length
@@ -65,10 +65,11 @@
       received = true;
       SEM_POST(&calib_data_ntf_wait);
     }
+    return true;
   };
   auto handler = phNxpUciHal_rx_handler_add(
       UCI_MT_NTF, UCI_GID_PROPRIETARY_0X0A, UCI_MSG_READ_CALIB_DATA,
-      true, true, read_calib_ntf_cb);
+      true, read_calib_ntf_cb);
 
 
   // READ_CALIB_DATA_CMD
@@ -170,7 +171,7 @@
   phNxpUciHal_init_cb_data(&binding_ntf_wait, NULL);
 
   auto binding_ntf_cb =
-    [&](size_t packet_len, const uint8_t *packet) mutable
+    [&](size_t packet_len, const uint8_t *packet) mutable -> bool
   {
       if (packet_len == UCI_MSG_UWB_ESE_BINDING_LEN) {
         uint8_t status = packet[UCI_RESPONSE_STATUS_OFFSET];
@@ -185,10 +186,11 @@
       } else {
         NXPLOG_UCIHAL_E("UWB_ESE_BINDING_NTF: packet length mismatched %zu", packet_len);
       }
+      return true;
   };
   auto handler = phNxpUciHal_rx_handler_add(
       UCI_MT_NTF, UCI_GID_PROPRIETARY_0X0F, UCI_MSG_UWB_ESE_BINDING,
-      true, true, binding_ntf_cb);
+      true, binding_ntf_cb);
 
   // UWB_ESE_BINDING_CMD
   uint8_t buffer[] = {0x2F, 0x31, 0x00, 0x00};
@@ -229,16 +231,17 @@
   uint8_t binding_status_got = UWB_DEVICE_UNKNOWN;
   phNxpUciHal_Sem_t binding_check_ntf_wait;
   phNxpUciHal_init_cb_data(&binding_check_ntf_wait, NULL);
-  auto binding_check_ntf_cb = [&](size_t packet_len, const uint8_t *packet) mutable {
+  auto binding_check_ntf_cb = [&](size_t packet_len, const uint8_t *packet) mutable -> bool {
     if (packet_len >= UCI_RESPONSE_STATUS_OFFSET) {
       binding_status_got = packet[UCI_RESPONSE_STATUS_OFFSET];
       NXPLOG_UCIHAL_D("Received UWB_ESE_BINDING_CHECK_NTF, binding_status=0x%x", binding_status_got);
       SEM_POST(&binding_check_ntf_wait);
     }
+    return true;
   };
   auto handler = phNxpUciHal_rx_handler_add(
       UCI_MT_NTF, UCI_GID_PROPRIETARY_0X0F, UCI_MSG_UWB_ESE_BINDING_CHECK,
-      true, true, binding_check_ntf_cb);
+      true, binding_check_ntf_cb);
 
   // UWB_ESE_BINDING_CHECK_CMD
   uint8_t lock_cmd[] = {0x2F, 0x32, 0x00, 0x00};
@@ -334,9 +337,9 @@
 
 private:
   tHAL_UWB_STATUS check_binding();
-  void onDeviceStatusNtf(size_t packet_len, const uint8_t* packet);
-  void onGenericErrorNtf(size_t packet_len, const uint8_t* packet);
-  void onBindingStatusNtf(size_t packet_len, const uint8_t* packet);
+  bool onDeviceStatusNtf(size_t packet_len, const uint8_t* packet);
+  bool onGenericErrorNtf(size_t packet_len, const uint8_t* packet);
+  bool onBindingStatusNtf(size_t packet_len, const uint8_t* packet);
 
 private:
   UciHalRxHandler deviceStatusNtfHandler_;
@@ -355,7 +358,7 @@
 {
 }
 
-void NxpUwbChipSr1xx::onDeviceStatusNtf(size_t packet_len, const uint8_t* packet)
+bool NxpUwbChipSr1xx::onDeviceStatusNtf(size_t packet_len, const uint8_t* packet)
 {
   if(packet_len > UCI_RESPONSE_STATUS_OFFSET) {
     uint8_t status = packet[UCI_RESPONSE_STATUS_OFFSET];
@@ -363,26 +366,29 @@
       sr1xx_clear_device_error();
     }
   }
+  return false;
 }
 
-void NxpUwbChipSr1xx::onGenericErrorNtf(size_t packet_len, const uint8_t* packet)
+bool NxpUwbChipSr1xx::onGenericErrorNtf(size_t packet_len, const uint8_t* packet)
 {
   if(packet_len > UCI_RESPONSE_STATUS_OFFSET) {
     uint8_t status = packet[UCI_RESPONSE_STATUS_OFFSET];
     if ( status == UCI_STATUS_THERMAL_RUNAWAY || status == UCI_STATUS_LOW_VBAT) {
-      nxpucihal_ctrl.isSkipPacket = 1;
       sr1xx_handle_device_error();
+      return true;
     }
   }
+  return false;
 }
 
-void NxpUwbChipSr1xx::onBindingStatusNtf(size_t packet_len, const uint8_t* packet)
+bool NxpUwbChipSr1xx::onBindingStatusNtf(size_t packet_len, const uint8_t* packet)
 {
   if (packet_len > UCI_RESPONSE_STATUS_OFFSET) {
     bindingStatus_ = packet[UCI_RESPONSE_STATUS_OFFSET];
     NXPLOG_UCIHAL_D("BINDING_STATUS_NTF: 0x%x", bindingStatus_);
     bindingStatusNtfWait_.post(UWBSTATUS_SUCCESS);
   }
+  return true;
 }
 
 tHAL_UWB_STATUS NxpUwbChipSr1xx::check_binding()
@@ -492,19 +498,19 @@
 
   // register device status ntf handler
   deviceStatusNtfHandler_ = UciHalRxHandler(
-      UCI_MT_NTF, UCI_GID_CORE, UCI_MSG_CORE_DEVICE_STATUS_NTF, false,
+      UCI_MT_NTF, UCI_GID_CORE, UCI_MSG_CORE_DEVICE_STATUS_NTF,
       std::bind(&NxpUwbChipSr1xx::onDeviceStatusNtf, this, std::placeholders::_1, std::placeholders::_2)
   );
 
   // register device error ntf handler
   genericErrorNtfHandler_ = UciHalRxHandler(
-    UCI_MT_NTF, UCI_GID_CORE, UCI_MSG_CORE_GENERIC_ERROR_NTF, false,
+    UCI_MT_NTF, UCI_GID_CORE, UCI_MSG_CORE_GENERIC_ERROR_NTF,
     std::bind(&NxpUwbChipSr1xx::onGenericErrorNtf, this, std::placeholders::_1, std::placeholders::_2)
   );
 
   // register binding status ntf handler
   bindingStatusNtfHandler_ = UciHalRxHandler(
-      UCI_MT_NTF, UCI_GID_PROPRIETARY, UCI_MSG_BINDING_STATUS_NTF, true,
+      UCI_MT_NTF, UCI_GID_PROPRIETARY, UCI_MSG_BINDING_STATUS_NTF,
       std::bind(&NxpUwbChipSr1xx::onBindingStatusNtf, this, std::placeholders::_1, std::placeholders::_2)
   );
 
diff --git a/halimpl/hal/sr200/NxpUwbChipSr200.cc b/halimpl/hal/sr200/NxpUwbChipSr200.cc
index 2b28127..a1ba4cb 100644
--- a/halimpl/hal/sr200/NxpUwbChipSr200.cc
+++ b/halimpl/hal/sr200/NxpUwbChipSr200.cc
@@ -26,7 +26,7 @@
   tHAL_UWB_STATUS apply_calibration(extcal_param_id_t id, const uint8_t ch, const uint8_t *data, size_t data_len);
   tHAL_UWB_STATUS get_supported_channels(const uint8_t **cal_channels, uint8_t *nr);
 private:
-  void on_binding_status_ntf(size_t packet_len, const uint8_t* packet);
+  bool on_binding_status_ntf(size_t packet_len, const uint8_t* packet);
 
   tHAL_UWB_STATUS check_binding_done();
 
@@ -44,13 +44,14 @@
 {
 }
 
-void NxpUwbChipSr200::on_binding_status_ntf(size_t packet_len, const uint8_t* packet)
+bool NxpUwbChipSr200::on_binding_status_ntf(size_t packet_len, const uint8_t* packet)
 {
   if (packet_len >= UCI_RESPONSE_STATUS_OFFSET) {
     bindingStatus_ = packet[UCI_RESPONSE_STATUS_OFFSET];
     NXPLOG_UCIHAL_D("BINDING_STATUS_NTF: 0x%x", bindingStatus_);
     bindingStatusNtfWait_.post(UWBSTATUS_SUCCESS);
   }
+  return true;
 }
 
 tHAL_UWB_STATUS NxpUwbChipSr200::check_binding_done()
@@ -119,7 +120,6 @@
   // register binding status ntf handler
   bindingStatusNtfHandler_ = UciHalRxHandler(
       UCI_MT_NTF, UCI_GID_PROPRIETARY, UCI_MSG_BINDING_STATUS_NTF,
-      true,
       std::bind(&NxpUwbChipSr200::on_binding_status_ntf, this, std::placeholders::_1, std::placeholders::_2));
 
   return status;