|
发表于 2017-1-6 13:21:01
|
显示全部楼层
压缩包不利于直观看代码探讨,我先把你的代码贴出来。再探讨。
- //ssm.c
- #include "ssm.h"
- ssm_event_t ssm_reserved_event[] = {
- { SSM_EMPTY_SIG, 0 },
- { SSM_ENTRY_SIG, 0 },
- { SSM_EXIT_SIG, 0 },
- { SSM_INIT_SIG, 0 },
- { SSM_USER_SIG, 0 },
- };
- static ssm_ret_t null_state_handler(ssm_t *fsm, ssm_event_t const *e) {
- return SSM_EMPTY_SIG;
- }
- void fsm_ctor(ssm_t *me, ssm_state_handler_t init) {
- me->state = null_state_handler;
- me->temp = init;
- fsm_dispatch(me, &ssm_reserved_event[1]);
- }
- void fsm_dispatch(ssm_t *me, ssm_event_t *e) {
- ssm_ret_t ret;
- ret = (me->temp)(me, e);
- if (SSM_RET_TRAN == ret) {
- SSM_EXIT(me, me->state);
- SSM_ENTRY(me, me->temp);
- me->state = me->temp;
- }
- }
复制代码- //ssm.h
- #ifndef __SM_H__
- #define __SM_H__
- #ifdef __cplusplus
- extern "C" {
- #endif
- typedef int ssm_sig_t;
- /**
- * @bref 状态机事件
- */
- typedef struct ssm_event_s {
- ssm_sig_t sig;
- void *event;
- } ssm_event_t;
- /**
- * @bref 状态处理函数返回值, 指示事件被怎么处理了
- */
- typedef unsigned char ssm_ret_t;
- //struct ssm_fsm_s;
- typedef struct ssm_s ssm_t;
- typedef ssm_ret_t (*ssm_state_handler_t)(ssm_t *fsm, ssm_event_t const *e);
- /**
- * @bref 状态机
- */
- struct ssm_s {
- ssm_state_handler_t state;
- ssm_state_handler_t temp;
- };
- /**
- * @bref 状态机返回值
- *
- */
- enum {
- SSM_RET_HANDLED,
- SSM_RET_IGNORE,
- SSM_RET_UNHANDLED,
- SSM_RET_TRAN,
- SSM_RET_SUPER,
- };
- #define SSM_RET_CAST(x) ( (ssm_ret_t)(x) )
- #define SSM_HANDLED() SSM_RET_CAST(SSM_RET_HANDLED)
- #define SSM_IGNORE() SSM_RET_CAST(SSM_RET_IGNORE)
- #define SSM_UNHANDLED() SSM_RET_CAST(SSM_RET_UNHANDLED)
- #define SSM_TRAN(me, target) \
- ((me)->temp = (target), SSM_RET_CAST(SSM_RET_TRAN))
- #define SSM_SUPER(me, super) \
- ((me)->temp = (super), SSM_RET_CAST(SSM_RET_SUPER))
- #define SSM_SIG(e) (e->sig)
- enum ssm_reserved_sig {
- SSM_EMPTY_SIG = -5,
- SSM_ENTRY_SIG = -4,
- SSM_EXIT_SIG = -3,
- SSM_INIT_SIG = -2,
- SSM_USER_SIG = -1,
- };
- extern ssm_event_t ssm_reserved_event[];
- #define SSM_TRIG(me, state, sig) ((state)(me, &ssm_reserved_event[5 + (sig)]))
- #define SSM_ENTRY(me, state) SSM_TRIG(me, state, SSM_ENTRY_SIG)
- #define SSM_EXIT(me, state) SSM_TRIG(me, state, SSM_EXIT_SIG)
- void fsm_ctor(ssm_t *me, ssm_state_handler_t init);
- void fsm_dispatch(ssm_t *me, ssm_event_t *e);
- #ifdef __cplusplus
- }
- #endif
- #endif
复制代码
- //main.c
- #include "ssm.h"
- #include <windows.h>
- #include <stdio.h>
- #define SSM_TIMEOUT_SIG 0
- static ssm_ret_t off_state_handler(ssm_t *fsm, ssm_event_t const *e);
- static ssm_ret_t on_state_handler(ssm_t *fsm, ssm_event_t const *e);
- static ssm_ret_t off_state_handler(ssm_t *fsm, ssm_event_t const *e) {
- ssm_ret_t status;
- switch (SSM_SIG(e)) {
- case SSM_ENTRY_SIG: {
- printf("close led\r\n");
- status = SSM_HANDLED();
- break;
- }
- case SSM_TIMEOUT_SIG: {
- printf("off time ev\r\n");
- status = SSM_TRAN(fsm, &on_state_handler);
- break;
- }
- default: {
- status = SSM_HANDLED();
- break;
- }
- }
- return status;
- }
- static ssm_ret_t on_state_handler(ssm_t *fsm, ssm_event_t const *e) {
- ssm_ret_t status;
- switch (SSM_SIG(e)) {
- case SSM_ENTRY_SIG: {
- printf("open led\r\n");
- status = SSM_HANDLED();
- break;
- }
- case SSM_TIMEOUT_SIG: {
- printf("on time ev\r\n");
- status = SSM_TRAN(fsm, &off_state_handler);
- break;
- }
- default: {
- status = SSM_HANDLED();
- break;
- }
- }
- return status;
- }
- int main(int argc, char **argv) {
- ssm_event_t ev = {SSM_TIMEOUT_SIG, 0};
- ssm_t me;
- fsm_ctor(&me, off_state_handler);
- while (1) {
- Sleep(1000);
- fsm_dispatch(&me, &ev);
- }
- return 0;
- }
复制代码 |
|