使用tinyfsm优化代码
This commit is contained in:
@@ -1,8 +1,5 @@
|
||||
//------------------------------------------------
|
||||
// pPowerManger config block
|
||||
|
||||
ProcessConfig = pPowerManger
|
||||
{
|
||||
AppTick = 5
|
||||
AppTick = 4
|
||||
CommsTick = 4
|
||||
}
|
||||
@@ -19,13 +19,13 @@ endif (${WIN32})
|
||||
find_package(SQLite3 REQUIRED)
|
||||
|
||||
SET(SRC
|
||||
PowerManagerFsm.cpp
|
||||
PowerManger.cpp
|
||||
PowerManger_Info.cpp
|
||||
udpComm.cpp
|
||||
main.cpp
|
||||
SQLiteDB.cpp
|
||||
driver.cpp
|
||||
PowerManagerFsm.cpp
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(pPowerManger ${SRC})
|
||||
|
||||
@@ -1,29 +1,103 @@
|
||||
#include "PowerManagerFsm.hpp"
|
||||
#include "PowerManger.h"
|
||||
#include <string>
|
||||
#include "MOOS/libMOOS/Utils/MOOSUtilityFunctions.h"
|
||||
|
||||
// 初始化静态成员
|
||||
// 定义静态成员
|
||||
PowerManger* PowerManagerFsm::pm = nullptr;
|
||||
|
||||
// 状态实例化
|
||||
InitState initState;
|
||||
StandbyState standbyState;
|
||||
FaultState faultState;
|
||||
|
||||
// 状态机初始化
|
||||
void PowerManagerFsm::init(PowerManger* powerManager) {
|
||||
pm = powerManager;
|
||||
start();
|
||||
// InitState实现
|
||||
void InitState::entry() {
|
||||
// PowerManagerFsm::pm->m_pmEvent = "初始化状态";
|
||||
PowerManagerFsm::pm->printState("InitState", "进入初始化状态");
|
||||
}
|
||||
|
||||
// 状态转换接口实现
|
||||
void PowerManagerFsm::triggerInitEvent() {
|
||||
dispatch(InitEvent());
|
||||
void InitState::react(InitEvent const &) {
|
||||
// double StartTime = PowerManagerFsm::pm->GetAppStartTime();
|
||||
double StartTime = 0;
|
||||
while (PowerManagerFsm::pm->connectState < 5) {
|
||||
MOOSPause(1000);
|
||||
PowerManagerFsm::pm->updateTime();
|
||||
double dft = abs(PowerManagerFsm::pm->m_current_time - StartTime);
|
||||
if(dft > 10) {
|
||||
transit<FaultState>();
|
||||
PowerManagerFsm::pm->m_faultNum = 1;
|
||||
return;
|
||||
}
|
||||
string desp = "等待复合管控消息 : " + to_string(10-dft);
|
||||
PowerManagerFsm::pm->printState("InitState", desp);
|
||||
}
|
||||
|
||||
if(PowerManagerFsm::pm->checkError() < 0) {
|
||||
transit<FaultState>();
|
||||
PowerManagerFsm::pm->m_faultNum = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
PowerManagerFsm::pm->initControlCmd();
|
||||
|
||||
while (true) {
|
||||
if(PowerManagerFsm::pm->m_currentDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker == 1 ||
|
||||
PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit5CircuitBreaker == 1 ||
|
||||
PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit2CircuitBreaker == 1 ||
|
||||
PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit3CircuitBreaker == 1 ||
|
||||
PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit1CircuitBreaker == 1) {
|
||||
transit<StandbyState>();
|
||||
return;
|
||||
}
|
||||
PowerManagerFsm::pm->m_pmEvent = "等待关键断路器闭合";
|
||||
MOOSPause(1000);
|
||||
PowerManagerFsm::pm->printState("InitState", PowerManagerFsm::pm->m_pmEvent);
|
||||
}
|
||||
}
|
||||
|
||||
void PowerManagerFsm::triggerStandbyEvent() {
|
||||
dispatch(StandbyEvent());
|
||||
// StandbyState实现
|
||||
void StandbyState::entry() {
|
||||
PowerManagerFsm::pm->printState("StandbyState", "进入待机状态");
|
||||
}
|
||||
|
||||
void PowerManagerFsm::triggerFaultEvent(unsigned int faultCode) {
|
||||
dispatch(FaultEvent(faultCode));
|
||||
void StandbyState::react(StandbyEvent const &) {
|
||||
while (true) {
|
||||
if(PowerManagerFsm::pm->checkError() < 0) {
|
||||
transit<FaultState>();
|
||||
return;
|
||||
}
|
||||
handlePowerCommands();
|
||||
MOOSPause(1000);
|
||||
}
|
||||
}
|
||||
|
||||
void StandbyState::handlePowerCommands() {
|
||||
switch (PowerManagerFsm::pm->m_msCmd.powerCMD) {
|
||||
case 0: PowerManagerFsm::pm->m_pmEvent = "收到上位机控制指令:关机"; break;
|
||||
case 1: handlePowerOn(); break;
|
||||
}
|
||||
}
|
||||
|
||||
void StandbyState::handlePowerOn() {
|
||||
PowerManagerFsm::pm->m_pmEvent = "动力电上电";
|
||||
PowerManagerFsm::pm->m_CcuColCmd.powerBatCmd = 0x10;
|
||||
if(PowerManagerFsm::pm->m_pmCurrentState.ccustate.fcuState == 0x04)
|
||||
PowerManagerFsm::pm->m_CcuColCmd.fcuCmd = 0x02;
|
||||
}
|
||||
|
||||
// FaultState实现
|
||||
void FaultState::entry() {
|
||||
PowerManagerFsm::pm->printState("FaultState", "进入故障状态");
|
||||
}
|
||||
|
||||
void FaultState::react(FaultEvent const & e) {
|
||||
switch (e.faultCode) {
|
||||
case 1:
|
||||
PowerManagerFsm::pm->m_pmEvent = "复合管控连接超时";
|
||||
PowerManagerFsm::pm->printState("FaultState", "通信故障");
|
||||
break;
|
||||
case 2:
|
||||
PowerManagerFsm::pm->m_pmEvent = "能源系统故障";
|
||||
PowerManagerFsm::pm->printState("FaultState", "能源故障");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 设置初始状态
|
||||
FSM_INITIAL_STATE(PowerManagerFsm, InitState);
|
||||
@@ -1,10 +1,10 @@
|
||||
#ifndef POWER_MANAGER_FSM_HPP
|
||||
#define POWER_MANAGER_FSM_HPP
|
||||
|
||||
#include "PowerManger.h"
|
||||
#include "tinyfsm.hpp"
|
||||
#include <iostream>
|
||||
|
||||
|
||||
// 前向声明
|
||||
class PowerManger;
|
||||
|
||||
// 定义事件类型
|
||||
struct InitEvent : tinyfsm::Event { };
|
||||
@@ -15,7 +15,7 @@ struct FaultEvent : tinyfsm::Event {
|
||||
};
|
||||
|
||||
// 定义状态机基类
|
||||
class PowerManagerFsm : public tinyfsm::Fsm<PowerManagerFsm> {
|
||||
class PowerManagerFsm : public tinyfsm::MooreMachine<PowerManagerFsm> {
|
||||
protected:
|
||||
static PowerManger* pm;
|
||||
|
||||
@@ -24,129 +24,41 @@ public:
|
||||
static void init(PowerManger* powerManager) {
|
||||
pm = powerManager;
|
||||
}
|
||||
|
||||
// 响应事件默认实现
|
||||
virtual void react(tinyfsm::Event const &) { }
|
||||
|
||||
// 状态机生命周期方法
|
||||
void entry() {std::cout << "Enter state: " << typeid(*this).name() << std::endl;} // 进入状态
|
||||
void exit() {std::cout << "Exit state: " << typeid(*this).name() << std::endl;} // 退出状态
|
||||
|
||||
// 状态转换接口
|
||||
void triggerInitEvent() { dispatch(InitEvent()); }
|
||||
void triggerStandbyEvent() { dispatch(StandbyEvent()); }
|
||||
void triggerFaultEvent(unsigned int faultCode) { dispatch(FaultEvent(faultCode)); }
|
||||
};
|
||||
|
||||
// 初始化静态成员
|
||||
PowerManger* PowerManagerFsm::pm = nullptr;
|
||||
|
||||
// 定义状态类
|
||||
class InitState : public PowerManagerFsm {
|
||||
public:
|
||||
void entry() {
|
||||
PowerManagerFsm::pm->m_pmEvent = "初始化状态"; // 保持正确类名
|
||||
PowerManagerFsm::pm->printState("InitState", "进入初始化状态");
|
||||
}
|
||||
|
||||
void react(InitEvent const &) {
|
||||
// 1. 检查通信是否正常
|
||||
double StartTime = PowerManagerFsm::pm->GetAppStartTime();
|
||||
while (PowerManagerFsm::pm->connectState < 5) {
|
||||
MOOSPause(1000);
|
||||
PowerManagerFsm::pm->updateTime();
|
||||
double dft = abs(PowerManagerFsm::pm->m_current_time - StartTime);
|
||||
if(dft > 10) {
|
||||
transit<FaultState>();
|
||||
PowerManagerFsm::pm->m_faultNum = 1;
|
||||
return;
|
||||
}
|
||||
string desp = "等待复合管控消息 : " + to_string(10-dft);
|
||||
PowerManagerFsm::pm->printState("InitState", desp);
|
||||
}
|
||||
|
||||
// 2. 检查复合管控器是否上报故障
|
||||
if(PowerManagerFsm::pm->checkError() < 0) {
|
||||
transit<FaultState>();
|
||||
PowerManagerFsm::pm->m_faultNum = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
// 3. 初始化系统为待机状态
|
||||
PowerManagerFsm::pm->initControlCmd();
|
||||
|
||||
// 4. 判断关键断路器是否闭合
|
||||
while (true) {
|
||||
if(PowerManagerFsm::pm->m_currentDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker == 1 ||
|
||||
PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit5CircuitBreaker == 1 ||
|
||||
PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit2CircuitBreaker == 1 ||
|
||||
PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit3CircuitBreaker == 1 ||
|
||||
PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit1CircuitBreaker == 1) {
|
||||
transit<StandbyState>();
|
||||
return;
|
||||
}
|
||||
PowerManagerFsm::pm->m_pmEvent = "等待关键断路器闭合";
|
||||
MOOSPause(1000);
|
||||
PowerManagerFsm::pm->printState("InitState", PowerManagerFsm::pm->m_pmEvent);
|
||||
}
|
||||
}
|
||||
void entry();
|
||||
void react(InitEvent const &);
|
||||
};
|
||||
|
||||
class StandbyState : public PowerManagerFsm {
|
||||
public:
|
||||
void entry() {
|
||||
PowerManagerFsm::pm->m_stateData.note = "待机状态";
|
||||
PowerManagerFsm::pm->printState("StandbyState", "进入待机状态");
|
||||
}
|
||||
|
||||
void react(StandbyEvent const &) {
|
||||
while (true) {
|
||||
// 1. 检查当前是否存在故障
|
||||
if(PowerManagerFsm::pm->checkError() < 0) {
|
||||
transit<FaultState>();
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 处理上位机控制指令
|
||||
handlePowerCommands();
|
||||
MOOSPause(1000);
|
||||
}
|
||||
}
|
||||
|
||||
void entry();
|
||||
void react(StandbyEvent const &);
|
||||
private:
|
||||
void handlePowerCommands() {
|
||||
switch (PowerManagerFsm::pm->m_msCmd.powerCMD) {
|
||||
case 0: PowerManagerFsm::pm->m_pmEvent = "收到上位机控制指令:关机"; break;
|
||||
case 1: handlePowerOn(); break;
|
||||
// 其他处理函数省略...
|
||||
}
|
||||
}
|
||||
|
||||
void handlePowerOn() {
|
||||
PowerManagerFsm::pm->m_pmEvent = "动力电上电";
|
||||
PowerManagerFsm::pm->m_CcuColCmd.powerBatCmd = 0x10;
|
||||
if(PowerManagerFsm::pm->m_pmCurrentState.ccustate.fcuState == 0x04)
|
||||
PowerManagerFsm::pm->m_CcuColCmd.fcuCmd = 0x02;
|
||||
}
|
||||
void handlePowerCommands();
|
||||
void handlePowerOn();
|
||||
};
|
||||
|
||||
class FaultState : public PowerManagerFsm {
|
||||
public:
|
||||
void entry() {
|
||||
PowerManagerFsm::pm->printState("FaultState", "进入故障状态");
|
||||
}
|
||||
|
||||
void react(FaultEvent const & e) {
|
||||
switch (e.faultCode) {
|
||||
case 1:
|
||||
PowerManagerFsm::pm->m_pmEvent = "复合管控连接超时";
|
||||
PowerManagerFsm::pm->printState("FaultState", "通信故障");
|
||||
break;
|
||||
case 2:
|
||||
PowerManagerFsm::pm->m_pmEvent = "能源系统故障";
|
||||
PowerManagerFsm::pm->printState("FaultState", "能源故障");
|
||||
break;
|
||||
}
|
||||
}
|
||||
void entry();
|
||||
void react(FaultEvent const &);
|
||||
};
|
||||
|
||||
// 设置初始状态
|
||||
FSM_INITIAL_STATE(PowerManagerFsm, InitState);
|
||||
// FSM_INITIAL_STATE(PowerManagerFsm, InitState)
|
||||
|
||||
#endif // POWER_MANAGER_FSM_HPP
|
||||
@@ -72,8 +72,11 @@ PowerManger::PowerManger()
|
||||
m_db->createDriversTables(VAR_TO_STR(m_MSDriverCmd));
|
||||
|
||||
// 初始化状态机
|
||||
cout << "init fsm" << endl;
|
||||
m_fsm.init(this);
|
||||
PowerManagerFsm::start();
|
||||
PowerManagerFsm::dispatch(InitEvent());
|
||||
cout << "init fsm ok" << endl;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
@@ -188,12 +191,12 @@ bool PowerManger::Iterate()
|
||||
// saveStringToJsonFile(a,"/home/zjk/project/H100/H100PowerManger/data/subDisSysCmd.json");
|
||||
///////////////////////
|
||||
//4. 写状态信息到数据库
|
||||
m_stateData.state_id = m_pmState.id;
|
||||
m_stateData.state_name = m_pmState.name;
|
||||
m_stateData.event = m_pmEvent;
|
||||
m_stateData.fault_code = m_faultNum;
|
||||
if(!m_db->insertStateData(m_stateData))
|
||||
return false;
|
||||
// m_stateData.state_id = m_pmState.id;
|
||||
// m_stateData.state_name = m_pmState.name;
|
||||
// m_stateData.event = m_pmEvent;
|
||||
// m_stateData.fault_code = m_faultNum;
|
||||
// if(!m_db->insertStateData(m_stateData))
|
||||
// return false;
|
||||
//AppCastingMOOSApp::PostReport();
|
||||
//5. 清空UDP消息队列
|
||||
m_udpComm.clearMsgQueue();
|
||||
@@ -336,13 +339,13 @@ bool PowerManger::FsmLoop()
|
||||
//状态机循环
|
||||
while (!m_FsmThread.IsQuitRequested())
|
||||
{
|
||||
// 检查故障并触发事件
|
||||
if(int error = checkError()) {
|
||||
triggerFaultEvent(error);
|
||||
} else {
|
||||
// 自动状态转换由状态机内部处理
|
||||
MOOSPause(1000);
|
||||
}
|
||||
// // 检查故障并触发事件
|
||||
// if(int error = checkError()) {
|
||||
// m_fsm.triggerFaultEvent(error);
|
||||
// } else {
|
||||
// // 自动状态转换由状态机内部处理
|
||||
// MOOSPause(1000);
|
||||
// }
|
||||
|
||||
//延时1s
|
||||
usleep(1000000);
|
||||
@@ -598,23 +601,23 @@ int PowerManger::checkError()
|
||||
}
|
||||
|
||||
|
||||
void PowerManger::triggerInitEvent()
|
||||
{
|
||||
PowerManagerFsm::dispatch(InitEvent());
|
||||
}
|
||||
// void PowerManger::triggerInitEvent()
|
||||
// {
|
||||
// PowerManagerFsm::dispatch(InitEvent());
|
||||
// }
|
||||
|
||||
void PowerManger::triggerStandbyEvent()
|
||||
{
|
||||
PowerManagerFsm::dispatch(StandbyEvent());
|
||||
}
|
||||
// void PowerManger::triggerStandbyEvent()
|
||||
// {
|
||||
// PowerManagerFsm::dispatch(StandbyEvent());
|
||||
// }
|
||||
|
||||
void PowerManger::triggerFaultEvent(unsigned int faultCode)
|
||||
{
|
||||
PowerManagerFsm::dispatch(FaultEvent(faultCode));
|
||||
}
|
||||
// void PowerManger::triggerFaultEvent(unsigned int faultCode)
|
||||
// {
|
||||
// PowerManagerFsm::dispatch(FaultEvent(faultCode));
|
||||
// }
|
||||
|
||||
void PowerManger::printState(const std::string& stateName, const std::string& desp){
|
||||
cout << MOOS::ConsoleColours::Yellow() << "STATE " << st.id << " [" << st.name << "] " << MOOS::ConsoleColours::reset();
|
||||
cout << MOOS::ConsoleColours::Yellow() << "STATE " << stateName << " " << MOOS::ConsoleColours::reset();
|
||||
cout << MOOS::ConsoleColours::Blue() << " -> " << MOOS::ConsoleColours::reset();
|
||||
// 检查desp是否有“故障”
|
||||
if (desp.find("故障") != string::npos) {
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
#define UNIX
|
||||
#define JSON_USE_EXCEPTION 1
|
||||
|
||||
// 前向声明
|
||||
class PowerManagerFsm;
|
||||
|
||||
#include <queue>
|
||||
#include "MOOS/libMOOS/Thirdparty/AppCasting/AppCastingMOOSApp.h"
|
||||
#include "MOOS/libMOOS/Utils/MOOSThread.h"
|
||||
@@ -75,7 +78,7 @@ class PowerManger : public AppCastingMOOSApp
|
||||
bool buildReport();
|
||||
void registerVariables();
|
||||
|
||||
protected:
|
||||
public:
|
||||
void updateTime(){m_current_time = MOOSTime();}
|
||||
bool IsSkewed(double dfTimeNow, double * pdfSkew = NULL);
|
||||
string getTypeName(const string typeName);
|
||||
@@ -96,7 +99,7 @@ class PowerManger : public AppCastingMOOSApp
|
||||
double msg_disHighAVolBusFbMsg_Update_time;
|
||||
double msg_disHighBVolBusFbMsg_Update_time;
|
||||
double msg_disLowBusFbMsg_Update_time;
|
||||
protected:
|
||||
public:
|
||||
//===========================交互状态变量==================================
|
||||
Driver m_driver; //设备驱动
|
||||
pmState m_pmCurrentState; //能源系统的当前状态
|
||||
@@ -106,7 +109,15 @@ class PowerManger : public AppCastingMOOSApp
|
||||
DriverTable m_MSDriverCmd;
|
||||
DriverTable m_subDisSysCmd;
|
||||
DriverTable m_subDisSysState;
|
||||
//===========================================================================
|
||||
std::string m_pmEvent; // 状态机事件描述
|
||||
//=============================运行变量======================================
|
||||
long m_lPort;
|
||||
unsigned int m_nReceiveBufferSizeKB;
|
||||
unsigned int m_nSendBufferSizeKB;
|
||||
double m_current_time;
|
||||
unsigned int m_faultNum;
|
||||
unsigned int m_ticker;
|
||||
//===========================================================================
|
||||
//系统运行状态
|
||||
unsigned char workCondition;
|
||||
unsigned char currentMod;
|
||||
@@ -141,12 +152,6 @@ class PowerManger : public AppCastingMOOSApp
|
||||
XPCUdpSocket *m_pCcuUdpComm;
|
||||
CMOOSThread m_ListenThread;
|
||||
CMOOSThread m_FsmThread;
|
||||
long m_lPort;
|
||||
unsigned int m_nReceiveBufferSizeKB;
|
||||
unsigned int m_nSendBufferSizeKB;
|
||||
double m_current_time;
|
||||
unsigned int m_faultNum;
|
||||
unsigned int m_ticker;
|
||||
|
||||
// 状态机实例
|
||||
PowerManagerFsm m_fsm;
|
||||
@@ -156,15 +161,10 @@ class PowerManger : public AppCastingMOOSApp
|
||||
void printState(const std::string& stateName, const std::string& desp);
|
||||
bool FSM_RUN_IS_OK = true;
|
||||
|
||||
// 初始化状态机
|
||||
void initFsm() {
|
||||
m_fsm.init(this);
|
||||
}
|
||||
|
||||
// 状态机事件触发接口
|
||||
void triggerInitEvent() { m_fsm.triggerInitEvent(); }
|
||||
void triggerStandbyEvent() { m_fsm.triggerStandbyEvent(); }
|
||||
void triggerFaultEvent(unsigned int faultCode) { m_fsm.triggerFaultEvent(faultCode); }
|
||||
// void triggerInitEvent() { m_fsm.triggerInitEvent(); }
|
||||
// void triggerStandbyEvent() { m_fsm.triggerStandbyEvent(); }
|
||||
// void triggerFaultEvent(unsigned int faultCode) { m_fsm.triggerFaultEvent(faultCode); }
|
||||
//==================================================================================
|
||||
int checkError();
|
||||
bool shutdown();
|
||||
|
||||
@@ -1,103 +0,0 @@
|
||||
#include "fsm.h"
|
||||
#include <iostream>
|
||||
|
||||
|
||||
FSM::FSM(/* args */)
|
||||
{
|
||||
idStateMap.clear();
|
||||
handleMap.clear();
|
||||
stateMap.clear();
|
||||
};
|
||||
|
||||
FSM::~FSM()
|
||||
{
|
||||
};
|
||||
|
||||
int FSM::run(FSM_State &fsm,void* data)
|
||||
{
|
||||
FSM_Handle handle = handleMap[fsm.id];
|
||||
return handle(fsm,data);
|
||||
}
|
||||
int FSM::RegisterHandleFunction(FSM_State* fsm, FSM_Handle handle)
|
||||
{
|
||||
if(fsm == NULL)
|
||||
return -1;
|
||||
if(handleMap.count(fsm->id) > 0)
|
||||
return -1;
|
||||
handleMap[fsm->id] = handle;
|
||||
return 0;
|
||||
}
|
||||
int FSM::unRegisterHandleFunction(FSM_State* fsm)
|
||||
{
|
||||
if(fsm == NULL)
|
||||
return -1;
|
||||
if(handleMap.count(fsm->id) <= 0)
|
||||
return -1;
|
||||
handleMap.erase(fsm->id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int FSM::RegisterState(std::string name, unsigned int id,FSM_State &state)
|
||||
{
|
||||
if(stateMap.count(name) > 0)
|
||||
return -1;
|
||||
if(idStateMap.count(id) > 0)
|
||||
return -1;
|
||||
state.name = name;
|
||||
state.id = id;
|
||||
stateMap[name] = state;
|
||||
idStateMap[id] = state;
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int FSM::getStateId(std::string name)
|
||||
{
|
||||
return stateMap[name].id;
|
||||
}
|
||||
|
||||
FSM_State FSM::getState(std::string name)
|
||||
{
|
||||
return stateMap[name];
|
||||
}
|
||||
|
||||
|
||||
int FSM::RegisterEvent(FSM_State* fsm, std::string event, FSM_State *state)
|
||||
{
|
||||
if(fsm == NULL)
|
||||
return -1;
|
||||
fsm->event[event] = state;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int FSM::unRegisterEvent(FSM_State* fsm, std::string event)
|
||||
{
|
||||
if(fsm == NULL)
|
||||
return -1;
|
||||
if(fsm->event.count(event) <= 0)
|
||||
return -1;
|
||||
fsm->event.erase(event);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int FSM::run(FSM_State *fsm,void* data, std::string event)
|
||||
{
|
||||
if(fsm->event.count(event) <= 0)
|
||||
{
|
||||
std::cout << "no event" << std::endl;
|
||||
return run(*(fsm),data);
|
||||
}
|
||||
else
|
||||
{
|
||||
int r = run(*(fsm),data);
|
||||
// fsm = fsm->event[event];
|
||||
*fsm = *fsm->event[event];
|
||||
// std::cout << "event " << event <<std::endl;
|
||||
// std::cout << "fsm" << fsm->name << std::endl;
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
// int FSM::run(FSM_State *fsm,void* data)
|
||||
// {
|
||||
// return run(*fsm,data);
|
||||
// }
|
||||
@@ -1,46 +0,0 @@
|
||||
#ifndef FSM_H
|
||||
#define FSM_H
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
|
||||
|
||||
typedef struct FSM_State
|
||||
{
|
||||
std::string name;
|
||||
unsigned int id;
|
||||
std::map<std::string,FSM_State*> event;
|
||||
}FSM_State;
|
||||
|
||||
typedef int (*FSM_Handle)(FSM_State &fsm, void *data);
|
||||
// typedef int (*FSM_EventHandle)(FSM_State &fsm,std::string event,void *data);
|
||||
|
||||
class FSM
|
||||
{
|
||||
public:
|
||||
FSM();
|
||||
~FSM();
|
||||
std::map<unsigned int, FSM_Handle> handleMap;
|
||||
std::map<std::string, FSM_State> stateMap;
|
||||
std::map<unsigned int, FSM_State> idStateMap;
|
||||
|
||||
int run(FSM_State &fsm,void* data);
|
||||
int run(FSM_State *fsm,void* data, std::string event);
|
||||
|
||||
// 事件处理机制
|
||||
int RegisterEvent(FSM_State* fsm, const std::string& event, FSM_State *state);
|
||||
int unRegisterEvent(FSM_State* fsm, const std::string& event);
|
||||
|
||||
// 状态管理
|
||||
int RegisterState(const std::string& name, unsigned int id, FSM_State &state);
|
||||
FSM_State getState(const std::string& name) const;
|
||||
unsigned int getStateId(const std::string& name) const;
|
||||
|
||||
// 处理函数管理
|
||||
int RegisterHandleFunction(FSM_State* fsm, FSM_Handle handle);
|
||||
int unRegisterHandleFunction(FSM_State* fsm);
|
||||
|
||||
// 事件触发
|
||||
int triggerEvent(FSM_State* currentState, const std::string& event, void* data);
|
||||
};
|
||||
#endif
|
||||
Reference in New Issue
Block a user