diff --git a/fsm.c b/fsm.c index 2c76aec..134d954 100644 --- a/fsm.c +++ b/fsm.c @@ -1,4 +1,30 @@ // // Created by Hydro on 2026/4/21. // -#include "fsm.h" \ No newline at end of file +#include "fsm.h" +fsm_result_e +fsm_init_with_queue (fsm_handle_t *handle_ptr, + const fsm_event_queue_init event_queue_init, + const fsm_event_queue_put event_queue_put, + const fsm_event_queue_get event_queue_get) +{ + fsm_result_e result = FSM_OK; + do + { + if (!(handle_ptr && event_queue_init && event_queue_put + && event_queue_get)) + { + result = FSM_FAIL; + break; + } + handle_ptr->event_queue_get = event_queue_get; + handle_ptr->event_queue_put = event_queue_put; + handle_ptr->event_queue_init = event_queue_init; + + result = handle_ptr->event_queue_init(handle_ptr->event_queue_handle, + handle_ptr->event_queue, + EVENT_QUEUE_LEN + * sizeof(fsm_event_t)); + } while (0); + return result; +} \ No newline at end of file diff --git a/fsm.h b/fsm.h index 587d73a..ae90945 100644 --- a/fsm.h +++ b/fsm.h @@ -7,6 +7,7 @@ #include #define EVENT_QUEUE_LEN 16 #define EVENT_QUEUE_HANDLE_MAX_SIZE 32 + typedef enum { FSM_OK, @@ -16,7 +17,7 @@ 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, +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, @@ -47,6 +48,7 @@ struct qf_fsm { uint16_t current_state; uint16_t num_states; + char *name; fsm_state_t *p_state_list; uint32_t num_trans; fsm_transition_t *p_trans_list; @@ -57,5 +59,13 @@ struct qf_fsm fsm_event_queue_put event_queue_put; fsm_event_queue_get event_queue_get; }; - +fsm_result_e fsm_init(fsm_handle_t *handle_ptr); +fsm_result_e fsm_init_with_queue(fsm_handle_t *handle_ptr, + 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, fsm_event_t *event); +uint16_t fsm_get_state(fsm_handle_t *h); #endif // QF_FSM_FSM_H