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