发明内容
本发明的目的在于克服现有技术存在的缺陷,提供了一种可以采用C++编码实现且包含多种功能的有限状态机。
为实现以上目的,本发明采用一种有限状态机的控制方法,包括:
根据状态机每个状态的名字和内存地址,创建状态机的每个状态,该状态包括两个父状态和一个final状态,每个父状态各包括三个子状态;
所述状态机当前的状态执行完毕后经postEvent函数指定要跳转的下个状态,其中postEvent函数的第一个参数为要跳转到的下个状态的名字、第二参数为要传递给下个状态的参数;
父状态或StateMachine根据下个状态的名字从注册过的状态列表中查找到对应的内存地址,并执行该下个状态的接口函数;
子状态间跳转时,首先执行onEntry函数,并在下个跳转的状态与当前状态相同时,则执行handleTimeout函数;以及在下个跳转的状态与当前状态不同时,则执行当前状态的onExit函数再执行onEntry函数。
进一步地,所述根据状态机每个状态的名字和内存地址,创建状态机的每个状态,包括:
创建状态机的两个父状态和一个final状态,final状态继承自State类;
创建两个父状态各自的三个子状态,每个子状态继承自State类;
将每个父状态各自下的三个子状态添加到对应的父状态中并设置初始执行状态;
将两个父状态和final状态添加到StateMachine中,并设置StateMachine的初始执行状态;
所述父状态向所述StateMachine注册,并发送其名字和内存地址;
所述子状态向父状态注册,并发送其名字和内存地址。
进一步地,所述状态机启动时,先进入到一个父状态,并根据相应的切换信号,切换到另一个父状态;
当所述状态机接收到stop machine信号时,状态机由当前状态切换至final状态。
另一方面,采用一种有限状态机,采用如上所述的有限状态机的控制方法。
与现有技术相比,本发明存在以下技术效果:本发明中的状态机可采用纯C++编码,可以嵌入到各种平台使用,该状态机还可提供多种功能,包括子状态切换、父状态切换、子状态循环和状态间传递参数等。
具体实施方式
为了更进一步说明本发明的特征,请参阅以下有关本发明的详细说明与附图。所附图仅供参考与说明之用,并非用来对本发明的保护范围加以限制。
如图2所示,本实施例公开了一种有限状态机的控制方法,包括如下步骤S1至S4:
S1、根据状态机每个状态的名字和内存地址,创建状态机的每个状态,该状态包括两个父状态和一个final状态,每个父状态各包括三个子状态;
S2、所述状态机当前的状态执行完毕后经postEvent函数指定要跳转的下个状态,其中postEvent函数的第一个参数为要跳转到的下个状态的名字、第二参数为要传递给下个状态的参数;
S3、父状态或StateMachine根据下个状态的名字从注册过的状态列表中查找到对应的内存地址,并执行该下个状态的接口函数;
S4、子状态间跳转时,首先执行onEntry函数,并在下个跳转的状态与当前状态相同时,则执行handleTimeout函数;以及在下个跳转的状态与当前状态不同时,则执行当前状态的onExit函数再执行onEntry函数。
需要说明的是,本状态机采用简单的语言提供了丰富的状态机功能,使用简单,可移植性强,可以有效的简化代码逻辑,更加合理的组织程序结构,可维护性强。
进一步地,上述步骤S1:根据状态机每个状态的名字和内存地址,创建状态机的每个状态,具体包括如下细分步骤:
创建状态机的两个父状态和一个final状态,final状态继承自State类;
创建两个父状态各自的三个子状态,每个子状态继承自State类;
将每个父状态各自下的三个子状态添加到对应的父状态中并设置初始执行状态;
将两个父状态和final状态添加到StateMachine中,并设置StateMachine的初始执行状态;
所述父状态向所述StateMachine注册,并发送其名字和内存地址;
所述子状态向父状态注册,并发送其名字和内存地址。
以下列举该状态机的具体用法:
该用法在threadMachine.cpp文件中,代码如下:
首先创建2个父状态和一个final状态,final状态继承自State类
State*pWorkState=new State(pStateMachine);
State*pChargeState=new State(pStateMachine);
StateFinal*pStateFinal=new StateFinal(pStateMachine);
然后创建pWorkState状态的三个子状态,每个状态都继承自State类
StateGetJob*pStateGetJob=new StateGetJob(pWorkState);
StateGotoPoint*pStateGotoPoint=new StateGotoPoint(pWorkState);
StateFinish*pStateFinish=new StateFinish(pWorkState);
再创建pChargeState状态的三个子状态,每个状态都继承自State类
StateBeginCharge*pStateBeginCharge=newStateBeginCharge(pChargeState);
StateOpenDoor*pStateOpenDoor=new StateOpenDoor(pChargeState);
StateCloseDoor*pCloseDoor=new StateCloseDoor(pChargeState);
将pWorkState状态的三个子状态添加到pWorkState父状态中并设置初始执行状态
pWorkState->addState("get job",pStateGetJob);
pWorkState->addState("goto point",pStateGotoPoint);
pWorkState->addState("finished",pStateFinish);
pWorkState->setInitState(pStateGetJob);
将pChargeState状态的三个子状态添加到pWorkState父状态中并设置初始执行状态
pChargeState->addState("begin charge",pStateBeginCharge);
pChargeState->addState("open door",pStateOpenDoor);
pChargeState->addState("close door",pCloseDoor);
pChargeState->setInitState(pStateBeginCharge);
将两个父状态以及final状态添加到pStateMachine中
pStateMachine->addState("work state",pWorkState);
pStateMachine->addState("charge state",pChargeState);
pStateMachine->addFinalState(pStateFinal);
设置pStateMachine的初始执行状态
pStateMachine->setInitState(pWorkState);
启动状态机
pStateMachine->start();
特别地,状态机启动后,首先执行pWorkState中的pStateGetJob状态,当该状态执行结束后,继续执行pWorkState状态中的其它状态,当pStateMachine收到父状态切换信号后,状态机从pWorkState状态中退出,然后执行pChargeState的pStateBeginCharge状态,当状态机收到停止信号后,执行pStateFinal状态的接口函数。
需要说明的是,如图4所示,State.cpp和StateMachine.cpp,State.cpp是该状态机的基类,实现了状态机每个状态的方法,StateMachine.cpp继承自State类,负责状态机的启停,以及管理父状态之间的切换工作,子状态之间的切换工作由父状态完成。每个状态都有自己的名字,在创建父状态时,父状态要向StateMachine注册,提供自己的名字和内存地址,子状态创建后要向父状态注册,提供自己的名字和内存地址。当一个状态执行完毕跳转到下一个状态时,通过postEvent函数指定要执行的下个状态,postEvent函数的第一个参数是要跳转到的下个状态的名字,第二个参数是要传递给下个状态的参数,可以为空,父状态或StateMachine根据下个状态的名字从注册过的状态列表中找到它的内存地址,然后执行该状态的接口函数。
每个子状态都有3个执行函数,分别是onEntry,handleTimeout,onExit函数,当首次进入该状态时,会执行onEntry函数,执行一些初始化工作,当下个跳转的状态跟当前状态相同时,则执行handleTimeout函数,当下个跳转的状态跟当前状态不同时,则先执行当前状态的onExit函数,执行一些清理工作,然后再执行下个状态的onEntry函数。
进一步地,本实施例中的状态机采用纯C++编码,可以嵌入到各种平台中使用。该状态机提供了多种功能,包括子状态切换,父状态切换,子状态循环,状态间传递参数等,如图3所示:状态机启动之前,要先初始化一下它的父状态,以确定当状态机进入到do job状态或goto charge状态时,该先执行哪个子状态;并初始化一下整个状态机的初始态,以确定状态机启动时要进入哪个父状态。上图3中的状态机启动时会先进入do job状态,当状态机收到switch to goto charge信号时,会切换到goto charge状态,当状态机收到stopmachine信号时,不论状态机处在哪种状态,都会切换到finale状态。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。