/******************************************************************************* ** ** Function bta_hd_sm_execute ** ** Description State machine event handling function for HID Device ** ** Returns void ** *******************************************************************************/ void bta_hd_sm_execute(UINT16 event, tBTA_HD_DATA * p_data) { tBTA_HD_ST_TBL state_table; tBTA_HD_STATE prev_state; UINT8 action; tBTA_HD cback_data; tBTA_HD_EVT cback_event = 0; APPL_TRACE_EVENT5("%s: state=%s (%d) event=%s (%d)", __FUNCTION__, bta_hd_state_code(bta_hd_cb.state), bta_hd_cb.state, bta_hd_evt_code(event), event); prev_state = bta_hd_cb.state; memset(&cback_data, 0, sizeof(tBTA_HD)); state_table = bta_hd_st_tbl[bta_hd_cb.state]; event &= 0xff; if ((action = state_table[event][BTA_HD_ACTION]) != BTA_HD_IGNORE) { (*bta_hd_action[action])(p_data); } bta_hd_cb.state = state_table[event][BTA_HD_NEXT_STATE] ; if (bta_hd_cb.state != prev_state) { APPL_TRACE_EVENT3("%s: [new] state=%s (%d)", __FUNCTION__, bta_hd_state_code(bta_hd_cb.state), bta_hd_cb.state); } return; }
/******************************************************************************* ** ** Function bta_ag_sm_execute ** ** Description State machine event handling function for AG ** ** ** Returns void ** *******************************************************************************/ void bta_ag_sm_execute(tBTA_AG_SCB *p_scb, UINT16 event, tBTA_AG_DATA *p_data) { tBTA_AG_ST_TBL state_table; UINT8 action; int i; #if BTA_AG_DEBUG == TRUE UINT16 in_event = event; UINT8 in_state = p_scb->state; /* Ignore displaying of AT results when not connected (Ignored in state machine) */ if (in_event != BTA_AG_API_RESULT_EVT || p_scb->state == BTA_AG_OPEN_ST) { APPL_TRACE_EVENT5("AG evt (hdl 0x%04x): State %d (%s), Event 0x%04x (%s)", bta_ag_scb_to_idx(p_scb), p_scb->state, bta_ag_state_str(p_scb->state), event, bta_ag_evt_str(event, p_data->api_result.result)); } #else APPL_TRACE_EVENT3("AG evt (hdl 0x%04x): State %d, Event 0x%04x", bta_ag_scb_to_idx(p_scb), p_scb->state, event); #endif event &= 0x00FF; if (event >= (BTA_AG_MAX_EVT & 0x00FF)) { APPL_TRACE_ERROR0("AG evt out of range, ignoring..."); return; } /* look up the state table for the current state */ state_table = bta_ag_st_tbl[p_scb->state]; /* set next state */ p_scb->state = state_table[event][BTA_AG_NEXT_STATE]; /* execute action functions */ for (i = 0; i < BTA_AG_ACTIONS; i++) { if ((action = state_table[event][i]) != BTA_AG_IGNORE) { (*bta_ag_action[action])(p_scb, p_data); } else { break; } } #if BTA_AG_DEBUG == TRUE if (p_scb->state != in_state) { APPL_TRACE_EVENT3("BTA AG State Change: [%s] -> [%s] after Event [%s]", bta_ag_state_str(in_state), bta_ag_state_str(p_scb->state), bta_ag_evt_str(in_event, p_data->api_result.result)); } #endif }