feat: 实现状态机的基本功能 #2
28
fsm.c
28
fsm.c
@@ -1,4 +1,30 @@
|
|||||||
//
|
//
|
||||||
// Created by Hydro on 2026/4/21.
|
// Created by Hydro on 2026/4/21.
|
||||||
//
|
//
|
||||||
#include "fsm.h"
|
#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;
|
||||||
|
}
|
||||||
14
fsm.h
14
fsm.h
@@ -7,6 +7,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#define EVENT_QUEUE_LEN 16
|
#define EVENT_QUEUE_LEN 16
|
||||||
#define EVENT_QUEUE_HANDLE_MAX_SIZE 32
|
#define EVENT_QUEUE_HANDLE_MAX_SIZE 32
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
FSM_OK,
|
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 fsm_handle_t;
|
||||||
typedef struct qf_fsm_transition fsm_transition_t;
|
typedef struct qf_fsm_transition fsm_transition_t;
|
||||||
typedef fsm_result_e (*fsm_cb)(void *userdata);
|
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,
|
void *data_ptr,
|
||||||
size_t size);
|
size_t size);
|
||||||
typedef fsm_result_e (*fsm_event_queue_get)(void *handle_ptr,
|
typedef fsm_result_e (*fsm_event_queue_get)(void *handle_ptr,
|
||||||
@@ -47,6 +48,7 @@ struct qf_fsm
|
|||||||
{
|
{
|
||||||
uint16_t current_state;
|
uint16_t current_state;
|
||||||
uint16_t num_states;
|
uint16_t num_states;
|
||||||
|
char *name;
|
||||||
fsm_state_t *p_state_list;
|
fsm_state_t *p_state_list;
|
||||||
uint32_t num_trans;
|
uint32_t num_trans;
|
||||||
fsm_transition_t *p_trans_list;
|
fsm_transition_t *p_trans_list;
|
||||||
@@ -57,5 +59,13 @@ struct qf_fsm
|
|||||||
fsm_event_queue_put event_queue_put;
|
fsm_event_queue_put event_queue_put;
|
||||||
fsm_event_queue_get event_queue_get;
|
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
|
#endif // QF_FSM_FSM_H
|
||||||
|
|||||||
Reference in New Issue
Block a user