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;