49 lines
1.0 KiB
C
49 lines
1.0 KiB
C
#ifndef __CORE_FSM_H__
|
|
#define __CORE_FSM_H__
|
|
|
|
#include "core.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
typedef enum _fsm_signal_t {
|
|
FSM_ENTRY_SIG,
|
|
FSM_EXIT_SIG,
|
|
FSM_USER_SIG
|
|
} fsm_signal_t;
|
|
|
|
typedef c_uint32_t fsm_event_t;
|
|
typedef c_uint32_t fsm_state_t;
|
|
typedef void (*fsm_handler_t)(void *s, void *e);
|
|
|
|
typedef struct _fsm_t {
|
|
fsm_handler_t initial;
|
|
fsm_handler_t final;
|
|
fsm_handler_t state;
|
|
} fsm_t;
|
|
|
|
#define fsm_create(__s, __i, __f) \
|
|
(((__s)->initial = (__s)->state = (fsm_handler_t)(__i)), \
|
|
(__s)->final = (fsm_handler_t)(__f))
|
|
|
|
#define fsm_clear(__s) \
|
|
((__s)->initial = (__s)->state = (__s)->final = NULL)
|
|
|
|
|
|
CORE_DECLARE(void) fsm_init(fsm_t *s, fsm_event_t *e);
|
|
CORE_DECLARE(void) fsm_dispatch(fsm_t *s, fsm_event_t *e);
|
|
CORE_DECLARE(void) fsm_final(fsm_t *s, fsm_event_t *e);
|
|
|
|
#define FSM_TRAN(__s, __target) \
|
|
((fsm_t *)__s)->state = (fsm_handler_t)(__target)
|
|
|
|
#define FSM_STATE(__s) \
|
|
(((fsm_t *)__s)->state)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ! __CORE_FSM_H__ */
|