15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Filename: btif_sm.c 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Description: Generic BTIF state machine API 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bluetooth.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOG_TAG "BTIF_SM" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_common.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_sm.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants & Macros 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local type definitions 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct { 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_state_t state; 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_handler_t *p_handlers; 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_sm_cb_t; 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static variables 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static functions 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Externs 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Functions 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_sm_init 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initializes the state machine with the state handlers 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The caller should ensure that the table and the corresponding 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** states match. The location that 'p_handlers' points to shall 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** be available until the btif_sm_shutdown API is invoked. 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Returns a pointer to the initialized state machine handle. 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbtif_sm_handle_t btif_sm_init(const btif_sm_handler_t *p_handlers, btif_sm_state_t initial_state) 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_cb_t *p_cb; 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_handlers == NULL) 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 82e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s : p_handlers is NULL", __FUNCTION__); 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb = (btif_sm_cb_t*) GKI_os_malloc(sizeof(btif_sm_cb_t)); 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->state = initial_state; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_handlers = (btif_sm_handler_t*)p_handlers; 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send BTIF_SM_ENTER_EVT to the initial state */ 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_handlers[initial_state](BTIF_SM_ENTER_EVT, NULL); 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (btif_sm_handle_t)p_cb; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_sm_shutdown 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Tears down the state machine 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_sm_shutdown(btif_sm_handle_t handle) 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_cb_t *p_cb = (btif_sm_cb_t*)handle; 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb == NULL) 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 111e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__); 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_os_free((void*)p_cb); 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_sm_get_state 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Fetches the current state of the state machine 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Current state 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbtif_sm_state_t btif_sm_get_state(btif_sm_handle_t handle) 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_cb_t *p_cb = (btif_sm_cb_t*)handle; 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb == NULL) 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 132e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_cb->state; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_sm_dispatch 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Dispatches the 'event' along with 'data' to the current state handler 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BT_STATUS_SUCCESS on success 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BT_STATUS_UNHANDLED if event was not processed 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BT_STATUS_FAIL otherwise 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbt_status_t btif_sm_dispatch(btif_sm_handle_t handle, btif_sm_event_t event, 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *data) 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_status_t status = BT_STATUS_SUCCESS; 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_cb_t *p_cb = (btif_sm_cb_t*)handle; 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb == NULL) 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 159e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->p_handlers[p_cb->state](event, data) == FALSE) 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_UNHANDLED; 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_sm_change_state 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Make a transition to the new 'state'. The 'BTIF_SM_EXIT_EVT' 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** shall be invoked before exiting the current state. The 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 'BTIF_SM_ENTER_EVT' shall be invoked before entering the new state 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BT_STATUS_SUCCESS on success 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BT_STATUS_UNHANDLED if event was not processed 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BT_STATUS_FAIL otherwise 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbt_status_t btif_sm_change_state(btif_sm_handle_t handle, btif_sm_state_t state) 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_status_t status = BT_STATUS_SUCCESS; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_cb_t *p_cb = (btif_sm_cb_t*)handle; 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb == NULL) 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 189e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s : Invalid handle", __FUNCTION__); 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send exit event to the current state */ 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->p_handlers[p_cb->state](BTIF_SM_EXIT_EVT, NULL) == FALSE) 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BT_STATUS_UNHANDLED; 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Change to the new state */ 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->state = state; 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send enter event to the new state */ 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->p_handlers[p_cb->state](BTIF_SM_ENTER_EVT, NULL) == FALSE) 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BT_STATUS_UNHANDLED; 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 206