|
|
/**INC+**********************************************************************/ /* Header: adcgfsm.h */ /* */ /* Purpose: FSM macros and constants */ /* */ /* Copyright(C) Microsoft Corporation 1997 */ /* */ /****************************************************************************/ /** Changes:
* $Log: Y:/logs/h/dcl/adcgfsm.h_v $ * * Rev 1.8 21 Aug 1997 16:40:36 SJ * SFR1322: Assert FSM macro should use TRC_FILE not __FILE__ * * Rev 1.7 18 Aug 1997 14:37:58 AK * SFR1184: Complete tidy-up of ASSERT_FSM * * Rev 1.6 13 Aug 1997 15:11:08 ENH * SFR1182: Changed UT to UI _FATAL_ERR * * Rev 1.5 07 Aug 1997 14:56:02 AK * SFR1184: FSM errors and Fatal Error tidy-up * * Rev 1.4 09 Jul 1997 16:56:52 AK * SFR1016: Initial changes to support Unicode * * Rev 1.3 04 Jul 1997 17:11:34 AK * SFR1007: Improve FSM error handling and trace * * Rev 1.2 03 Jul 1997 13:36:58 AK * SFR0000: Initial development completed **/ /**INC-**********************************************************************/
#ifndef _H_ADCGFSM
#define _H_ADCGFSM
/**STRUCT+*******************************************************************/ /* Structure: FSM_ENTRY */ /* */ /* Description: Entry in an FSM Table */ /****************************************************************************/ typedef struct tagFSM_ENTRY { DCUINT8 next_state; DCUINT8 action;
/**************************************************************************/ /* If FSM coverage required, add a boolean 'touched' field here. */ /**************************************************************************/ } FSM_ENTRY; /**STRUCT-*******************************************************************/
/****************************************************************************/ /* EVENT_TYPE and EVENT_DATA definitions */ /****************************************************************************/ typedef DCUINT8 EVENT_TYPE; typedef PDCUINT8 EVENT_DATA;
/****************************************************************************/ /* null FSM event */ /****************************************************************************/ #define NULL_EVENT ((EVENT_TYPE) 0xFF)
/****************************************************************************/ /* Invalid State for FSM */ /****************************************************************************/ #define STATE_INVALID 0xFF
/****************************************************************************/ /* Actions for FSMs */ /****************************************************************************/ #define ACT_NO 0
#define ACT_A 1
#define ACT_B 2
#define ACT_C 3
#define ACT_D 4
#define ACT_E 5
#define ACT_F 6
#define ACT_G 7
#define ACT_H 8
#define ACT_I 9
#define ACT_J 10
#define ACT_K 11
#define ACT_L 12
#define ACT_M 13
#define ACT_N 14
#define ACT_O 15
#define ACT_P 16
#define ACT_Q 17
#define ACT_R 18
#define ACT_S 19
#define ACT_T 20
#define ACT_U 21
#define ACT_V 22
#define ACT_W 23
#define ACT_X 24
#define ACT_Y 25
#define ACT_Z 26
#define ACT_CONNECTENDPOINT 27
/****************************************************************************/ /* FSM Direct Calls. */ /* Add FSM coverage versions if required for Unit Testing */ /****************************************************************************/ #define CHECK_FSM(FSM,INPUT,STATE) \
(FSM[INPUT][STATE].next_state != STATE_INVALID)
#define UI_FATAL_FSM_ERR_4(msg, p1, p2, p3, p4) \
{ \ TRC_ERR((TB, \ _T("FSM error: %S@%d state:%d input:%d"), (p1), (p2), (p3), (p4))); \ _pUi->UI_FatalError(msg); \ }
/****************************************************************************/ /* ASSERT_FSM: validate the FSM transition */ /* If transition is invalid, assert and display a fatal error message. */ /* Note that EVT_STR and ST_STR are invalid in the retail build. */ /****************************************************************************/ #define ASSERT_FSM(FSM, INPUT, STATE, EVT_STR, ST_STR) \
if (!CHECK_FSM(FSM, INPUT, STATE)) \ { \ UI_FATAL_FSM_ERR_4(DC_ERR_FSM_ERROR, TRC_FILE, __LINE__, STATE, INPUT); \ TRC_ABORT((TB, _T("Invalid Transition from state %s- input %s"), \ ST_STR[STATE], EVT_STR[INPUT])); \ }
/****************************************************************************/ /* EXECUTE_FSM: change the STATE and ACTION; trace out the state change */ /****************************************************************************/ #define EXECUTE_FSM(FSM,INPUT,STATE,ACTION, EVT_STR, ST_STR) \
{ \ TRC_DBG((TB, _T("Old state %s Input event %s"), \ ST_STR[STATE], EVT_STR[INPUT])); \ TRC_DBG((TB, _T("New state %s Action %d"), \ ST_STR[FSM[INPUT][STATE].next_state], \ FSM[INPUT][STATE].action)); \ ASSERT_FSM(FSM, INPUT, STATE, EVT_STR, ST_STR); \ ACTION = FSM[INPUT][STATE].action; \ STATE = FSM[INPUT][STATE].next_state; \ }
#endif /* _H_ADCGFSM */
|