/****************************************************************************** * * Copyright 2003-2012 Broadcom Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ******************************************************************************/ /****************************************************************************** * * Routes connection status callbacks from various sub systems to DM * ******************************************************************************/ #include #include "bt_target.h" // Must be first to define build configuration #include "bta/sys/bta_sys.h" #include "bta/sys/bta_sys_int.h" #include "main/shim/dumpsys.h" #include "osi/include/log.h" #include "osi/include/osi.h" // UNUSED_ATTR #include "stack/include/btm_api.h" #include "types/hci_role.h" #include "types/raw_address.h" /******************************************************************************* * * Function bta_sys_rm_register * * Description Called by BTA DM to register role management callbacks * * * Returns void * ******************************************************************************/ void bta_sys_rm_register(tBTA_SYS_CONN_CBACK* p_cback) { bta_sys_cb.prm_cb = p_cback; } /******************************************************************************* * * Function bta_sys_role_chg_register * * Description Called by BTA AV to register role change callbacks * * * Returns void * ******************************************************************************/ void bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK* p_cback) { bta_sys_cb.p_role_cb = p_cback; } /******************************************************************************* * * Function bta_sys_ssr_cfg_register * * Description Called by BTA DM to register SSR configuration callback * * * Returns void * ******************************************************************************/ void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK* p_cback) { bta_sys_cb.p_ssr_cb = p_cback; } /******************************************************************************* * * Function bta_sys_role_chg_register * * Description Called by BTA AV to register role change callbacks * * * Returns void * ******************************************************************************/ void bta_sys_notify_role_chg(const RawAddress& peer_addr, tHCI_ROLE new_role, tHCI_STATUS hci_status) { LOG_DEBUG("Role changed peer:%s new_role:%s hci_status:%s", PRIVATE_ADDRESS(peer_addr), RoleText(new_role).c_str(), hci_error_code_text(hci_status).c_str()); if (bta_sys_cb.p_role_cb) { bta_sys_cb.p_role_cb(BTA_SYS_ROLE_CHANGE, new_role, hci_status, peer_addr); } } /******************************************************************************* * * Function bta_sys_collision_register * * Description Called by any BTA module to register for collision event. * * * Returns void * ******************************************************************************/ void bta_sys_collision_register(uint8_t bta_id, tBTA_SYS_CONN_CBACK* p_cback) { uint8_t index; for (index = 0; index < MAX_COLLISION_REG; index++) { if ((bta_sys_cb.colli_reg.id[index] == bta_id) || (bta_sys_cb.colli_reg.id[index] == 0)) { bta_sys_cb.colli_reg.id[index] = bta_id; bta_sys_cb.colli_reg.p_coll_cback[index] = p_cback; return; } } } /******************************************************************************* * * Function bta_sys_notify_collision * * Description Called by BTA DM to notify collision event. * * * Returns void * ******************************************************************************/ void bta_sys_notify_collision(const RawAddress& peer_addr) { uint8_t index; for (index = 0; index < MAX_COLLISION_REG; index++) { if ((bta_sys_cb.colli_reg.id[index] != 0) && (bta_sys_cb.colli_reg.p_coll_cback[index] != NULL)) { bta_sys_cb.colli_reg.p_coll_cback[index](BTA_SYS_CONN_OPEN, BTA_ID_SYS, 0, peer_addr); } } } /******************************************************************************* * * Function bta_sys_sco_register * * Description Called by BTA AV to register sco connection change callbacks * * * Returns void * ******************************************************************************/ void bta_sys_sco_register(tBTA_SYS_CONN_CBACK* p_cback) { bta_sys_cb.p_sco_cb = p_cback; } /******************************************************************************* * * Function bta_sys_pm_register * * Description Called by BTA DM to register power management callbacks * * * Returns void * ******************************************************************************/ void bta_sys_pm_register(tBTA_SYS_CONN_CBACK* p_cback) { bta_sys_cb.ppm_cb = p_cback; } /******************************************************************************* * * Function bta_sys_conn_open * * Description Called by BTA subsystems when a connection is made to * the service * * * Returns void * ******************************************************************************/ void bta_sys_conn_open(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { if (bta_sys_cb.prm_cb) { bta_sys_cb.prm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr); } if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr); } } /******************************************************************************* * * Function bta_sys_conn_close * * Description Called by BTA subsystems when a connection to the service * is closed * * * Returns void * ******************************************************************************/ void bta_sys_conn_close(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { if (bta_sys_cb.prm_cb) { bta_sys_cb.prm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr); } if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr); } } /******************************************************************************* * * Function bta_sys_app_open * * Description Called by BTA subsystems when application initiates * connection to a peer device * * * Returns void * ******************************************************************************/ void bta_sys_app_open(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_APP_OPEN, id, app_id, peer_addr); } } /******************************************************************************* * * Function bta_sys_app_close * * Description Called by BTA subsystems when application initiates close * of connection to peer device * * Returns void * ******************************************************************************/ void bta_sys_app_close(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_APP_CLOSE, id, app_id, peer_addr); } } /******************************************************************************* * * Function bta_sys_sco_open * * Description Called by BTA subsystems when sco connection for that * service is open * * Returns void * ******************************************************************************/ void bta_sys_sco_open(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { /* AG triggers p_sco_cb by bta_sys_sco_use. */ if ((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) { /* without querying BTM_GetNumScoLinks() */ bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr); } if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_SCO_OPEN, id, app_id, peer_addr); } } /******************************************************************************* * * Function bta_sys_sco_close * * Description Called by BTA subsystems when sco connection for that * service is closed * * Returns void * ******************************************************************************/ void bta_sys_sco_close(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { uint8_t num_sco_links; if ((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) { num_sco_links = BTM_GetNumScoLinks(); bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr); } if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_SCO_CLOSE, id, app_id, peer_addr); } } /******************************************************************************* * * Function bta_sys_sco_use * * Description Called by BTA subsystems when that service needs to use sco. * * * Returns void * ******************************************************************************/ void bta_sys_sco_use(UNUSED_ATTR uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { /* AV streaming need to be suspended before SCO is connected. */ if (bta_sys_cb.p_sco_cb) { /* without querying BTM_GetNumScoLinks() */ bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr); } } /******************************************************************************* * * Function bta_sys_sco_unuse * * Description Called by BTA subsystems when sco connection for that * service is no longer needed. * * Returns void * ******************************************************************************/ void bta_sys_sco_unuse(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { if ((bta_sys_cb.p_sco_cb)) { uint8_t num_sco_links = BTM_GetNumScoLinks(); bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr); } } /******************************************************************************* * * Function bta_sys_chg_ssr_config * * Description Called by BTA subsystems to indicate that the given app SSR * setting needs to be changed. * * Returns void * ******************************************************************************/ void bta_sys_chg_ssr_config(uint8_t id, uint8_t app_id, uint16_t max_latency, uint16_t min_tout) { if (bta_sys_cb.p_ssr_cb) { bta_sys_cb.p_ssr_cb(id, app_id, max_latency, min_tout); } } /******************************************************************************* * * Function bta_sys_idle * * Description Called by BTA subsystems to indicate that the connection to * peer device is idle * * Returns void * ******************************************************************************/ void bta_sys_idle(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { if (bta_sys_cb.prm_cb) { bta_sys_cb.prm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr); } if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr); } } /******************************************************************************* * * Function bta_sys_busy * * Description Called by BTA subsystems to indicate that the connection to * peer device is busy * * Returns void * ******************************************************************************/ void bta_sys_busy(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) { if (bta_sys_cb.prm_cb) { bta_sys_cb.prm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr); } if (bta_sys_cb.ppm_cb) { bta_sys_cb.ppm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr); } } #if (BTA_EIR_CANNED_UUID_LIST != TRUE) /******************************************************************************* * * Function bta_sys_eir_register * * Description Called by BTA DM to register EIR utility function that can * be used by the other BTA modules to add/remove UUID. * * Returns void * ******************************************************************************/ void bta_sys_eir_register(tBTA_SYS_EIR_CBACK* p_cback) { bta_sys_cb.eir_cb = p_cback; } /******************************************************************************* * * Function bta_sys_cust_eir_register * * Description Called by BTA DM to register EIR utility function that can * be used by the other BTA modules to add/remove custom UUID. * * Returns void * ******************************************************************************/ void bta_sys_cust_eir_register(tBTA_SYS_CUST_EIR_CBACK* p_cback) { bta_sys_cb.cust_eir_cb = p_cback; } /******************************************************************************* * * Function bta_sys_add_uuid * * Description Called by BTA subsystems to indicate to DM that new service * class UUID is added. * * Returns void * ******************************************************************************/ void bta_sys_add_uuid(uint16_t uuid16) { if (bta_sys_cb.eir_cb) { bta_sys_cb.eir_cb(uuid16, true); } } /******************************************************************************* * * Function bta_sys_remove_uuid * * Description Called by BTA subsystems to indicate to DM that the service * class UUID is removed. * * Returns void * ******************************************************************************/ void bta_sys_remove_uuid(uint16_t uuid16) { if (bta_sys_cb.eir_cb) { bta_sys_cb.eir_cb(uuid16, false); } } /******************************************************************************* * * Function bta_sys_add_cust_uuid * * Description Called by BTA subsystems to indicate to DM that the custom service * class UUID is removed. * * Returns void * ******************************************************************************/ void bta_sys_add_cust_uuid(const tBTA_CUSTOM_UUID& curr) { if (bta_sys_cb.cust_eir_cb) { bta_sys_cb.cust_eir_cb(curr, true); } } /******************************************************************************* * * Function bta_sys_remove_cust_uuid * * Description Called by BTA subsystems to indicate to DM that the service * class UUID is removed. * * Returns void * ******************************************************************************/ void bta_sys_remove_cust_uuid(const tBTA_CUSTOM_UUID& curr) { if (bta_sys_cb.cust_eir_cb) { bta_sys_cb.cust_eir_cb(curr, false); } } #endif