使用tinyfsm优化代码
This commit is contained in:
@@ -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);
|
||||
Reference in New Issue
Block a user