164064216a8433360745f69edddce19a606659163The Android Open Source Project/** \file fsm.c
264064216a8433360745f69edddce19a606659163The Android Open Source Project *  \brief finite state machine source code
364064216a8433360745f69edddce19a606659163The Android Open Source Project *
464064216a8433360745f69edddce19a606659163The Android Open Source Project *  \see fsm.h
564064216a8433360745f69edddce19a606659163The Android Open Source Project */
664064216a8433360745f69edddce19a606659163The Android Open Source Project
764064216a8433360745f69edddce19a606659163The Android Open Source Project/****************************************************************************
864064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
964064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1064064216a8433360745f69edddce19a606659163The Android Open Source Project**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
1164064216a8433360745f69edddce19a606659163The Android Open Source Project**| All rights reserved.                                                  |**
1264064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1364064216a8433360745f69edddce19a606659163The Android Open Source Project**| Redistribution and use in source and binary forms, with or without    |**
1464064216a8433360745f69edddce19a606659163The Android Open Source Project**| modification, are permitted provided that the following conditions    |**
1564064216a8433360745f69edddce19a606659163The Android Open Source Project**| are met:                                                              |**
1664064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
1764064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions of source code must retain the above copyright     |**
1864064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer.      |**
1964064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Redistributions in binary form must reproduce the above copyright  |**
2064064216a8433360745f69edddce19a606659163The Android Open Source Project**|    notice, this list of conditions and the following disclaimer in    |**
2164064216a8433360745f69edddce19a606659163The Android Open Source Project**|    the documentation and/or other materials provided with the         |**
2264064216a8433360745f69edddce19a606659163The Android Open Source Project**|    distribution.                                                      |**
2364064216a8433360745f69edddce19a606659163The Android Open Source Project**|  * Neither the name Texas Instruments nor the names of its            |**
2464064216a8433360745f69edddce19a606659163The Android Open Source Project**|    contributors may be used to endorse or promote products derived    |**
2564064216a8433360745f69edddce19a606659163The Android Open Source Project**|    from this software without specific prior written permission.      |**
2664064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
2764064216a8433360745f69edddce19a606659163The Android Open Source Project**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
2864064216a8433360745f69edddce19a606659163The Android Open Source Project**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
2964064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
3064064216a8433360745f69edddce19a606659163The Android Open Source Project**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
3164064216a8433360745f69edddce19a606659163The Android Open Source Project**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
3264064216a8433360745f69edddce19a606659163The Android Open Source Project**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
3364064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
3464064216a8433360745f69edddce19a606659163The Android Open Source Project**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
3564064216a8433360745f69edddce19a606659163The Android Open Source Project**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
3664064216a8433360745f69edddce19a606659163The Android Open Source Project**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
3764064216a8433360745f69edddce19a606659163The Android Open Source Project**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
3864064216a8433360745f69edddce19a606659163The Android Open Source Project**|                                                                       |**
3964064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+**
4064064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************/
4164064216a8433360745f69edddce19a606659163The Android Open Source Project
4264064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************/
4364064216a8433360745f69edddce19a606659163The Android Open Source Project/*																		   */
4464064216a8433360745f69edddce19a606659163The Android Open Source Project/*		MODULE:	fsm.c													   */
4564064216a8433360745f69edddce19a606659163The Android Open Source Project/*    PURPOSE:	Finite State Machine source code						   */
4664064216a8433360745f69edddce19a606659163The Android Open Source Project/*																	 	   */
4764064216a8433360745f69edddce19a606659163The Android Open Source Project/***************************************************************************/
4864064216a8433360745f69edddce19a606659163The Android Open Source Project
4964064216a8433360745f69edddce19a606659163The Android Open Source Project#include "osTIType.h"
5064064216a8433360745f69edddce19a606659163The Android Open Source Project#include "osApi.h"
5164064216a8433360745f69edddce19a606659163The Android Open Source Project#include "utils.h"
5264064216a8433360745f69edddce19a606659163The Android Open Source Project#include "report.h"
5364064216a8433360745f69edddce19a606659163The Android Open Source Project#include "fsm.h"
5464064216a8433360745f69edddce19a606659163The Android Open Source Project
5564064216a8433360745f69edddce19a606659163The Android Open Source Project/* Constants */
5664064216a8433360745f69edddce19a606659163The Android Open Source Project
5764064216a8433360745f69edddce19a606659163The Android Open Source Project/* Enumerations */
5864064216a8433360745f69edddce19a606659163The Android Open Source Project
5964064216a8433360745f69edddce19a606659163The Android Open Source Project/* Typedefs */
6064064216a8433360745f69edddce19a606659163The Android Open Source Project
6164064216a8433360745f69edddce19a606659163The Android Open Source Project/* Structures */
6264064216a8433360745f69edddce19a606659163The Android Open Source Project
6364064216a8433360745f69edddce19a606659163The Android Open Source Project/* External data definitions */
6464064216a8433360745f69edddce19a606659163The Android Open Source Project
6564064216a8433360745f69edddce19a606659163The Android Open Source Project/* External functions definitions */
6664064216a8433360745f69edddce19a606659163The Android Open Source Project
6764064216a8433360745f69edddce19a606659163The Android Open Source Project/* Function prototypes */
6864064216a8433360745f69edddce19a606659163The Android Open Source Project
6964064216a8433360745f69edddce19a606659163The Android Open Source Project/**
7064064216a8433360745f69edddce19a606659163The Android Open Source Project*
7164064216a8433360745f69edddce19a606659163The Android Open Source Project* fsm_Init  - Initialize the FSM structure
7264064216a8433360745f69edddce19a606659163The Android Open Source Project*
7364064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
7464064216a8433360745f69edddce19a606659163The Android Open Source Project*
7564064216a8433360745f69edddce19a606659163The Android Open Source Project* Init The FSM structure. If matrix argument is NULL, allocate memory for
7664064216a8433360745f69edddce19a606659163The Android Open Source Project* new matrix.
7764064216a8433360745f69edddce19a606659163The Android Open Source Project*
7864064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
7964064216a8433360745f69edddce19a606659163The Android Open Source Project*
8064064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - pFsm - the generated FSM module  \n
8164064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - noOfStates - Number of states in the module \n
8264064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - noOfStates - Number of events in the module \n
8364064216a8433360745f69edddce19a606659163The Android Open Source Project*  I/O - matrix - the state event matrix
8464064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - transFunc - Transition finction for the state machine \n
8564064216a8433360745f69edddce19a606659163The Android Open Source Project*
8664064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
8764064216a8433360745f69edddce19a606659163The Android Open Source Project*
8864064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on success, NOK on failure
8964064216a8433360745f69edddce19a606659163The Android Open Source Project*
9064064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa fsm_Event
9164064216a8433360745f69edddce19a606659163The Android Open Source Project*/
9264064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS fsm_Create(TI_HANDLE				hOs,
9364064216a8433360745f69edddce19a606659163The Android Open Source Project				fsm_stateMachine_t		**pFsm,
9464064216a8433360745f69edddce19a606659163The Android Open Source Project				UINT8					MaxNoOfStates,
9564064216a8433360745f69edddce19a606659163The Android Open Source Project				UINT8					MaxNoOfEvents)
9664064216a8433360745f69edddce19a606659163The Android Open Source Project{
9764064216a8433360745f69edddce19a606659163The Android Open Source Project	/* check for perliminary conditions */
9864064216a8433360745f69edddce19a606659163The Android Open Source Project	if ((pFsm == NULL) || (MaxNoOfStates == 0) || (MaxNoOfEvents == 0))
9964064216a8433360745f69edddce19a606659163The Android Open Source Project	{
10064064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
10164064216a8433360745f69edddce19a606659163The Android Open Source Project	}
10264064216a8433360745f69edddce19a606659163The Android Open Source Project
10364064216a8433360745f69edddce19a606659163The Android Open Source Project	/* allocate memory for FSM context */
10464064216a8433360745f69edddce19a606659163The Android Open Source Project	*pFsm = (fsm_stateMachine_t *)os_memoryAlloc(hOs, sizeof(fsm_stateMachine_t));
10564064216a8433360745f69edddce19a606659163The Android Open Source Project	if (*pFsm == NULL)
10664064216a8433360745f69edddce19a606659163The Android Open Source Project	{
10764064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
10864064216a8433360745f69edddce19a606659163The Android Open Source Project	}
10964064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryZero(hOs, (*pFsm), sizeof(fsm_stateMachine_t)); /* Dm: Fix */
11064064216a8433360745f69edddce19a606659163The Android Open Source Project
11164064216a8433360745f69edddce19a606659163The Android Open Source Project	/* allocate memory for FSM matrix */
11264064216a8433360745f69edddce19a606659163The Android Open Source Project	(*pFsm)->stateEventMatrix = (fsm_Matrix_t)os_memoryAlloc(hOs, MaxNoOfStates * MaxNoOfEvents * sizeof(fsm_actionCell_t));
11364064216a8433360745f69edddce19a606659163The Android Open Source Project	if ((*pFsm)->stateEventMatrix == NULL)
11464064216a8433360745f69edddce19a606659163The Android Open Source Project	{
11564064216a8433360745f69edddce19a606659163The Android Open Source Project		os_memoryFree(hOs, *pFsm, sizeof(fsm_stateMachine_t));
11664064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
11764064216a8433360745f69edddce19a606659163The Android Open Source Project	}
11864064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryZero(hOs, (*pFsm)->stateEventMatrix,
11964064216a8433360745f69edddce19a606659163The Android Open Source Project		(MaxNoOfStates * MaxNoOfEvents * sizeof(fsm_actionCell_t)));
12064064216a8433360745f69edddce19a606659163The Android Open Source Project	/* update pFsm structure with parameters */
12164064216a8433360745f69edddce19a606659163The Android Open Source Project	(*pFsm)->MaxNoOfStates = MaxNoOfStates;
12264064216a8433360745f69edddce19a606659163The Android Open Source Project	(*pFsm)->MaxNoOfEvents = MaxNoOfEvents;
12364064216a8433360745f69edddce19a606659163The Android Open Source Project
12464064216a8433360745f69edddce19a606659163The Android Open Source Project	return(OK);
12564064216a8433360745f69edddce19a606659163The Android Open Source Project}
12664064216a8433360745f69edddce19a606659163The Android Open Source Project
12764064216a8433360745f69edddce19a606659163The Android Open Source Project/**
12864064216a8433360745f69edddce19a606659163The Android Open Source Project*
12964064216a8433360745f69edddce19a606659163The Android Open Source Project* fsm_Unload  - free all memory allocated to FSM structure
13064064216a8433360745f69edddce19a606659163The Android Open Source Project*
13164064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
13264064216a8433360745f69edddce19a606659163The Android Open Source Project*
13364064216a8433360745f69edddce19a606659163The Android Open Source Project* Unload the FSM structure.
13464064216a8433360745f69edddce19a606659163The Android Open Source Project*
13564064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
13664064216a8433360745f69edddce19a606659163The Android Open Source Project*
13764064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - pFsm - the generated FSM module  \n
13864064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - noOfStates - Number of states in the module \n
13964064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - noOfStates - Number of events in the module \n
14064064216a8433360745f69edddce19a606659163The Android Open Source Project*  I/O - matrix - the state event matrix
14164064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - transFunc - Transition finction for the state machine \n
14264064216a8433360745f69edddce19a606659163The Android Open Source Project*
14364064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
14464064216a8433360745f69edddce19a606659163The Android Open Source Project*
14564064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on success, NOK on failure
14664064216a8433360745f69edddce19a606659163The Android Open Source Project*
14764064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa fsm_Event
14864064216a8433360745f69edddce19a606659163The Android Open Source Project*/
14964064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS fsm_Unload(TI_HANDLE				hOs,
15064064216a8433360745f69edddce19a606659163The Android Open Source Project				fsm_stateMachine_t		*pFsm)
15164064216a8433360745f69edddce19a606659163The Android Open Source Project{
15264064216a8433360745f69edddce19a606659163The Android Open Source Project	/* check for perliminary conditions */
15364064216a8433360745f69edddce19a606659163The Android Open Source Project	if (pFsm == NULL)
15464064216a8433360745f69edddce19a606659163The Android Open Source Project	{
15564064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
15664064216a8433360745f69edddce19a606659163The Android Open Source Project	}
15764064216a8433360745f69edddce19a606659163The Android Open Source Project
15864064216a8433360745f69edddce19a606659163The Android Open Source Project	/* free memory of FSM matrix */
15964064216a8433360745f69edddce19a606659163The Android Open Source Project	if (pFsm->stateEventMatrix != NULL)
16064064216a8433360745f69edddce19a606659163The Android Open Source Project	{
16164064216a8433360745f69edddce19a606659163The Android Open Source Project		os_memoryFree(hOs, pFsm->stateEventMatrix,
16264064216a8433360745f69edddce19a606659163The Android Open Source Project					  pFsm->MaxNoOfStates * pFsm->MaxNoOfEvents * sizeof(fsm_actionCell_t));
16364064216a8433360745f69edddce19a606659163The Android Open Source Project	}
16464064216a8433360745f69edddce19a606659163The Android Open Source Project
16564064216a8433360745f69edddce19a606659163The Android Open Source Project	/* free memory for FSM context (no need to check for null) */
16664064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryFree(hOs, pFsm, sizeof(fsm_stateMachine_t));
16764064216a8433360745f69edddce19a606659163The Android Open Source Project
16864064216a8433360745f69edddce19a606659163The Android Open Source Project	return(OK);
16964064216a8433360745f69edddce19a606659163The Android Open Source Project}
17064064216a8433360745f69edddce19a606659163The Android Open Source Project
17164064216a8433360745f69edddce19a606659163The Android Open Source Project/**
17264064216a8433360745f69edddce19a606659163The Android Open Source Project*
17364064216a8433360745f69edddce19a606659163The Android Open Source Project* fsm_Init  - Initialize the FSM structure
17464064216a8433360745f69edddce19a606659163The Android Open Source Project*
17564064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
17664064216a8433360745f69edddce19a606659163The Android Open Source Project*
17764064216a8433360745f69edddce19a606659163The Android Open Source Project* Init The FSM structure. If matrix argument is NULL, allocate memory for
17864064216a8433360745f69edddce19a606659163The Android Open Source Project* new matrix.
17964064216a8433360745f69edddce19a606659163The Android Open Source Project*
18064064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
18164064216a8433360745f69edddce19a606659163The Android Open Source Project*
18264064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - pFsm - the generated FSM module  \n
18364064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - noOfStates - Number of states in the module \n
18464064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - noOfStates - Number of events in the module \n
18564064216a8433360745f69edddce19a606659163The Android Open Source Project*  I/O - matrix - the state event matrix
18664064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - transFunc - Transition finction for the state machine \n
18764064216a8433360745f69edddce19a606659163The Android Open Source Project*
18864064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
18964064216a8433360745f69edddce19a606659163The Android Open Source Project*
19064064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on success, NOK on failure
19164064216a8433360745f69edddce19a606659163The Android Open Source Project*
19264064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa fsm_Event
19364064216a8433360745f69edddce19a606659163The Android Open Source Project*/
19464064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS fsm_Config(fsm_stateMachine_t	*pFsm,
19564064216a8433360745f69edddce19a606659163The Android Open Source Project				  fsm_Matrix_t			pMatrix,
19664064216a8433360745f69edddce19a606659163The Android Open Source Project				  UINT8					ActiveNoOfStates,
19764064216a8433360745f69edddce19a606659163The Android Open Source Project				  UINT8					ActiveNoOfEvents,
19864064216a8433360745f69edddce19a606659163The Android Open Source Project				  fsm_eventActivation_t	transFunc,
19964064216a8433360745f69edddce19a606659163The Android Open Source Project				  TI_HANDLE				hOs)
20064064216a8433360745f69edddce19a606659163The Android Open Source Project{
20164064216a8433360745f69edddce19a606659163The Android Open Source Project	/* check for perliminary conditions */
20264064216a8433360745f69edddce19a606659163The Android Open Source Project	if ((pFsm == NULL) ||
20364064216a8433360745f69edddce19a606659163The Android Open Source Project		(pMatrix == NULL))
20464064216a8433360745f69edddce19a606659163The Android Open Source Project	{
20564064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
20664064216a8433360745f69edddce19a606659163The Android Open Source Project	}
20764064216a8433360745f69edddce19a606659163The Android Open Source Project
20864064216a8433360745f69edddce19a606659163The Android Open Source Project	if ((ActiveNoOfStates > pFsm->MaxNoOfStates) ||
20964064216a8433360745f69edddce19a606659163The Android Open Source Project		(ActiveNoOfEvents > pFsm->MaxNoOfEvents))
21064064216a8433360745f69edddce19a606659163The Android Open Source Project	{
21164064216a8433360745f69edddce19a606659163The Android Open Source Project		return NOK;
21264064216a8433360745f69edddce19a606659163The Android Open Source Project	}
21364064216a8433360745f69edddce19a606659163The Android Open Source Project
21464064216a8433360745f69edddce19a606659163The Android Open Source Project	/* copy matrix to FSM context */
21564064216a8433360745f69edddce19a606659163The Android Open Source Project	os_memoryCopy(hOs, (void *)pFsm->stateEventMatrix, (void *)pMatrix,
21664064216a8433360745f69edddce19a606659163The Android Open Source Project				  ActiveNoOfStates * ActiveNoOfEvents * sizeof(fsm_actionCell_t));
21764064216a8433360745f69edddce19a606659163The Android Open Source Project
21864064216a8433360745f69edddce19a606659163The Android Open Source Project	/* update pFsm structure with parameters */
21964064216a8433360745f69edddce19a606659163The Android Open Source Project	pFsm->ActiveNoOfStates = ActiveNoOfStates;
22064064216a8433360745f69edddce19a606659163The Android Open Source Project	pFsm->ActiveNoOfEvents = ActiveNoOfEvents;
22164064216a8433360745f69edddce19a606659163The Android Open Source Project	pFsm->transitionFunc = transFunc;
22264064216a8433360745f69edddce19a606659163The Android Open Source Project	return(OK);
22364064216a8433360745f69edddce19a606659163The Android Open Source Project}
22464064216a8433360745f69edddce19a606659163The Android Open Source Project
22564064216a8433360745f69edddce19a606659163The Android Open Source Project/**
22664064216a8433360745f69edddce19a606659163The Android Open Source Project*
22764064216a8433360745f69edddce19a606659163The Android Open Source Project* fsm_Event  - perform event transition in the matrix
22864064216a8433360745f69edddce19a606659163The Android Open Source Project*
22964064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
23064064216a8433360745f69edddce19a606659163The Android Open Source Project*
23164064216a8433360745f69edddce19a606659163The Android Open Source Project* Perform event transition in the matrix
23264064216a8433360745f69edddce19a606659163The Android Open Source Project*
23364064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
23464064216a8433360745f69edddce19a606659163The Android Open Source Project*
23564064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pFsm - the generated FSM module  \n
23664064216a8433360745f69edddce19a606659163The Android Open Source Project*  I/O - currentState - current state of the SM \n
23764064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - event - event causing transition \n
23864064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pData - data for activation function \n
23964064216a8433360745f69edddce19a606659163The Android Open Source Project*
24064064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
24164064216a8433360745f69edddce19a606659163The Android Open Source Project*
24264064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on success, NOK on failure
24364064216a8433360745f69edddce19a606659163The Android Open Source Project*
24464064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa fsm_Init
24564064216a8433360745f69edddce19a606659163The Android Open Source Project*/
24664064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS fsm_Event(fsm_stateMachine_t		*pFsm,
24764064216a8433360745f69edddce19a606659163The Android Open Source Project				 UINT8					*currentState,
24864064216a8433360745f69edddce19a606659163The Android Open Source Project				 UINT8					event,
24964064216a8433360745f69edddce19a606659163The Android Open Source Project				 void					*pData)
25064064216a8433360745f69edddce19a606659163The Android Open Source Project{
25164064216a8433360745f69edddce19a606659163The Android Open Source Project	UINT8		oldState;
25264064216a8433360745f69edddce19a606659163The Android Open Source Project	TI_STATUS		status;
25364064216a8433360745f69edddce19a606659163The Android Open Source Project
25464064216a8433360745f69edddce19a606659163The Android Open Source Project	/* check for FSM existance */
25564064216a8433360745f69edddce19a606659163The Android Open Source Project	if (pFsm == NULL)
25664064216a8433360745f69edddce19a606659163The Android Open Source Project	{
25764064216a8433360745f69edddce19a606659163The Android Open Source Project		return(NOK);
25864064216a8433360745f69edddce19a606659163The Android Open Source Project	}
25964064216a8433360745f69edddce19a606659163The Android Open Source Project
26064064216a8433360745f69edddce19a606659163The Android Open Source Project	/* boundary check */
26164064216a8433360745f69edddce19a606659163The Android Open Source Project	if ((*currentState >= pFsm->ActiveNoOfStates) || (event >= pFsm->ActiveNoOfEvents))
26264064216a8433360745f69edddce19a606659163The Android Open Source Project	{
26364064216a8433360745f69edddce19a606659163The Android Open Source Project		return(NOK);
26464064216a8433360745f69edddce19a606659163The Android Open Source Project	}
26564064216a8433360745f69edddce19a606659163The Android Open Source Project
26664064216a8433360745f69edddce19a606659163The Android Open Source Project	oldState = *currentState;
26764064216a8433360745f69edddce19a606659163The Android Open Source Project	/* update current state */
26864064216a8433360745f69edddce19a606659163The Android Open Source Project	*currentState = pFsm->stateEventMatrix[(*currentState * pFsm->ActiveNoOfEvents) + event].nextState;
26964064216a8433360745f69edddce19a606659163The Android Open Source Project
27064064216a8433360745f69edddce19a606659163The Android Open Source Project	/* activate transition function */
27164064216a8433360745f69edddce19a606659163The Android Open Source Project	if( !(*pFsm->stateEventMatrix[(oldState * pFsm->ActiveNoOfEvents) + event].actionFunc) ) {
27264064216a8433360745f69edddce19a606659163The Android Open Source Project	    return(NOK);
27364064216a8433360745f69edddce19a606659163The Android Open Source Project	}
27464064216a8433360745f69edddce19a606659163The Android Open Source Project	status = (*pFsm->stateEventMatrix[(oldState * pFsm->ActiveNoOfEvents) + event].actionFunc)(pData);
27564064216a8433360745f69edddce19a606659163The Android Open Source Project
27664064216a8433360745f69edddce19a606659163The Android Open Source Project	return status;
27764064216a8433360745f69edddce19a606659163The Android Open Source Project}
27864064216a8433360745f69edddce19a606659163The Android Open Source Project
27964064216a8433360745f69edddce19a606659163The Android Open Source Project
28064064216a8433360745f69edddce19a606659163The Android Open Source Project/**
28164064216a8433360745f69edddce19a606659163The Android Open Source Project*
28264064216a8433360745f69edddce19a606659163The Android Open Source Project* fsm_GetNextState  - Retrun the next state for a given current state and an event.
28364064216a8433360745f69edddce19a606659163The Android Open Source Project*
28464064216a8433360745f69edddce19a606659163The Android Open Source Project* \b Description:
28564064216a8433360745f69edddce19a606659163The Android Open Source Project*
28664064216a8433360745f69edddce19a606659163The Android Open Source Project* Retrun the next state for a given current state and an event.
28764064216a8433360745f69edddce19a606659163The Android Open Source Project*
28864064216a8433360745f69edddce19a606659163The Android Open Source Project* \b ARGS:
28964064216a8433360745f69edddce19a606659163The Android Open Source Project*
29064064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - pFsm - the generated FSM module  \n
29164064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - currentState - current state of the SM \n
29264064216a8433360745f69edddce19a606659163The Android Open Source Project*  I   - event - event causing transition \n
29364064216a8433360745f69edddce19a606659163The Android Open Source Project*  O   - nextState - returned next state \n
29464064216a8433360745f69edddce19a606659163The Android Open Source Project*
29564064216a8433360745f69edddce19a606659163The Android Open Source Project* \b RETURNS:
29664064216a8433360745f69edddce19a606659163The Android Open Source Project*
29764064216a8433360745f69edddce19a606659163The Android Open Source Project*  OK on success, NOK on failure
29864064216a8433360745f69edddce19a606659163The Android Open Source Project*
29964064216a8433360745f69edddce19a606659163The Android Open Source Project* \sa
30064064216a8433360745f69edddce19a606659163The Android Open Source Project*/
30164064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS fsm_GetNextState(fsm_stateMachine_t		*pFsm,
30264064216a8433360745f69edddce19a606659163The Android Open Source Project						UINT8					currentState,
30364064216a8433360745f69edddce19a606659163The Android Open Source Project						UINT8					event,
30464064216a8433360745f69edddce19a606659163The Android Open Source Project						UINT8					*nextState)
30564064216a8433360745f69edddce19a606659163The Android Open Source Project{
30664064216a8433360745f69edddce19a606659163The Android Open Source Project	if (pFsm != NULL)
30764064216a8433360745f69edddce19a606659163The Android Open Source Project	{
30864064216a8433360745f69edddce19a606659163The Android Open Source Project		if ((currentState < pFsm->ActiveNoOfStates) && (event < pFsm->ActiveNoOfEvents))
30964064216a8433360745f69edddce19a606659163The Android Open Source Project		{
31064064216a8433360745f69edddce19a606659163The Android Open Source Project			*nextState = pFsm->stateEventMatrix[(currentState * pFsm->ActiveNoOfEvents) + event].nextState;
31164064216a8433360745f69edddce19a606659163The Android Open Source Project			return(OK);
31264064216a8433360745f69edddce19a606659163The Android Open Source Project		}
31364064216a8433360745f69edddce19a606659163The Android Open Source Project	}
31464064216a8433360745f69edddce19a606659163The Android Open Source Project
31564064216a8433360745f69edddce19a606659163The Android Open Source Project	return(NOK);
31664064216a8433360745f69edddce19a606659163The Android Open Source Project}
31764064216a8433360745f69edddce19a606659163The Android Open Source Project
31864064216a8433360745f69edddce19a606659163The Android Open Source ProjectTI_STATUS action_nop(void *pData)
31964064216a8433360745f69edddce19a606659163The Android Open Source Project{
32064064216a8433360745f69edddce19a606659163The Android Open Source Project	return OK;
32164064216a8433360745f69edddce19a606659163The Android Open Source Project}
322