一个状态机示例代码

  1 /**********************************************
  2 状态机示例
  3 功能:从屏幕输入1,则输出yes,输入其他值输出no
  4 ***********************************************/
  5 #include <stdio.h>
  6 #include <string.h>
  7 
  8 /* 在各状态之间传递的消息*/
  9 typedef struct stateInfo
 10 {
 11     int message;
 12     int nextStateID;
 13     char result[12];
 14 }StateT;
 15 
 16 /* 每一个状态会执行一个动作,再判断该转到哪个状态去*/
 17 typedef void (*sAction) (StateT *pStateInfo);
 18 typedef int (*sTrans) (StateT *pStateInfo);
 19 typedef struct smt
 20 {
 21 sAction action;
 22 sTrans trans;
 23 }MyStateMachine_T;
 24 
 25 /*以下是每个状态点的具体实现,State1~4*/
 26 void State1_action(StateT *pStateInfo)
 27 {
 28     int msg = 0;
 29     scanf("%d",&msg);
 30     pStateInfo->message = msg;
 31     return;
 32 }
 33 int State1_trans(StateT *pStateInfo)
 34 {
 35     if(pStateInfo->message == 1)
 36     {
 37     pStateInfo->nextStateID = 1;
 38     }
 39     else
 40     {
 41         pStateInfo->nextStateID = 2;
 42     }
 43     return 1;
 44 }
 45 void State2_action(StateT *pStateInfo)
 46 {
 47     strncpy(pStateInfo->result ,"yes",3);
 48     return;
 49 }
 50 int State2_trans(StateT *pStateInfo)
 51 {
 52     pStateInfo->nextStateID = 3;
 53     return 1;
 54 }
 55 void State3_action(StateT *pStateInfo)
 56 {
 57     strncpy(pStateInfo->result ,"no",2);
 58     return;
 59 }
 60 int State3_trans(StateT* pStateInfo)
 61 {
 62     pStateInfo->nextStateID = 3;
 63     return 1;
 64 }
 65 void State4_action(StateT *pStateInfo)
 66 {
 67     printf("result: %s \r\n",pStateInfo->result);
 68     return;
 69 }
 70 int State4_trans(StateT* pStateInfo)
 71 {
 72     pStateInfo->nextStateID = 0;
 73     return 0;
 74 }
 75 
 76 /* 这个示例中,状态机由四个状态构成*/
 77 MyStateMachine_T myfsm[4]= 
 78 {
 79     {State1_action,State1_trans},
 80     {State2_action,State2_trans},
 81     {State3_action,State3_trans},
 82     {State4_action,State4_trans}
 83 };
 84 int main(void)
 85 {
 86     StateT stateinfo;
 87     memset(&stateinfo,0,sizeof(StateT));
 88  
 89     /*进入初始状态State1,通过状态机是放在一个任务里的,常驻内存,随时接收消息
 90      这里写得简单,只是从屏幕上读入值。
 91     */
 92     MyStateMachine_T *pfsm = &myfsm[0];    
 93     pfsm->action(&stateinfo);
 94     while(1 == pfsm->trans(&stateinfo))
 95     {
 96         pfsm = &myfsm[stateinfo.nextStateID];
 97         pfsm->action(&stateinfo);
 98     }
 99     return 0;  
100 }

运行结果:

fanyuchao@dell-desktop:~/CProjectSpace/FSM$ ./fsm
1
result: yes
fanyuchao@dell-desktop:~/CProjectSpace/FSM$ ./fsm
2
result: no

posted @ 2013-10-17 23:47  范宇超  阅读(700)  评论(0编辑  收藏  举报