diff --git a/fsm.h b/fsm.h index 3851344..587d73a 100644 --- a/fsm.h +++ b/fsm.h @@ -3,36 +3,59 @@ // #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 *handle_ptr, + 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; -typedef struct qf_fsm_transition +struct qf_fsm_transition { uint16_t state; uint16_t event; + uint16_t next_state; fsm_cb on_action; -} fsm_transition_t; +}; struct qf_fsm_event { uint16_t event; void *user_data; }; -typedef struct qf_fsm +struct qf_fsm { - uint16_t current_state; - fsm_state_t *p_state_list; - -} fsm_handle_t; + uint16_t current_state; + 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; +}; + #endif // QF_FSM_FSM_H