35#ifndef __SIMPLE_FSM_H__
36#define __SIMPLE_FSM_H__
44#if (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) && !defined(__cplusplus)
45# undef VSF_KERNEL_CFG_EDA_SUPPORT_SIMPLE_FSM
46# define VSF_KERNEL_CFG_EDA_SUPPORT_SIMPLE_FSM DISABLED
49#if VSF_KERNEL_CFG_EDA_SUBCALL_HAS_RETURN_VALUE == ENABLED \
50 && VSF_USE_KERNEL == ENABLED \
51 && VSF_KERNEL_CFG_EDA_SUPPORT_SIMPLE_FSM == ENABLED \
52 && VSF_KERNEL_CFG_EDA_SUPPORT_TASK == ENABLED
60# define vsf_this (*vsf_pthis)
64#if (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) && !defined(__cplusplus)
65# error simple_fsm require at least ANSI-C99 support
81#define def_states(...) \
96# define def_params(...) __VA_ARGS__
109#define vsf_args(...) ,__VA_ARGS__
119#define vsf_fsm(__name) vsf_task(__name)
121#define __def_fsm(__fsm_type, ...) \
122 def_vsf_task(__fsm_type, \
142#define def_fsm(__name, ...) \
143 __def_fsm(__name, __VA_ARGS__)
155#define def_simple_fsm(__name, ...) \
156 __declare_fsm(__name); \
157 __def_fsm(__name, __VA_ARGS__)
167#define end_def_simple_fsm(...)
181#define __declare_fsm(__name) \
182 declare_vsf_task(__name)
194#define declare_vsf_fsm(__name) __declare_fsm(__name)
205#define __extern_fsm_initialiser(__name, ...) \
206 vsf_fsm(__name) *__name##_init(vsf_fsm(__name) *fsm_ptr __VA_ARGS__); \
207 typedef vsf_fsm(__name) *__name##_init_fn(vsf_fsm(__name) *fsm_ptr __VA_ARGS__);
228#define extern_vsf_fsm_initialiser(__name, ...) \
229 __extern_fsm_initialiser(__name, __VA_ARGS__)
241#define __extern_fsm_implementation_ex(__name,__type) \
242 fsm_rt_t __name(fsm(__type) *vsf_pthis, vsf_evt_t evt); \
243 typedef fsm_rt_t __name##_fn( vsf_fsm(__type) *vsf_pthis, vsf_evt_t evt );
264#define declare_vsf_fsm_implementation_ex(__name, __type) \
265 __extern_fsm_implementation_ex(__name, __type)
277#define extern_vsf_fsm_implementation_ex(__name,__type) \
278 __extern_fsm_implementation_ex(__name, __type)
289#define extern_vsf_fsm_implementation(__name) \
290 __extern_fsm_implementation_ex(__name, __name)
300#define declare_vsf_fsm_implementation(__name) \
301 __extern_fsm_implementation_ex(__name, __name)
320#define call_vsf_fsm(__name, __fsm ) \
321 vsf_task_call_task(__name, __fsm)
323#define ____state(__state, ...) \
325 __state_entry_##__state:{ \
341#define vsf_state(__state, ...) break; ____state(__state, __VA_ARGS__)
351#define on_start(...) {__VA_ARGS__;}
360#define reset_vsf_fsm() do { vsf_this.fsm_state = 0; } while(0);
368#define vsf_fsm_cpl() do {reset_vsf_fsm(); return fsm_rt_cpl;} while(0);
379#define vsf_fsm_report(__ERROR) do {reset_vsf_fsm(); return (fsm_rt_t)(__ERROR); } while(0);
389#define vsf_fsm_wait_for_obj() return fsm_rt_wait_for_obj;
399#define vsf_fsm_on_going() return fsm_rt_on_going;
419#define update_state_to(__state) \
420 { vsf_this.fsm_state = (__state); goto __state_entry_##__state;}
432#define transfer_to(__state) \
433 { vsf_this.fsm_state = (__state); vsf_fsm_on_going() }
436#define __fsm_initialiser(__name, ...) \
437 vsf_fsm(__name) *__name##_init(vsf_fsm(__name) *vsf_pthis __VA_ARGS__) \
439 VSF_KERNEL_ASSERT (NULL != vsf_pthis); \
440 vsf_this.fsm_state = 0;
460#define vsf_fsm_initialiser(__name, ...) \
461 __fsm_initialiser(__name, __VA_ARGS__)
474#define abort_vsf_fsm_init() return NULL;
485#define vsf_fsm_init_body(...) \
505#define init_vsf_fsm(__name, __fsm, ...) \
506 __name##_init(__fsm __VA_ARGS__)
520#define init_simple_fsm(__name, __fsm, ...) \
521 init_vsf_fsm(__name, __fsm, __VA_ARGS__)
542#define start_vsf_fsm(__name, __fsm, __pri, ...) \
543 init_vsf_task(__name, (__fsm), (__pri), __VA_ARGS__)
559#define start_simple_fsm(__name, __fsm, __pri, ...) \
560 start_vsf_fsm(__name, (__fsm), (__pri), __VA_ARGS__)
562#define __implement_fsm_ex(__name, __type) \
563 implement_vsf_task(__name) \
566 if (NULL == vsf_pthis) { \
571 switch (vsf_this.fsm_state) { \
573 vsf_this.fsm_state++; \
597#define vsf_fsm_body(...) __body(__VA_ARGS__)
613#define vsf_fsm_begin() \
614 switch (vsf_this.fsm_state) { \
616 vsf_this.fsm_state++;
628#define vsf_fsm_end() \
674#define implement_fsm_ex(__name, __type) \
675 __implement_fsm_ex(__name, __type)
677#define __implement_fsm(__name) \
678 implement_fsm_ex(__name, __name)
698#define implement_vsf_fsm(__name, ...) __implement_fsm(__name)
700#define __privilege_state(__state, ...) \
703 ____state(__state, __VA_ARGS__) \
705 if (vsf_this.fsm_state != (__state)) { \
723#define privilege_state(__state, ...) \
724 __privilege_state(__state, __VA_ARGS__)
735#define privilege_group(...) { __VA_ARGS__;}
752#define privilege_body(...) \
754 switch (vsf_this.fsm_state) { \
756 vsf_this.fsm_state++; \
761 return fsm_rt_on_going; \
767#ifndef __FSM_RT_TYPE__
768#define __FSM_RT_TYPE__
fsm_rt_t
Definition vsf_fsm.h:771
@ fsm_rt_asyn
fsm asynchronose complete, you can check it later.
Definition vsf_fsm.h:776
@ fsm_rt_err
fsm error, error code can be get from other interface
Definition vsf_fsm.h:772
@ fsm_rt_wait_for_obj
fsm wait for object
Definition vsf_fsm.h:775
@ fsm_rt_cpl
fsm complete
Definition vsf_fsm.h:773
@ fsm_rt_on_going
fsm on-going
Definition vsf_fsm.h:774