// // Created by Hydro on 2026/4/21. // #ifndef QF_FSM_FSM_H #define QF_FSM_FSM_H #include #include #define EVENT_QUEUE_LEN 16 #define EVENT_QUEUE_HANDLE_MAX_SIZE 32 typedef enum { FSM_OK, FSM_FAIL } fsm_result_e; typedef struct qf_fsm_event fsm_event_t; typedef struct qf_fsm fsm_handle_t; typedef struct qf_fsm_transition fsm_transition_t; typedef fsm_result_e (*fsm_cb)(void *userdata); typedef fsm_result_e (*fsm_event_queue_init)(void *queue_handle, void *data_ptr, size_t size); typedef fsm_result_e (*fsm_event_queue_get)(void *handle_ptr, fsm_event_t *event); typedef fsm_result_e (*fsm_event_queue_put)(void *handle_ptr, fsm_event_t *event); typedef struct qf_fsm_state { uint16_t state; fsm_cb on_exit; fsm_cb on_event; fsm_cb on_entry; void *user_data; } fsm_state_t; struct qf_fsm_transition { uint16_t state; uint16_t event; uint16_t next_state; fsm_cb on_action; }; struct qf_fsm_event { uint16_t event; void *user_data; }; struct qf_fsm { fsm_state_t *current_state; char *name; uint16_t num_states; fsm_state_t *p_state_list; uint32_t num_trans; fsm_transition_t *p_trans_list; uint8_t event_queue_handle[EVENT_QUEUE_HANDLE_MAX_SIZE]; fsm_event_t event_queue[EVENT_QUEUE_LEN]; bool custom_queue; fsm_event_queue_init event_queue_init; fsm_event_queue_put event_queue_put; fsm_event_queue_get event_queue_get; }; fsm_result_e fsm_init(fsm_handle_t *handle_ptr, uint16_t init_state); fsm_result_e fsm_init_with_queue(fsm_handle_t *handle_ptr, uint16_t init_state, fsm_event_queue_init event_queue_init, fsm_event_queue_put event_queue_put, fsm_event_queue_get event_queue_get); fsm_result_e fsm_event_put(fsm_handle_t *handle_ptr, fsm_event_t *event); fsm_result_e fsm_process_queue(fsm_handle_t *handle_ptr); fsm_result_e fsm_dispatch(fsm_handle_t *handle_ptr, const fsm_event_t *event); fsm_state_t *fsm_get_state(const fsm_handle_t *h); #endif // QF_FSM_FSM_H