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