diff --git a/components/bt/common/osi/alarm.c b/components/bt/common/osi/alarm.c index c8bfc83ab7..736d67fd08 100644 --- a/components/bt/common/osi/alarm.c +++ b/components/bt/common/osi/alarm.c @@ -318,3 +318,14 @@ uint32_t osi_time_get_os_boottime_ms(void) { return (uint32_t)(esp_timer_get_time() / 1000); } + +bool osi_alarm_is_active(osi_alarm_t *alarm) +{ + assert(alarm != NULL); + + if (alarm->alarm_hdl != NULL) { + return esp_timer_is_active(alarm->alarm_hdl); + } + + return false; +} diff --git a/components/bt/common/osi/include/osi/alarm.h b/components/bt/common/osi/include/osi/alarm.h index a1d3fa8961..fe8344cdb9 100644 --- a/components/bt/common/osi/include/osi/alarm.h +++ b/components/bt/common/osi/include/osi/alarm.h @@ -77,4 +77,8 @@ period_ms_t osi_alarm_get_remaining_ms(const osi_alarm_t *alarm); uint32_t osi_time_get_os_boottime_ms(void); +// This function returns whether the given |alarm| is active or not. +// Return true if active, false otherwise. +bool osi_alarm_is_active(osi_alarm_t *alarm); + #endif /*_ALARM_H_*/ diff --git a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c index 018723a0eb..d330e36d4c 100644 --- a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c +++ b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c @@ -3835,7 +3835,10 @@ static void bta_dm_adjust_roles(BOOLEAN delay_role_switch) } else { bta_dm_cb.switch_delay_timer[i].p_cback = (TIMER_CBACK *)&bta_dm_delay_role_switch_cback; - bta_sys_start_timer(&bta_dm_cb.switch_delay_timer[i], 0, 500); + /* Start the timer if not active */ + if (!bta_sys_timer_is_active(&bta_dm_cb.switch_delay_timer[i])) { + bta_sys_start_timer(&bta_dm_cb.switch_delay_timer[i], 0, 500); + } } } diff --git a/components/bt/host/bluedroid/bta/include/bta/bta_sys.h b/components/bt/host/bluedroid/bta/include/bta/bta_sys.h index a466028b95..87359b5a9f 100644 --- a/components/bt/host/bluedroid/bta/include/bta/bta_sys.h +++ b/components/bt/host/bluedroid/bta/include/bta/bta_sys.h @@ -225,6 +225,7 @@ extern void bta_sys_sendmsg(void *p_msg); extern void bta_sys_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, INT32 timeout_ms); extern void bta_sys_stop_timer(TIMER_LIST_ENT *p_tle); extern void bta_sys_free_timer(TIMER_LIST_ENT *p_tle); +extern BOOLEAN bta_sys_timer_is_active(TIMER_LIST_ENT *p_tle); extern void bta_sys_disable(tBTA_SYS_HW_MODULE module); extern UINT32 bta_sys_get_remaining_ticks(TIMER_LIST_ENT *p_target_tle); diff --git a/components/bt/host/bluedroid/bta/sys/bta_sys_main.c b/components/bt/host/bluedroid/bta/sys/bta_sys_main.c index c495e14f09..6343943243 100644 --- a/components/bt/host/bluedroid/bta/sys/bta_sys_main.c +++ b/components/bt/host/bluedroid/bta/sys/bta_sys_main.c @@ -638,6 +638,27 @@ UINT32 bta_sys_get_remaining_ticks(TIMER_LIST_ENT *p_target_tle) } +/******************************************************************************* +** +** Function bta_sys_timer_is_active +** +** Description Get info of timer is active or not. +** +** Returns true if timer is exist and active, false otherwise. +** +*******************************************************************************/ +BOOLEAN bta_sys_timer_is_active(TIMER_LIST_ENT *p_tle) +{ + assert(p_tle != NULL); + + osi_alarm_t *alarm = hash_map_get(bta_alarm_hash_map, p_tle); + if (alarm != NULL && osi_alarm_is_active(alarm)) { + return TRUE; + } + + return FALSE; +} + /******************************************************************************* ** ** Function bta_sys_stop_timer