From 80e4dd2fc5aebcdf49a82c16f206da671b8fae8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=A4=A9=E6=B5=A9?= Date: Tue, 21 Apr 2026 03:57:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E4=BA=8B=E4=BB=B6=E9=98=9F=E5=88=97=E7=9A=84=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fsm.c | 28 +++++++++++++++++++++++++++- fsm.h | 14 ++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) 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