blob: bffe40ffd3ba02e59c3832c477ddd81b80e06a83 [file] [log] [blame]
/*************************************************************
*
* This Software is the property of VIA Telecom, Inc. and may only be used pursuant to a license from VIA Telecom, Inc.
*
* Any unauthorized use inconsistent with the terms of such license is strictly prohibited.
*
* Copyright (c) 1999-2010 VIA Telecom, Inc. All rights reserved.
*
*************************************************************/
/*************************************************************************
*
* File Name: fsm.h
* Project: ISOLIB C Library
* Original Author: Dale Ehman
* Creation Date: Aug. 26, 1997
*
* Description: Header for Generic FSM C Language implementation.
*
* Restrictions:
*
* Dependencies:
*
****************************************************************************
****************************************************************************
*
* RCS Log Information
*
* $Log: FSM.H $
*
* 06 29 2017 sue.zhong
* [MOLY00259241] [6293][C2K]Replace with KAL data type
* ::KAL type - folder inc
*
* 05 17 2017 peijun.zheng
* [MOLY00249027] [BIACNO][MT6763][New feature]C2K code release code modification
*
* C2k code release.
* Revision 1.3 2006/01/11 15:15:19 blee
* Added new state machine handler
* Revision 1.2 2004/03/25 12:08:47 fpeng
* Updated from 6.0 CP 2.5.0
* Revision 1.1 2003/05/12 15:38:44 fpeng
* Initial revision
* Revision 1.7 2003/05/02 14:35:59 sulinlow
* To add RLP BLOB params received from PS
* Revision 1.6 2002/06/06 13:12:20 chinh
* Changed and Added Copyright
* Revision 1.5 2002/05/30 09:31:36 mshaver
* The ARM 2.51 tools the compiler supports the alignment options :
* -zap1 which specifies that pointers to structs are assumed to be
* aligned on at least <struct minimal alignment> boundaries.
* -zat4 which specifies the minimal byte alignment for top-level static
* objects, such as global variables is 4 bytes.
* The ADS compiler does not support either of these alignment
* options. The only alignment option it supports is :
* -zas which specifies the minimum byte alignment for structures. This option will not be supported in future versions of the ADS
* tools.
* Therefore, to be compatible with both the ARM 2.51 tools and the
* ADS tools, the PACKED qualifier was removed from the FSM
* Descriptor Structure.
* Revision 1.4.1.2 2002/02/11 10:51:02 srodenba
* remove PACKED designator to make it work with ADS
* --- Added comments --- mshaver [2002/05/22 16:20:08Z]
* For the ARM 2.51 tools the compiler supports the alignment options :
* -zap1 which specifies that pointers to structs are assumed to be aligned on at least
* <struct minimal alignment> boundaries.
* -zat4 which specifies the minimal byte alignment for top-level static objects, such as global
* variables is 4 bytes.
* The ADS compiler does not support either of these alignment options. The only alignment
* option it supports is :
* -zas which specifies the minimum byte alignment for structures. This option will not be
* supported in future versions of the ADS tools.
*
* Therefore, to be compatible with both the ARM 2.51 tools and the ADS tools, the
* PACKED qualifier was removed from the FSM Descriptor Structure.
* Revision 1.4.1.1 2002/02/01 11:59:15 srodenba
* Duplicate revision
* Revision 1.4 2002/02/01 11:59:15 ameya
* Moved OTTS related definitions from this file to ottsdefs.h
* Revision 1.3 2001/10/19 13:54:49 ameya
* Changed all occurences of _packed to PACKED. Added definition of macro PACKED if undefined.
* Revision 1.2 2001/06/21 09:42:38 yfang
* supported RLP3
* Revision 1.1 2001/01/17 10:58:37 plabarbe
* Initial revision
* Revision 1.1 2000/10/24 14:11:13 fpeng
* Initial revision
* Revision 1.3 2000/08/24 00:07:10Z hhong
* Add #ifndef pair for COND_ST
* Revision 1.2 2000/05/12 00:53:51Z hhong
* Make FSM.h available to all data engines across the board from this spot.
* Revision 1.20 1999/07/21 21:17:37 msmith
* Corrected FSMEXTTRACEINFO for TOKEN tracing
*
* Revision 1.19 1999/06/26 00:26:03 ddoucett
* fixed the FSM_EXTTRACEINFO for case when TRACEON is not defined
*
* Revision 1.18 1999/06/14 23:06:08 bcassidy
* Changed to distinguish between token tracing and string tracing
*
* Revision 1.17 1999/06/09 23:04:44 msmith
* Reduced parm_struct size
*
* Revision 1.16 1999/06/07 22:50:39 ddoucett
* increaced the size of the MAX_PARM_STRUCT to 83
*
* Revision 1.15 1999/05/13 15:12:57 msmith
* Added support for tracing when TRACEON defined
*
*
* Revision 1.13 1998/10/06 17:08:13 bcassidy
* 1. Mods for circular queue operation.
* 2. Put queue size back to 5.
*
* Revision 1.12 1998/10/04 01:39:02 pjiang
* 1. Bump event Q size.
* [Temporary fix until FSM changed to circular Q operation.]
*
* Revision 1.11 1998/09/25 20:28:21 bcassidy
* 1. Mod setFSMTraceInfo proto.
*
* Revision 1.10 1998/08/28 14:57:42 bcassidy
* 1. Mods for multi-engine tracing system.
*
* Revision 1.9 1998/07/14 19:24:53 bcassidy
* 1. Simplify MakeFSMTable maro.
* 2. Add ROM keyword for constant data.
*
* Revision 1.8 1998/05/15 21:28:08 bcassidy
* 1. Modify tracing system to avoid string fields.
*
* Revision 1.7 1998/03/05 17:50:10 bcassidy
* 1. Add compile switch for conditional state support.
*
* Revision 1.6 1998/03/04 01:13:46 dehman
* Adjusted MAX_PARM_STRUCT_SIZE to 15 so that we get word alignment. (For now)
*
* Revision 1.5 1998/02/07 22:07:53 bcassidy
* 1. Remove current_event and busy elements from FSMDescriptor.
* [Efficiency improvement in processEventWithParmStruct.]
*
* Revision 1.4 1998/02/07 04:03:44 dehman
* Fixed structure alignment problem/bug by changing the order
* of member declaration in FSMTblEvent.
*
* Revision 1.3 1998/02/04 01:08:12 bcassidy
* 1. Fix const keywords for FSM name, event_name and state_name.
*
* Revision 1.2 1998/02/03 22:23:47 bcassidy
* 1. Add tracing support.
*
* Revision 1.1 1998/01/31 22:37:35 bcassidy
* Initial revision
*
*
************************************************************************/
#ifndef __FSM_H_
#define __FSM_H_
#include "ottsdefs.h"
#include "sysdefs.h"
/* Constants */
/* <TBD: Due to a GNU compiler-bug, the MAX_PARM_STRUCT_SIZE must be set
to: ((a multiple of 4) - 1).> */
#define MAX_PARM_STRUCT_SIZE 39
#define EVENTQ_SIZE 5
#define UNEXPECTED_EVENT_AC 0xFE
#define NO_EVENT 0xFF
#define NO_ACTION 0
#ifndef FSM_COND_ST
#define FSM_COND_ST 1
#endif
#ifdef FSM_COND_ST
#define CONDITIONAL_STATE 0x7F
#define CHANGE_STATE_ALWAYS KAL_TRUE
#define ACTION_DRIVES_CHANGE KAL_FALSE
#endif
/* Define FSM Base Elements */
typedef kal_uint8 FSMState;
typedef kal_uint8 FSMEvent;
typedef kal_uint8 FSMAction;
/* <TBD: Due to a GNU compiler-bug, 'plist' must be the first entry in this structure.> */
typedef struct
{
kal_uint8 plist[ MAX_PARM_STRUCT_SIZE ];
FSMEvent event;
} FSMTBLEvent;
typedef kal_uint8 ProtocolEngineID;
/* Define FSM Descriptor Structure */
struct FSMDescriptorStruct
{
FSMTBLEvent eventQ[EVENTQ_SIZE]; /* Event Queue */
kal_uint8 put_index; /* Put Index for Q */
kal_uint8 get_index; /* Get Index for Q */
kal_uint8 num_in_queue; /* Current number of entries in the queue */
FSMState state; /* Current State */
#ifdef FSM_COND_ST
FSMState conditional_state; /* Conditional State */
kal_bool change_flag; /* If TRUE, always change state */
#endif
FSMState num_state; /* Number of States */
FSMEvent num_event; /* Number of Events */
FSMAction num_action; /* Number of Actions */
FSMState* state_table; /* State Table */
kal_uint16 state_size; /* State Entry Size */
kal_uint16 event_size; /* Event Entry Size */
/* Ptr to Action Handler Function */
kal_bool ( *action_handler )( struct FSMDescriptorStruct* fsm, FSMAction action );
/* Instance Related User Parameters */
void* user_parms;
kal_uint8 id;
ProtocolEngineID engineId;
kal_bool extendedTracing;
#if (ITRACE_TYPE == TOKEN_TRACING)
kal_uint8 fsmNameTableId;
kal_uint8 stateNameTableId;
kal_uint8 eventNameTableId;
#else /* !TOKEN_TRACING */
const kal_char** fsmNameTable;
const kal_char** stateNameTable;
const kal_char** eventNameTable;
#endif /* ITRACE_TYPE */
};
/* Useful Typedefs */
typedef struct FSMDescriptorStruct FSMDescriptor;
typedef FSMDescriptor* FSMPtr;
typedef kal_bool (*FSMActionFuncPtr) (FSMPtr fsm, FSMAction action);
/* Generic FSM Processing Functions */
void initializeFSM( FSMPtr fsm, FSMState* table,
kal_uint8 num_state, kal_uint8 num_event, kal_uint8 num_action,
FSMState initial_state, FSMActionFuncPtr action_handler,
void* user_parms );
void processEventWithNoParms( FSMPtr fsm, FSMEvent event );
void processEventWithParmStruct( FSMPtr fsm, FSMEvent event, void* parm_struct, kal_uint8 size );
#ifdef FSM_COND_ST
void setConditionalState( FSMPtr fsm, FSMState cond_state );
void setChangeFlag( FSMPtr fsm, kal_bool change_always );
#endif
/* Event Parameter Query */
void* getEventParameters( FSMPtr fsm );
FSMEvent getCurrentEvent( FSMPtr fsm );
/* FSM Table Generation Macros */
/* The macro MAKEFSMTable creates a FSM table, just provide the name of the
* table, the number of states, the number of events and the number of
* actions that are to be executed to get to that state.
*/
/*
* Example of make fsm table macro
* Intialize table
* MAKEFSMTable(callFSM,2,3,1) = {{1,b},{2,c},{3,d},{4,e},{5,f},{0,a}};
* where 0-5 represent the different states
* where a-e represent different actions
* Note this assumes that the states and actions are the same size
* The + 1 is for the state entry
*/
#define MAKEFSMTable(tableName,numStates,numEvents,numActions) \
static CONST kal_uint8 ROM tableName[numStates][numEvents][numActions + 1]
/* The macro FSMTable is used to Instantiate a FSMTable
* It just does the required type casting
*
* Example
* Instantiate a FSMTBL with FSMTable callFSM
* FSMTBL callFSMTable(FSMTable(callFSM),2,3,1,0);
*/
#define FSMTable(tableName) (FSMState*)&tableName
#ifdef TRACEON
void setFSMTraceInfo (FSMPtr fsm, kal_uint8 fsmId, ProtocolEngineID engineId);
#define FSMTRACE_INFO(fsm, id, engineId) setFSMTraceInfo(fsm, id, engineId)
#if (ITRACE_TYPE == TOKEN_TRACING)
void setFSMExtendedTraceInfo (FSMPtr fsm, kal_uint8 fsmNameTableId, kal_uint8 fsmId,
ProtocolEngineID engineId,
kal_uint8 stateTableId, kal_uint8 eventTableId);
#define FSMEXTTRACE_INFO(fsm, engineId, fsmNameTable, fsmNameTableId, fsmId, \
stateNameTable, stateNameTableId, \
eventNameTable, eventNameTableId) \
setFSMExtendedTraceInfo(fsm, fsmNameTableId, fsmId, engineId, \
stateNameTableId, eventNameTableId)
#else /* !TOKEN_TRACING */
void setFSMExtendedTraceInfo (FSMPtr fsm, const kal_char* fsmNameTable[],
kal_uint8 fsmId, ProtocolEngineID engineId,
const kal_char* stateTable[],
const kal_char* eventTable[]);
#define FSMEXTTRACE_INFO(fsm, engineId, fsmNameTable, fsmNameTableId, fsmId, \
stateNameTable, stateNameTableId, \
eventNameTable, eventNameTableId) \
setFSMExtendedTraceInfo(fsm, fsmNameTable, fsmId, engineId, \
stateNameTable, eventNameTable)
#endif /* ITRACE_TYPE */
#else /* !TRACEON */
#define FSMTRACE_INFO(fsm, id, engineId)
#define FSMEXTTRACE_INFO(fsm, engineId, fsmNameTable, fsmNameTableId, fsmId, \
stateNameTable, stateNameTableId, \
eventNameTable, eventNameTableId)
#endif /* TRACEON */
#endif /* __FSM_H_ */