1981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*
2981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * fsm.c
3981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *
4981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
5981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * All rights reserved.
6981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *
7981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * Redistribution and use in source and binary forms, with or without
8981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * modification, are permitted provided that the following conditions
9981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * are met:
10981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *
11981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *  * Redistributions of source code must retain the above copyright
12981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    notice, this list of conditions and the following disclaimer.
13981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *  * Redistributions in binary form must reproduce the above copyright
14981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    notice, this list of conditions and the following disclaimer in
15981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    the documentation and/or other materials provided with the
16981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    distribution.
17981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *  * Neither the name Texas Instruments nor the names of its
18981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    contributors may be used to endorse or promote products derived
19981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *    from this software without specific prior written permission.
20981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *
21981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt */
33981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
34981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/** \file fsm.c
35981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *  \brief finite state machine source code
36981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *
37981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt *  \see fsm.h
38981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt */
39981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
40981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
41981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/***************************************************************************/
42981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*																		   */
43981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*		MODULE:	fsm.c													   */
44981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*    PURPOSE:	Finite State Machine source code						   */
45981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/*																	 	   */
46981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/***************************************************************************/
47981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
48981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#define __FILE_ID__  FILE_ID_127
49981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "tidef.h"
50981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "osApi.h"
51981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "report.h"
52981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt#include "fsm.h"
53981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
54981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Constants */
55981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
56981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Enumerations */
57981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
58981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Typedefs */
59981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
60981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Structures */
61981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
62981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* External data definitions */
63981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
64981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* External functions definitions */
65981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
66981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/* Function prototypes */
67981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
68981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
69981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
70981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* fsm_Init  - Initialize the FSM structure
71981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
72981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
73981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
74981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Init The FSM structure. If matrix argument is NULL, allocate memory for
75981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* new matrix.
76981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
77981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
78981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
79981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  O   - pFsm - the generated FSM module  \n
80981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - noOfStates - Number of states in the module \n
81981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - noOfStates - Number of events in the module \n
82981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I/O - matrix - the state event matrix
83981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - transFunc - Transition finction for the state machine \n
84981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
85981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
86981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
87981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK on success, TI_NOK on failure
88981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
89981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa fsm_Event
90981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
91981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS fsm_Create(TI_HANDLE				hOs,
92981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				fsm_stateMachine_t		**pFsm,
93981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				TI_UINT8					MaxNoOfStates,
94981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				TI_UINT8					MaxNoOfEvents)
95981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
96981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* check for perliminary conditions */
97981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if ((pFsm == NULL) || (MaxNoOfStates == 0) || (MaxNoOfEvents == 0))
98981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
99981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
100981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
101981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
102981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* allocate memory for FSM context */
103981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	*pFsm = (fsm_stateMachine_t *)os_memoryAlloc(hOs, sizeof(fsm_stateMachine_t));
104981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if (*pFsm == NULL)
105981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
106981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
107981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
108446aa7f3a3944c64e482173f23a10dcc165c7367Dmitry Shmidt	os_memoryZero(hOs, (*pFsm), sizeof(fsm_stateMachine_t));
109981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
110981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* allocate memory for FSM matrix */
111981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	(*pFsm)->stateEventMatrix = (fsm_Matrix_t)os_memoryAlloc(hOs, MaxNoOfStates * MaxNoOfEvents * sizeof(fsm_actionCell_t));
112981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if ((*pFsm)->stateEventMatrix == NULL)
113981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
114981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		os_memoryFree(hOs, *pFsm, sizeof(fsm_stateMachine_t));
115981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
116981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
117446aa7f3a3944c64e482173f23a10dcc165c7367Dmitry Shmidt	os_memoryZero(hOs, (*pFsm)->stateEventMatrix,
118446aa7f3a3944c64e482173f23a10dcc165c7367Dmitry Shmidt		(MaxNoOfStates * MaxNoOfEvents * sizeof(fsm_actionCell_t)));
119981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* update pFsm structure with parameters */
120981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	(*pFsm)->MaxNoOfStates = MaxNoOfStates;
121981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	(*pFsm)->MaxNoOfEvents = MaxNoOfEvents;
122981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
123981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	return(TI_OK);
124981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
125981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
126981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
127981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
128981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* fsm_Unload  - free all memory allocated to FSM structure
129981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
130981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
131981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
132981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Unload the FSM structure.
133981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
134981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
135981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
136981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  O   - pFsm - the generated FSM module  \n
137981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - noOfStates - Number of states in the module \n
138981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - noOfStates - Number of events in the module \n
139981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I/O - matrix - the state event matrix
140981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - transFunc - Transition finction for the state machine \n
141981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
142981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
143981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
144981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK on success, TI_NOK on failure
145981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
146981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa fsm_Event
147981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
148981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS fsm_Unload(TI_HANDLE				hOs,
149981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				fsm_stateMachine_t		*pFsm)
150981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
151981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* check for perliminary conditions */
152981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if (pFsm == NULL)
153981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
154981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
155981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
156981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
157981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* free memory of FSM matrix */
158981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if (pFsm->stateEventMatrix != NULL)
159981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
160981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		os_memoryFree(hOs, pFsm->stateEventMatrix,
161981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt					  pFsm->MaxNoOfStates * pFsm->MaxNoOfEvents * sizeof(fsm_actionCell_t));
162981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
163981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
164981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* free memory for FSM context (no need to check for null) */
165981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	os_memoryFree(hOs, pFsm, sizeof(fsm_stateMachine_t));
166981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
167981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	return(TI_OK);
168981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
169981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
170981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
171981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
172981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* fsm_Init  - Initialize the FSM structure
173981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
174981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
175981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
176981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Init The FSM structure. If matrix argument is NULL, allocate memory for
177981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* new matrix.
178981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
179981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
180981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
181981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  O   - pFsm - the generated FSM module  \n
182981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - noOfStates - Number of states in the module \n
183981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - noOfStates - Number of events in the module \n
184981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I/O - matrix - the state event matrix
185981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - transFunc - Transition finction for the state machine \n
186981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
187981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
188981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
189981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK on success, TI_NOK on failure
190981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
191981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa fsm_Event
192981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
193981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS fsm_Config(fsm_stateMachine_t	*pFsm,
194981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				  fsm_Matrix_t			pMatrix,
195981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				  TI_UINT8					ActiveNoOfStates,
196981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				  TI_UINT8					ActiveNoOfEvents,
197981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				  fsm_eventActivation_t	transFunc,
198981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				  TI_HANDLE				hOs)
199981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
200981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* check for perliminary conditions */
201981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if ((pFsm == NULL) ||
202981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		(pMatrix == NULL))
203981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
204981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
205981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
206981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
207981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if ((ActiveNoOfStates > pFsm->MaxNoOfStates) ||
208981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		(ActiveNoOfEvents > pFsm->MaxNoOfEvents))
209981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
210981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return TI_NOK;
211981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
212981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
213981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* copy matrix to FSM context */
214981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	os_memoryCopy(hOs, (void *)pFsm->stateEventMatrix, (void *)pMatrix,
215981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				  ActiveNoOfStates * ActiveNoOfEvents * sizeof(fsm_actionCell_t));
216981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
217981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* update pFsm structure with parameters */
218981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	pFsm->ActiveNoOfStates = ActiveNoOfStates;
219981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	pFsm->ActiveNoOfEvents = ActiveNoOfEvents;
220981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	pFsm->transitionFunc = transFunc;
221981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	return(TI_OK);
222981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
223981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
224981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
225981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
226981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* fsm_Event  - perform event transition in the matrix
227981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
228981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
229981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
230981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Perform event transition in the matrix
231981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
232981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
233981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
234981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - pFsm - the generated FSM module  \n
235981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I/O - currentState - current state of the SM \n
236981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - event - event causing transition \n
237981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - pData - data for activation function \n
238981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
239981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
240981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
241981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK on success, TI_NOK on failure
242981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
243981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa fsm_Init
244981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
245981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS fsm_Event(fsm_stateMachine_t		*pFsm,
246981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				 TI_UINT8					*currentState,
247981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				 TI_UINT8					event,
248981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt				 void					*pData)
249981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
250981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	TI_UINT8		oldState;
251981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	TI_STATUS		status;
252981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
253981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* check for FSM existance */
254981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if (pFsm == NULL)
255981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
256981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return(TI_NOK);
257981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
258981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
259981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* boundary check */
260981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if ((*currentState >= pFsm->ActiveNoOfStates) || (event >= pFsm->ActiveNoOfEvents))
261981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
262981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		return(TI_NOK);
263981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
264981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
265981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	oldState = *currentState;
266981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* update current state */
267981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	*currentState = pFsm->stateEventMatrix[(*currentState * pFsm->ActiveNoOfEvents) + event].nextState;
268981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
269981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	/* activate transition function */
270446aa7f3a3944c64e482173f23a10dcc165c7367Dmitry Shmidt	if( !(*pFsm->stateEventMatrix[(oldState * pFsm->ActiveNoOfEvents) + event].actionFunc) ) {
271446aa7f3a3944c64e482173f23a10dcc165c7367Dmitry Shmidt		return(TI_NOK);
272446aa7f3a3944c64e482173f23a10dcc165c7367Dmitry Shmidt	}
273981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	status = (*pFsm->stateEventMatrix[(oldState * pFsm->ActiveNoOfEvents) + event].actionFunc)(pData);
274981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
275981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	return status;
276981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
277981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
278981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
279981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt/**
280981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
281981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* fsm_GetNextState  - Retrun the next state for a given current state and an event.
282981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
283981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b Description:
284981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
285981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* Retrun the next state for a given current state and an event.
286981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
287981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b ARGS:
288981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
289981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - pFsm - the generated FSM module  \n
290981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - currentState - current state of the SM \n
291981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  I   - event - event causing transition \n
292981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  O   - nextState - returned next state \n
293981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
294981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \b RETURNS:
295981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
296981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*  TI_OK on success, TI_NOK on failure
297981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*
298981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt* \sa
299981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt*/
300981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS fsm_GetNextState(fsm_stateMachine_t		*pFsm,
301981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt						TI_UINT8					currentState,
302981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt						TI_UINT8					event,
303981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt						TI_UINT8					*nextState)
304981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
305981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	if (pFsm != NULL)
306981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	{
307981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		if ((currentState < pFsm->ActiveNoOfStates) && (event < pFsm->ActiveNoOfEvents))
308981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		{
309981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt			*nextState = pFsm->stateEventMatrix[(currentState * pFsm->ActiveNoOfEvents) + event].nextState;
310981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt			return(TI_OK);
311981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt		}
312981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	}
313981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
314981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	return(TI_NOK);
315981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
316981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt
317981801b95b81e6d1c7a2085967406e86af0f08fcDmitry ShmidtTI_STATUS action_nop(void *pData)
318981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt{
319981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt	return TI_OK;
320981801b95b81e6d1c7a2085967406e86af0f08fcDmitry Shmidt}
321