使用tinyfsm优化代码

This commit is contained in:
zjk
2025-04-06 23:51:03 +08:00
parent 002df307d7
commit ebf1701335
9 changed files with 158 additions and 321 deletions
+1 -4
View File
@@ -1,8 +1,5 @@
//------------------------------------------------
// pPowerManger config block
ProcessConfig = pPowerManger
{
AppTick = 5
AppTick = 4
CommsTick = 4
}
+1 -1
View File
@@ -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})
View File
+92 -18
View File
@@ -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);
+17 -105
View File
@@ -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
+30 -27
View File
@@ -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,24 +601,24 @@ 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::Blue() << " -> " << 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) {
cout << MOOS::ConsoleColours::Red() << desp << MOOS::ConsoleColours::reset() << endl;
+17 -17
View File
@@ -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();
-103
View File
@@ -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);
// }
-46
View File
@@ -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