183 lines
9.8 KiB
C
183 lines
9.8 KiB
C
|
|
/**********************************************************************************************************************
|
||
|
|
* FILE DESCRIPTION
|
||
|
|
* -----------------------------------------------------------------------------------------------------------------*/
|
||
|
|
/** \file
|
||
|
|
* \brief Event-driven hierarchical finite state machine interface
|
||
|
|
*
|
||
|
|
* -------------------------------------------------------------------------------------------------------------------
|
||
|
|
* COPYRIGHT
|
||
|
|
* -------------------------------------------------------------------------------------------------------------------
|
||
|
|
* \par Copyright
|
||
|
|
* \verbatim
|
||
|
|
* Copyright (c) 2023 by Vector Informatik GmbH. All rights reserved.
|
||
|
|
*
|
||
|
|
* This software is copyright protected and proprietary to Vector Informatik GmbH.
|
||
|
|
* Vector Informatik GmbH grants to you only those rights as set out in the license conditions.
|
||
|
|
* All other rights remain with Vector Informatik GmbH.
|
||
|
|
* \endverbatim
|
||
|
|
*/
|
||
|
|
/*********************************************************************************************************************/
|
||
|
|
|
||
|
|
/**********************************************************************************************************************
|
||
|
|
* REVISION HISTORY
|
||
|
|
* -------------------------------------------------------------------------------------------------------------------
|
||
|
|
* Version Date Author Change Id Description
|
||
|
|
* -------------------------------------------------------------------------------------------------------------------
|
||
|
|
* 01.00.00 2012-10-30 visjhg - First implementation
|
||
|
|
* 01.00.01 2012-12-10 visjhg - Added "none" trigger
|
||
|
|
* 01.01.00 2013-12-11 visjhg ESCAN00071901 Renamed package to FblLib_Fsm
|
||
|
|
* visase - Performed MISRA checks
|
||
|
|
* 01.01.01 2019-01-24 visrie ESCAN00101864 No changes
|
||
|
|
* 01.02.00 2023-12-15 vistbe FBL-7986 Perform MISRA analysis
|
||
|
|
* Added/adapted MemMap sections
|
||
|
|
*********************************************************************************************************************/
|
||
|
|
|
||
|
|
#ifndef FBL_FSM_H
|
||
|
|
#define FBL_FSM_H
|
||
|
|
|
||
|
|
/**********************************************************************************************************************
|
||
|
|
* VERSION
|
||
|
|
*********************************************************************************************************************/
|
||
|
|
|
||
|
|
/* --- Version --- */
|
||
|
|
/* ##V_CFG_MANAGEMENT ##CQProject : FblLib_Fsm CQComponent : Implementation */
|
||
|
|
#define FBLLIB_FSM_VERSION 0x0102u
|
||
|
|
#define FBLLIB_FSM_RELEASE_VERSION 0x00u
|
||
|
|
|
||
|
|
/**********************************************************************************************************************
|
||
|
|
* DEFINES
|
||
|
|
*********************************************************************************************************************/
|
||
|
|
|
||
|
|
/** Default (invalid) state value */
|
||
|
|
#define FBL_FSM_DEFAULT_STATE 0xFFFFu
|
||
|
|
|
||
|
|
/**********************************************************************************************************************
|
||
|
|
* MACROS
|
||
|
|
*********************************************************************************************************************/
|
||
|
|
|
||
|
|
/** Dummy entry */
|
||
|
|
#define FBL_FSM_TRIGGER_NONE() { FblFsmEventHandlerDefault, kFblFsmDefaultEvent_None, FBL_FSM_DEFAULT_STATE }
|
||
|
|
/** State entry handler */
|
||
|
|
#define FBL_FSM_TRIGGER_ENTRY(action) { (action), kFblFsmDefaultEvent_Entry, FBL_FSM_DEFAULT_STATE }
|
||
|
|
/** State exit handler */
|
||
|
|
#define FBL_FSM_TRIGGER_EXIT(action) { (action), kFblFsmDefaultEvent_Exit, FBL_FSM_DEFAULT_STATE }
|
||
|
|
/** Event handler for "any" event */
|
||
|
|
#define FBL_FSM_TRIGGER_ANY(action, state) { (action), kFblFsmDefaultEvent_Any, (state) }
|
||
|
|
/** Internal event handler, no state transition */
|
||
|
|
#define FBL_FSM_TRIGGER_INTERNAL(event, action) { (action), (event), FBL_FSM_DEFAULT_STATE }
|
||
|
|
/** State transition on event */
|
||
|
|
#define FBL_FSM_TRIGGER_TRANSITION(event, state) { FblFsmEventHandlerDefault, (event), (state) }
|
||
|
|
/** State transition on event with additional action */
|
||
|
|
#define FBL_FSM_TRIGGER_TRANSITION_ACTION(event, action, state) { (action), (event), (state) }
|
||
|
|
/** Switch state when guard condition is true */
|
||
|
|
#define FBL_FSM_TRIGGER_CHOICE(guard, state) { (guard), kFblFsmDefaultEvent_Entry, (state) }
|
||
|
|
/** Else case of choice */
|
||
|
|
#define FBL_FSM_TRIGGER_CHOICE_ELSE(state) { FblFsmEventHandlerDefault, kFblFsmDefaultEvent_Entry, (state) }
|
||
|
|
/** Unconditional state transition (any entry handler has to return negative guard result) */
|
||
|
|
#define FBL_FSM_TRIGGER_UNCONDITIONAL(state) { FblFsmEventHandlerDefault, kFblFsmDefaultEvent_Entry, (state) }
|
||
|
|
/** Unconditional state transition with additional action (any entry handler has to return negative guard result) */
|
||
|
|
#define FBL_FSM_TRIGGER_UNCONDITIONAL_ACTION(action, state) { (action), kFblFsmDefaultEvent_Entry, (state) }
|
||
|
|
|
||
|
|
/**********************************************************************************************************************
|
||
|
|
* GLOBAL DATA TYPES AND STRUCTURES
|
||
|
|
*********************************************************************************************************************/
|
||
|
|
|
||
|
|
/** State type for state machine (the real states need to be defined by the component(s) using this module) */
|
||
|
|
typedef vuint16 tFblFsmState;
|
||
|
|
|
||
|
|
/** Event type for state machine (the real events need to be defined by the component(s) using this module) */
|
||
|
|
typedef vuint16 tFblFsmEvent;
|
||
|
|
|
||
|
|
#if defined( FBL_FSM_ENABLE_DEBUGGING )
|
||
|
|
/** Instance number */
|
||
|
|
typedef vuint8 tFblFsmInstance;
|
||
|
|
#endif /* FBL_FSM_ENABLE_DEBUGGING */
|
||
|
|
|
||
|
|
/** Event type (components using this module shall start to enumerate their events with kFblFsmDefaultEvent_Count) */
|
||
|
|
typedef enum
|
||
|
|
{
|
||
|
|
kFblFsmDefaultEvent_None, /**< No event */
|
||
|
|
kFblFsmDefaultEvent_Entry, /**< State entry event */
|
||
|
|
kFblFsmDefaultEvent_Exit, /**< State exit event */
|
||
|
|
kFblFsmDefaultEvent_Any, /**< Don't care event */
|
||
|
|
|
||
|
|
kFblFsmDefaultEvent_Count /**< Decimal number of default events */
|
||
|
|
} tFblFsmDefaultEvents;
|
||
|
|
|
||
|
|
/** Guard type */
|
||
|
|
typedef enum
|
||
|
|
{
|
||
|
|
kFblFsmGuard_True, /**< True: State transition is allowed */
|
||
|
|
kFblFsmGuard_False, /**< False: State transition is prohibited */
|
||
|
|
kFblFsmGuard_Overwrite /**< Allow pending state to set next state (override state table configuration), defaults to no transition */
|
||
|
|
} tFblFsmGuard;
|
||
|
|
|
||
|
|
/** Forward declaration of context structure */
|
||
|
|
typedef struct sFblFsmContext tFblFsmContext;
|
||
|
|
|
||
|
|
/** Pointer to context structure */
|
||
|
|
typedef V_MEMRAM1 tFblFsmContext V_MEMRAM2 V_MEMRAM3 * tFblFsmContextPtr;
|
||
|
|
|
||
|
|
/** Event handler function pointer */
|
||
|
|
typedef tFblFsmGuard (* tFblFsmEventHandler)( tFblFsmContextPtr const pFsmContext, tFblFsmEvent event );
|
||
|
|
|
||
|
|
typedef struct
|
||
|
|
{
|
||
|
|
tFblFsmEventHandler handler; /**< Event handler */
|
||
|
|
tFblFsmEvent trigger; /**< Event that triggers execution of handler */
|
||
|
|
tFblFsmState nextState; /**< Next state if event handler returns kFblFsmGuard_True */
|
||
|
|
} tFblFsmEventEntry;
|
||
|
|
|
||
|
|
/** State definition */
|
||
|
|
typedef struct
|
||
|
|
{
|
||
|
|
tFblFsmState superState; /**< Super state (encapsulating state) */
|
||
|
|
vuint16 triggerCount; /**< Size of array structure element 'triggers' points to */
|
||
|
|
/** Array containing triggers (events) and the corresponding actions for state */
|
||
|
|
V_MEMROM1 tFblFsmEventEntry V_MEMROM2 V_MEMROM3 * triggers;
|
||
|
|
} tFblFsmStateDefinition;
|
||
|
|
|
||
|
|
/** Context structure */
|
||
|
|
struct sFblFsmContext
|
||
|
|
{
|
||
|
|
/** Pointer to array containing state definitions (set by component(s) using this module) */
|
||
|
|
V_MEMROM1 tFblFsmStateDefinition V_MEMROM2 V_MEMROM3 * stateDefinitions;
|
||
|
|
vuint16 stateCount; /**< Number of elements in stateDefinitions (set by component(s) using this module) */
|
||
|
|
tFblFsmState state; /**< Current state (intended for internal usage) */
|
||
|
|
tFblFsmState pendingState; /**< Pending state (intended for internal usage) */
|
||
|
|
tFblFsmEvent pendingEvent; /**< Pending event (intended for internal usage) */
|
||
|
|
#if defined( FBL_FSM_ENABLE_DEBUGGING )
|
||
|
|
tFblFsmInstance instance; /**< State machine instance number */
|
||
|
|
#endif
|
||
|
|
};
|
||
|
|
|
||
|
|
/**********************************************************************************************************************
|
||
|
|
* GLOBAL FUNCTION PROTOTYPES
|
||
|
|
*********************************************************************************************************************/
|
||
|
|
|
||
|
|
#if defined( __cplusplus )
|
||
|
|
extern "C" {
|
||
|
|
#endif
|
||
|
|
#define FBLFSM_START_SEC_CODE
|
||
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
||
|
|
|
||
|
|
void FblFsmInitPowerOn( void );
|
||
|
|
void FblFsmInit( tFblFsmContextPtr const pFsmContext, tFblFsmState initialState );
|
||
|
|
void FblFsmDeinit( tFblFsmContextPtr const pFsmContext );
|
||
|
|
void FblFsmStateTask( tFblFsmContextPtr const pFsmContext );
|
||
|
|
void FblFsmTriggerEvent( tFblFsmContextPtr const pFsmContext, tFblFsmEvent event );
|
||
|
|
tFblFsmGuard FblFsmEventHandlerDefault( tFblFsmContextPtr const pFsmContext, tFblFsmEvent event );
|
||
|
|
|
||
|
|
#define FBLFSM_STOP_SEC_CODE
|
||
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
||
|
|
|
||
|
|
#if defined( __cplusplus )
|
||
|
|
} /* extern "C" */
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#endif /* FBL_FSM_H */
|
||
|
|
|
||
|
|
/**********************************************************************************************************************
|
||
|
|
* END OF FILE: FBL_FSM.H
|
||
|
|
*********************************************************************************************************************/
|