From 785a47ff99e62b557d1469a9ba266c6464df6695 Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Wed, 9 Apr 2025 15:11:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=80=9A=E4=BF=A1=E4=BB=A3?= =?UTF-8?q?=E7=A0=81,=E4=BF=AE=E5=A4=8D=E7=8A=B6=E6=80=81=E6=9C=BA?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/msg/uPower_currentState_st.json | 2 +- data/msg/uPower_disSysState_st.json | 6 +- data/msg/uPower_fcsState_st.json | 28 ++--- data/msg/uPower_liBatState_st.json | 22 ++-- src/pPowerManger/LowerCommManager.cpp | 6 + src/pPowerManger/PowerManagerFsm.cpp | 7 ++ src/pPowerManger/PowerManagerFsm.hpp | 35 ++++-- src/pPowerManger/PowerManger.cpp | 151 ++++---------------------- src/pPowerManger/PowerManger.h | 53 ++------- src/pPowerManger/UpperCommManager.cpp | 113 ++++++++++++++++--- src/pPowerManger/UpperCommManager.h | 31 +++++- 11 files changed, 219 insertions(+), 235 deletions(-) diff --git a/data/msg/uPower_currentState_st.json b/data/msg/uPower_currentState_st.json index a8a0701..41648bf 100644 --- a/data/msg/uPower_currentState_st.json +++ b/data/msg/uPower_currentState_st.json @@ -6,7 +6,7 @@ "HVABbusBVol_uint16": 0, "HVABmastSteGeaCur_uint16": 0, "HVABopenWaterCur_uint16": 0, - "HVABxczCur_uint16": 1, + "HVABxczCur_uint16": 0, "HVBBCCUCur_uint16": 0, "HVBBFCSSecurSysCur_uint16": 0, "HVBBbatInsCur_uint16": 0, diff --git a/data/msg/uPower_disSysState_st.json b/data/msg/uPower_disSysState_st.json index 90bc4ac..ed8e1bf 100644 --- a/data/msg/uPower_disSysState_st.json +++ b/data/msg/uPower_disSysState_st.json @@ -1,8 +1,8 @@ { "HVolABusBreaker_unit16": 0, - "HVolBBusBreaker_unit16": 79, - "HVolBusBreaker_uint16": 58, - "LVolBusBreaker_uint16": 159, + "HVolBBusBreaker_unit16": 0, + "HVolBusBreaker_uint16": 0, + "LVolBusBreaker_uint16": 0, "faultCode_array": [ 0 diff --git a/data/msg/uPower_fcsState_st.json b/data/msg/uPower_fcsState_st.json index 200368f..31141fb 100644 --- a/data/msg/uPower_fcsState_st.json +++ b/data/msg/uPower_fcsState_st.json @@ -1,30 +1,30 @@ { - "backpressure1_fp32": 5.0, - "backpressure2_fp32": 3.0, - "ch4oConcent1_fp32": 85.0, - "ch4oConcent2_fp32": 48.0, + "backpressure1_fp32": 0.0, + "backpressure2_fp32": 0.0, + "ch4oConcent1_fp32": 0.0, + "ch4oConcent2_fp32": 0.0, "ch4o_fp32": 0.0, - "excTemp_fp32": 37.0, + "excTemp_fp32": 0.0, "faultCode1_uint16": 0, "faultCode2_uint16": 0, "faultCode3_uint16": 0, "fcuCurIns_fp32": 0.0, "fcuCurPower_fp32": 0.0, - "fcuCur_fp32": 6.0, + "fcuCur_fp32": 0.0, "fcuFaultLeve_uint8": 0, - "fcuOutIns_fp32": 76.0, - "fcuOutPower_fp32": 912.0, + "fcuOutIns_fp32": 0.0, + "fcuOutPower_fp32": 0.0, "fcuState_uint8": 0, "fcuVolIns_fp32": 0.0, "fcuVolPower_fp32": 0.0, - "fcuVol_fp32": 236.0, + "fcuVol_fp32": 0.0, "flameDet_uint8": 0, - "h2Concent1_fp32": 32.0, - "h2Concent2_fp32": 50.0, - "o2Concent1_fp32": 56.0, - "o2Concent2_fp32": 91.0, + "h2Concent1_fp32": 0.0, + "h2Concent2_fp32": 0.0, + "o2Concent1_fp32": 0.0, + "o2Concent2_fp32": 0.0, "o2Level_fp32": 0.0, "o2_fp32": 0.0, - "powLimit_fp32": 64.0, + "powLimit_fp32": 0.0, "powerGen_fp32": 0.0 } \ No newline at end of file diff --git a/data/msg/uPower_liBatState_st.json b/data/msg/uPower_liBatState_st.json index a062620..b3e9fd4 100644 --- a/data/msg/uPower_liBatState_st.json +++ b/data/msg/uPower_liBatState_st.json @@ -2,37 +2,37 @@ "fcuCurToInsLimit1_uint8": 0, "fcuCurToinsLimit2_uint8": 0, "insBatCurElect_uint16": 0, - "insBatLimit_uint16": 6, - "insBatSoc_uint8": 9, - "insBatTotalElect_uint16": 667, + "insBatLimit_uint16": 0, + "insBatSoc_uint8": 0, + "insBatTotalElect_uint16": 0, "insChargeState_uint8": 0, "insCurSocHold1_uint8": 0, "insCurSocHold2_uint8": 0, "insCurSocHold3_uint8": 0, - "insCurrent_uint16": 13, + "insCurrent_uint16": 0, "insLinkVol_uint16": 0, - "insNegRelayState_uint8": 1, + "insNegRelayState_uint8": 0, "insNegRes_uint16": 0, "insPackVol_uint16": 0, "insPosRelayState_uint8": 0, "insPosRes_uint16": 0, "insfaultCode_uint8": 0, "powBatCurElect_uint16": 0, - "powBatSoc_uint8": 24, - "powBatTotalElect_uint16": 142, + "powBatSoc_uint8": 0, + "powBatTotalElect_uint16": 0, "powChargeState_uint8": 0, "powCurSocHold1_uint8": 0, "powCurSocHold2_uint8": 0, "powCurSocHold3_uint8": 0, "powCurToInsLimit1_uint8": 0, "powCurToinsLimit2_uint8": 0, - "powCur_uint16": 86, + "powCur_uint16": 0, "powLinkVol_uint16": 0, - "powNegRelayState_uint8": 1, + "powNegRelayState_uint8": 0, "powNegRes_uint16": 0, - "powPosRelayState_uint8": 1, + "powPosRelayState_uint8": 0, "powPosRes_uint16": 0, - "powerBatLimit_uint16": 77, + "powerBatLimit_uint16": 0, "powerPackVol_uint16": 0, "powfaultCode_uint8": 0 } \ No newline at end of file diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp index 8a817eb..2b1f7bd 100644 --- a/src/pPowerManger/LowerCommManager.cpp +++ b/src/pPowerManger/LowerCommManager.cpp @@ -317,4 +317,10 @@ char LowerCommManager::getBreakerOption(char cmd) return 0xAA; else return 0x00; +} + +//TODO:根据心跳检查连接状态 +bool LowerCommManager::checkConnection() +{ + m_pm->connectState =5; } \ No newline at end of file diff --git a/src/pPowerManger/PowerManagerFsm.cpp b/src/pPowerManger/PowerManagerFsm.cpp index 50cd2d7..8849ab9 100644 --- a/src/pPowerManger/PowerManagerFsm.cpp +++ b/src/pPowerManger/PowerManagerFsm.cpp @@ -8,12 +8,15 @@ PowerManger* PowerManagerFsm::pm = nullptr; // InitState实现 void InitState::entry() { + PowerManagerFsm::entry(); + std::cout << "===========================" << std::endl; // PowerManagerFsm::pm->m_pmEvent = "初始化状态"; PowerManagerFsm::pm->printState("InitState", "进入初始化状态"); } void InitState::react(InitEvent const &) { // double StartTime = PowerManagerFsm::pm->GetAppStartTime(); + std::cout << "开始初始化" << std::endl; double StartTime = 0; while (PowerManagerFsm::pm->connectState < 5) { MOOSPause(1000); @@ -49,10 +52,14 @@ void InitState::react(InitEvent const &) { MOOSPause(1000); PowerManagerFsm::pm->printState("InitState", PowerManagerFsm::pm->m_pmEvent); } + std::cout << "InitState: 初始化完成" << std::endl; + //转换到待机状态 + transit(); } // StandbyState实现 void StandbyState::entry() { + PowerManagerFsm::entry(); PowerManagerFsm::pm->printState("StandbyState", "进入待机状态"); } diff --git a/src/pPowerManger/PowerManagerFsm.hpp b/src/pPowerManger/PowerManagerFsm.hpp index eeeacc7..0be6748 100644 --- a/src/pPowerManger/PowerManagerFsm.hpp +++ b/src/pPowerManger/PowerManagerFsm.hpp @@ -6,30 +6,48 @@ // 前向声明 class PowerManger; +enum class PowerSystemState { + INIT, + STANDBY, + FAULT, +}; + // 定义事件类型 +//==================状态切换事件============================= struct InitEvent : tinyfsm::Event { }; struct StandbyEvent : tinyfsm::Event { }; struct FaultEvent : tinyfsm::Event { unsigned int faultCode; FaultEvent(unsigned int code) : faultCode(code) {} }; +//==================状态流程事件============================ +struct MasterCommandEvent : tinyfsm::Event { }; +struct TaskStart : tinyfsm::Event { }; +// struct + // 定义状态机基类 -class PowerManagerFsm : public tinyfsm::MooreMachine { +class PowerManagerFsm : public tinyfsm::Fsm { protected: static PowerManger* pm; - + public: // 初始化状态机 static void init(PowerManger* powerManager) { pm = powerManager; } // 响应事件默认实现 - virtual void react(tinyfsm::Event const &) { } + virtual void react(tinyfsm::Event const &) { std::cout << "[ Reseve Envt ] " << "No Idear" << std::endl; } + virtual void react(InitEvent const &) {}; + virtual void react(StandbyEvent const &) {}; + virtual void react(FaultEvent const &) {}; + virtual void react(MasterCommandEvent const &) {}; + virtual void react(TaskStart const &) {}; // 状态机生命周期方法 - void entry() {std::cout << "Enter state: " << typeid(*this).name() << std::endl;} // 进入状态 - void exit() {std::cout << "Exit state: " << typeid(*this).name() << std::endl;} // 退出状态 + virtual void entry() {std::cout << "[ Enter state ] : " << typeid(*this).name() << std::endl;} // 进入状态 + virtual void exit() {std::cout << "[ Exit state ] : " << typeid(*this).name() << std::endl;} // 退出状态 + // 状态转换接口 void triggerInitEvent() { dispatch(InitEvent()); } @@ -40,14 +58,15 @@ public: class InitState : public PowerManagerFsm { public: - void entry(); + void entry() override; void react(InitEvent const &); }; class StandbyState : public PowerManagerFsm { public: - void entry(); + void entry() override; void react(StandbyEvent const &); + PowerSystemState getCurrentState(); private: void handlePowerCommands(); void handlePowerOn(); @@ -55,7 +74,7 @@ private: class FaultState : public PowerManagerFsm { public: - void entry(); + void entry() override; void react(FaultEvent const &); }; diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index 7e651b6..a78b461 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -35,15 +35,6 @@ PowerManger::PowerManger() m_ticker = 0; faultCode.push_back(0); - // msg_CcuStateFbMsg_Update_time = 0; - // // msg_CcuSetParmFbMsg_Update_time = 0; - // msg_disHighVolBusFbMsg_Update_time = 0; - // msg_disHighAVolBusFbMsg_Update_time = 0; - // msg_disHighBVolBusFbMsg_Update_time = 0; - // msg_disLowBusFbMsg_Update_time = 0; - - connectState = 0; - m_pmCurrentState = {}; m_currentDisBreakerState = {}; m_targetDisBreakerState = {}; @@ -65,19 +56,6 @@ PowerManger::PowerManger() m_db->createDriversTables(VAR_TO_STR(m_subDisSysCmd)); m_db->createDriversTables(VAR_TO_STR(m_MSDriverCmd)); - //初始化UDP通信 - m_lowerCommManager = new LowerCommManager(this,IPORT,CCUPORT,CCUHOST); - m_lowerCommManager->initUdpComm(); - - //初始化上位机通信 - m_upperCommManager = new UpperCommManager(this); - - // 初始化状态机 - cout << "init fsm" << endl; - m_fsm.init(this); - PowerManagerFsm::start(); - PowerManagerFsm::dispatch(InitEvent()); - cout << "init fsm ok" << endl; } //--------------------------------------------------------- @@ -103,32 +81,9 @@ bool PowerManger::OnNewMail(MOOSMSG_LIST &NewMail) string key = msg.GetKey(); string strJson = msg.GetString(); //处理上位机发送的控制指令 - if(key == DB_TO_PM_MSCMD) + if(!m_upperCommManager->processUpperMsg(key,strJson)) { - if(getMsCmdFromJson(m_msCmd,strJson)) - { - cout << "get ms cmd:" << strJson << endl; - } - else - { - cout << MOOS::ConsoleColours::Red << "get ms cmd error:" << strJson << MOOS::ConsoleColours::reset << endl; - } - } - //处理设备上电指令 - if (key == DB_TO_PM_EQUIPMENTCMD) - { - if(m_driver.loadDriverTableFromJson(strJson,m_subDisSysCmd) < 0) - { - cout << MOOS::ConsoleColours::Red << "get sub dis cmd error:" << strJson << MOOS::ConsoleColours::reset << endl; - } - } - //处理设备状态反馈 - if(key == DB_TO_PM_SUBDISSTATE) - { - if(m_driver.loadDriverTableFromJson(strJson,m_subDisSysState) < 0) - { - cout << MOOS::ConsoleColours::Red << "get sub dis state error:" << strJson << MOOS::ConsoleColours::reset << endl; - } + cout << "processUpperMsg failed" << endl; } #if 0 // Keep these around just for template @@ -167,13 +122,15 @@ bool PowerManger::OnConnectToServer() bool PowerManger::Iterate() { AppCastingMOOSApp::Iterate(); + // 打印当前状态 + // cout << " Current State : " << (int)PowerManagerFsm::current_state_ptr->getCurrentState(); if (m_ticker++ % 5 == 0) { m_lowerCommManager->processPeriodicTasks(); m_upperCommManager->processPeriodicTasks(); // buildPowerSysReport(); - Notify(PM_TO_DB_SUBDISCMD,m_driver.saveDriverTableToJson(&m_subDisSysCmd)); - Notify(PM_TO_DB_EQUIPMENTSTATE,m_driver.saveDriverTableToJson(&m_currentDriverState)); + //Notify(PM_TO_DB_SUBDISCMD,m_driver.saveDriverTableToJson(&m_subDisSysCmd)); + //Notify(PM_TO_DB_EQUIPMENTSTATE,m_driver.saveDriverTableToJson(&m_currentDriverState)); //d.保存到数据库 writeDataToDB(); } @@ -229,7 +186,19 @@ bool PowerManger::OnStartUp() } registerVariables(); + //初始化UDP通信 + m_lowerCommManager = new LowerCommManager(this,IPORT,CCUPORT,CCUHOST); + m_lowerCommManager->initUdpComm(); m_lowerCommManager->startListenThread(); + + //初始化上位机通信 + m_upperCommManager = new UpperCommManager(this); + + // 初始化状态机 + PowerManagerFsm::init(this); + PowerManagerFsm::start(); + InitEvent initEvent; + PowerManagerFsm::dispatch(initEvent); return(true); } @@ -263,22 +232,6 @@ bool PowerManger::buildReport() return(true); } -//------------------------------------------------------------ -// Procedure: setUdpScoket() -XPCUdpSocket* PowerManger::setUdpScoket(long lPort) -{ - XPCUdpSocket* pUdpSocket = new XPCUdpSocket(lPort); - try - { - pUdpSocket->vBindSocket(); - } - catch(const std::exception& e) - { - std::cerr << e.what() << '\n'; - return NULL; - } - return pUdpSocket; -} bool PowerManger::FsmLoop() @@ -302,9 +255,6 @@ bool PowerManger::FsmLoop() bool PowerManger::writeDataToDB() { - // //写入配电系统状态 - // if(!m_db->insertDisCcuData(m_pmCurrentState)) - // return false; //写入设备状态 if(!m_db->insertDriverTables(m_currentDriverState,VAR_TO_STR(m_currentDriverState))) return false; @@ -333,22 +283,6 @@ int PowerManger::checkError() //2.检查断路器状态 } - -// void PowerManger::triggerInitEvent() -// { -// PowerManagerFsm::dispatch(InitEvent()); -// } - -// void PowerManger::triggerStandbyEvent() -// { -// PowerManagerFsm::dispatch(StandbyEvent()); -// } - -// 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 " << stateName << " " << MOOS::ConsoleColours::reset(); cout << MOOS::ConsoleColours::Blue() << " -> " << MOOS::ConsoleColours::reset(); @@ -361,7 +295,6 @@ void PowerManger::printState(const std::string& stateName, const std::string& de } - //==============================系统操作函数==================== bool PowerManger::shutdown() { @@ -425,50 +358,4 @@ void PowerManger::initControlCmd() m_msCmd.workCMD = 99; //================初始化设备驱动指令======================== -} - - -bool PowerManger::getMsCmdFromJson(MSControlCmd &cmd, const std::string &strJson) -{ - Json::CharReaderBuilder builder; - Json::Value root; - std::string errs; - - // 解析JSON字符串 - std::istringstream s(strJson); - if (!Json::parseFromStream(builder, s, &root, &errs)) - { - std::cerr << "JSON解析失败: " << errs << std::endl; - return false; // 解析失败 - } - if (root.isMember("powerCMD") && root["powerCMD"].isUInt()) - { - cmd.powerCMD = root["powerCMD"].asUInt(); - } - else - { - std::cerr << "缺少或类型不匹配: powerCMD" << std::endl; - return false; // 缺少或类型不匹配 - } - - if (root.isMember("modCMD") && root["modCMD"].isUInt()) - { - cmd.modCMD = root["modCMD"].asUInt(); - } - else - { - std::cerr << "缺少或类型不匹配: modCMD" << std::endl; - return false; // 缺少或类型不匹配 - } - - if (root.isMember("workCMD") && root["workCMD"].isUInt()) - { - cmd.workCMD = root["workCMD"].asUInt(); - } - else - { - std::cerr << "缺少或类型不匹配: workCMD" << std::endl; - return false; // 缺少或类型不匹配 - } - return true; // 成功 -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/pPowerManger/PowerManger.h b/src/pPowerManger/PowerManger.h index 02bd5c0..f5c754c 100644 --- a/src/pPowerManger/PowerManger.h +++ b/src/pPowerManger/PowerManger.h @@ -20,9 +20,6 @@ #define UNIX #define JSON_USE_EXCEPTION 1 -// 前向声明 -class PowerManagerFsm; - #include #include "MOOS/libMOOS/Thirdparty/AppCasting/AppCastingMOOSApp.h" #include "MOOS/libMOOS/Utils/MOOSThread.h" @@ -46,22 +43,6 @@ class PowerManagerFsm; #define MAX_UDP_PKT_SIZE 65535 #define SKEW_TOLERANCE 5 -//能源管理反馈的消息 -#define PM_TO_DB_STATE "uPower_pmState_st" -#define PM_TO_DB_CURRENTSTATE "uPower_currentState_st" -#define PM_TO_DB_DISSTATE "uPower_disSysState_st" -#define PM_TO_DB_LIBATSTATE "uPower_liBatState_st" -#define PM_TO_DB_FCSSTATE "uPower_fcsState_st" - -#define PM_TO_DB_SUBDISCMD "uPower_secdistState_cmd" -#define PM_TO_DB_EQUIPMENTSTATE "uPower_equState_fb" - -//控制消息 -//TODO:实现上位机交互控制功能 -#define DB_TO_PM_MSCMD "uPower_sysState_cmd" -#define DB_TO_PM_EQUIPMENTCMD "uPower_equState_cmd" -#define DB_TO_PM_SUBDISSTATE "uDevice_secdistState_st" - class PowerManger : public AppCastingMOOSApp { public: @@ -80,20 +61,10 @@ class PowerManger : public AppCastingMOOSApp public: void updateTime(){m_current_time = MOOSTime();} - bool IsSkewed(double dfTimeNow, double * pdfSkew = NULL); - string getTypeName(const string typeName); - bool inline saveStringToJsonFile(const string &strJson, const string &strFileName); //数据库 SQLiteDB* m_db; bool writeDataToDB(); - //通信状态变量及操作函数 - XPCUdpSocket* setUdpScoket(long lPort); - // bool updatePmState(); - // bool updateConnectState(); - - int connectState; - /************************************************************/ /* |<------------FEEDBACK--------<-- */ /* | | */ @@ -113,6 +84,9 @@ class PowerManger : public AppCastingMOOSApp disSysBreakerList m_currentDisBreakerState; //配电断路器状态 DriverTable m_currentDriverState; DriverTable m_subDisSysState; + + int m_depth; + int m_missionCode; //===========================STATE========================================= unsigned char workCondition; unsigned char currentMod; @@ -121,24 +95,19 @@ class PowerManger : public AppCastingMOOSApp vector faultCode; unsigned int soc; unsigned int sustainableTime; + unsigned int m_faultNum; + Driver m_driver; //设备表处理 + std::string m_pmEvent; // 状态机事件描述 //===========================CONFIG======================================== long m_lPort; unsigned int m_nReceiveBufferSizeKB; unsigned int m_nSendBufferSizeKB; - double m_current_time; - unsigned int m_faultNum; + double m_current_time; unsigned int m_ticker; - //===========================交互状态变量================================== - Driver m_driver; //设备驱动 - std::string m_pmEvent; // 状态机事件描述 - //=============================运行变量====================================== - // char getBreakerOption(char cmd); - void initControlCmd(); - - //上位机操作函数 - - // bool buildPowerSysReport(); - bool getMsCmdFromJson(MSControlCmd &cmd,const string &strJson); + int connectState; + + //=============================过程函数====================================== + void initControlCmd(); private: // CMOOSThread m_FsmThread; diff --git a/src/pPowerManger/UpperCommManager.cpp b/src/pPowerManger/UpperCommManager.cpp index c9a25f4..7497913 100644 --- a/src/pPowerManger/UpperCommManager.cpp +++ b/src/pPowerManger/UpperCommManager.cpp @@ -6,39 +6,116 @@ UpperCommManager::UpperCommManager(PowerManger* pm) : m_pm(pm) {} bool UpperCommManager::processUpperMsg(const string& key, const string& strJson) { if(key == DB_TO_PM_MSCMD) { - if(m_pm->getMsCmdFromJson(m_pm->m_msCmd, strJson)) { - cout << "get ms cmd:" << strJson << endl; - return true; - } else { - cout << MOOS::ConsoleColours::Red << "get ms cmd error:" << strJson - << MOOS::ConsoleColours::reset << endl; - } + m_pm->m_msCmd = getMasterControlCmd(key, strJson); + return true; } else if(key == DB_TO_PM_EQUIPMENTCMD) { - if(m_pm->m_driver.loadDriverTableFromJson(strJson, m_pm->m_subDisSysCmd) < 0) { - cout << MOOS::ConsoleColours::Red << "get sub dis cmd error:" << strJson - << MOOS::ConsoleColours::reset << endl; - } + m_pm->m_MSDriverCmd = getEquipmentCmd(key, strJson); return true; } else if(key == DB_TO_PM_SUBDISSTATE) { - if(m_pm->m_driver.loadDriverTableFromJson(strJson, m_pm->m_subDisSysState) < 0) { - cout << MOOS::ConsoleColours::Red << "get sub dis state error:" << strJson - << MOOS::ConsoleColours::reset << endl; - } + m_pm->m_subDisSysState = getSubDisState(key, strJson); return true; } + std::cout << "Unknown key: " << key << std::endl; return false; } +const MSControlCmd UpperCommManager::getMasterControlCmd(const std::string& key, const std::string& msg) +{ + MSControlCmd cmd; + if (parseControlCmdFromJson(cmd, msg)) { + return cmd; + } + else + { + cout << MOOS::ConsoleColours::Red << "parse control cmd error:" << msg + << MOOS::ConsoleColours::reset << endl; + } +} + +const DriverTable UpperCommManager::getEquipmentCmd(const std::string& key, const std::string& msg) +{ + DriverTable cmd; + if (m_pm->m_driver.loadDriverTableFromJson(msg, cmd) < 0) { + cout << MOOS::ConsoleColours::Red << "get equipment cmd error:" << msg + << MOOS::ConsoleColours::reset << endl; + } + return cmd; +} + +const DriverTable UpperCommManager::getSubDisState(const std::string& key, const std::string& msg) +{ + DriverTable state; + if (m_pm->m_driver.loadDriverTableFromJson(msg, state) < 0) { + cout << MOOS::ConsoleColours::Red << "get sub dis state error:" << msg + << MOOS::ConsoleColours::reset << endl; + } +} + +const std::string UpperCommManager::getCurrentEquState(DriverTable& driver) +{ + return m_pm->m_driver.saveDriverTableToJson(&driver); +} + +const std::string UpperCommManager::getSubDisCmd(DriverTable& driver) +{ + return m_pm->m_driver.saveDriverTableToJson(&driver); +} + void UpperCommManager::processPeriodicTasks() { buildSystemReport(); - // m_pm->Notify(PM_TO_DB_SUBDISCMD, m_pm->m_driver.saveDriverTableToJson(&m_pm->m_subDisSysCmd)); - // m_pm->Notify(PM_TO_DB_EQUIPMENTSTATE, m_pm->m_driver.saveDriverTableToJson(&m_pm->m_currentDriverState)); + std::string strJson; + strJson = getCurrentEquState(m_pm->m_currentDriverState); + m_pm->sendNotification(PM_TO_DB_EQUIPMENTSTATE, strJson); + strJson = getSubDisCmd(m_pm->m_subDisSysCmd); + m_pm->sendNotification(PM_TO_DB_SUBDISCMD, strJson); } +bool UpperCommManager::parseControlCmdFromJson(MSControlCmd &cmd, const std::string &strJson) +{ + Json::CharReaderBuilder builder; + Json::Value root; + std::string errs; + // 解析JSON字符串 + std::istringstream s(strJson); + if (!Json::parseFromStream(builder, s, &root, &errs)) + { + std::cerr << "JSON解析失败: " << errs << std::endl; + return false; // 解析失败 + } + if (root.isMember("powerCMD") && root["powerCMD"].isUInt()) + { + cmd.powerCMD = root["powerCMD"].asUInt(); + } + else + { + std::cerr << "缺少或类型不匹配: powerCMD" << std::endl; + return false; // 缺少或类型不匹配 + } + + if (root.isMember("modCMD") && root["modCMD"].isUInt()) + { + cmd.modCMD = root["modCMD"].asUInt(); + } + else + { + std::cerr << "缺少或类型不匹配: modCMD" << std::endl; + return false; // 缺少或类型不匹配 + } + + if (root.isMember("workCMD") && root["workCMD"].isUInt()) + { + cmd.workCMD = root["workCMD"].asUInt(); + } + else + { + std::cerr << "缺少或类型不匹配: workCMD" << std::endl; + return false; // 缺少或类型不匹配 + } + return true; // 成功 +} void UpperCommManager::buildSystemReport() { - //TODO: 构建能源系统报告 string suffix; Json::Value pms; Json::Value fcs; diff --git a/src/pPowerManger/UpperCommManager.h b/src/pPowerManger/UpperCommManager.h index 2ffa099..3ab3bcb 100644 --- a/src/pPowerManger/UpperCommManager.h +++ b/src/pPowerManger/UpperCommManager.h @@ -10,6 +10,24 @@ #include using namespace std; #define VAR_TO_STR(var) #var +//能源管理反馈的消息 +#define PM_TO_DB_STATE "uPower_pmState_st" +#define PM_TO_DB_CURRENTSTATE "uPower_currentState_st" +#define PM_TO_DB_DISSTATE "uPower_disSysState_st" +#define PM_TO_DB_LIBATSTATE "uPower_liBatState_st" +#define PM_TO_DB_FCSSTATE "uPower_fcsState_st" + +#define PM_TO_DB_SUBDISCMD "uPower_secdistState_cmd" +#define PM_TO_DB_EQUIPMENTSTATE "uPower_equState_fb" + +//控制消息 +#define DB_TO_PM_MSCMD "uPower_sysState_cmd" +#define DB_TO_PM_EQUIPMENTCMD "uPower_equState_cmd" +#define DB_TO_PM_SUBDISSTATE "uDevice_secdistState_st" + +//决策消息 +#define DB_TO_PM_DEEPTH "uPower_depth_fb" +#define DB_TO_PM_MISSION "uPlan_taskStart_cmd" class PowerManger; // 前向声明 @@ -27,17 +45,18 @@ public: // 生成系统报告 void buildSystemReport(); - // 获取控制命令 - const MSControlCmd& getControlCmd() const { return m_msCmd; } - - // 更新设备命令状态 - void updateEquipmentCmd(const DriverTable& cmd); + // 消息处理函数 + const MSControlCmd getMasterControlCmd(const std::string& key, const std::string& msg); + const DriverTable getEquipmentCmd(const std::string& key, const std::string& msg); + const DriverTable getSubDisState(const std::string& key, const std::string& msg); + + const std::string getCurrentEquState(DriverTable& driver); + const std::string getSubDisCmd(DriverTable& driver); // 其他公共函数 string getTypeName(const string typeName); bool saveStringToJsonFile(const string &strJson, const string &filePath); - private: PowerManger* m_pm; MSControlCmd m_msCmd;