增加了xc声纳的上电
This commit is contained in:
@@ -63,6 +63,7 @@ SET(SRC
|
||||
LowerCommManager.cpp
|
||||
UpperCommManager.cpp
|
||||
# loguru.cpp
|
||||
upmsg/upmsg_definitions.cpp
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(pPowerManger ${SRC})
|
||||
|
||||
@@ -77,17 +77,37 @@ bool LowerCommManager::initUdpComm(){
|
||||
}
|
||||
void LowerCommManager::processPeriodicTasks() {
|
||||
sendCcuCommand(m_pm->m_CcuColCmd);
|
||||
// cout << "send ccu command" << endl;
|
||||
m_pm->m_db->insertData(m_pm->m_CcuColCmd);
|
||||
//延时5ms
|
||||
usleep(5000);
|
||||
// sendDisSysCommand(m_pm->m_targetDisBreakerState);
|
||||
// if(m_pm->m_systemData->device_common_status.dis_hv_c1.isTimeout)
|
||||
// {
|
||||
|
||||
// }
|
||||
if(m_pm->m_systemData->device_common_status.dis_hv_c1.isTimeout )
|
||||
{
|
||||
disHighVolBusCmd clr1{};
|
||||
m_udpComm->sendDisSysCmd(clr1);
|
||||
MOOSPause(200);
|
||||
}
|
||||
if(m_pm->m_systemData->device_common_status.dis_lv_c1.isTimeout )
|
||||
{
|
||||
disHighBVolBusCmd clr3{};
|
||||
m_udpComm->sendDisSysCmd(clr3);
|
||||
MOOSPause(200);
|
||||
}
|
||||
m_udpComm->clearMsgQueue();
|
||||
}
|
||||
|
||||
void LowerCommManager::operate_hold()
|
||||
{
|
||||
disHighVolBusCmd clr1{};
|
||||
disHighAVolBusCmd clr2{};
|
||||
disHighBVolBusCmd clr3{};
|
||||
disLowBusCmd clr4{};
|
||||
m_udpComm->sendDisSysCmd(clr1);
|
||||
MOOSPause(200);
|
||||
m_udpComm->sendDisSysCmd(clr2);
|
||||
MOOSPause(200);
|
||||
m_udpComm->sendDisSysCmd(clr3);
|
||||
MOOSPause(200);
|
||||
m_udpComm->sendDisSysCmd(clr4);
|
||||
}
|
||||
bool LowerCommManager::sendCcuCommand(const ccuColCmd cmd){
|
||||
// m_pm->m_db->insertCcuSysCmd(cmd);
|
||||
if(!m_udpComm->sendCcuColCmd(cmd))
|
||||
|
||||
@@ -80,6 +80,9 @@ public:
|
||||
bool operate_LVA_reservedCircuit1_Breaker(char opt);
|
||||
bool operate_LVA_reservedCircuit2_Breaker(char opt);
|
||||
bool operate_LVA_mergencyLithiumBatteryGroup1Circuit_Breaker(char opt);
|
||||
|
||||
//保持指令
|
||||
void operate_hold();
|
||||
//================================复合管控器操作函数====================================
|
||||
// 发送CCU控制命令
|
||||
bool sendCcuCommand(const ccuColCmd cmd);
|
||||
|
||||
@@ -21,6 +21,12 @@ bool _FsmCB(void * pParam)
|
||||
return pMe->FsmLoop();
|
||||
}
|
||||
|
||||
bool _CommCB(void * pParam)
|
||||
{
|
||||
PowerManger* pMe = (PowerManger* )pParam;
|
||||
return pMe->commLoop();
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Constructor()
|
||||
|
||||
@@ -78,6 +84,7 @@ PowerManger::PowerManger()
|
||||
|
||||
PowerManger::~PowerManger()
|
||||
{
|
||||
m_commThread.Stop();
|
||||
delete m_db;
|
||||
delete m_lowerCommManager;
|
||||
delete m_upperCommManager;
|
||||
@@ -154,12 +161,12 @@ bool PowerManger::Iterate()
|
||||
// 更新系统数据
|
||||
m_systemData->updateCommonStatus();
|
||||
// m_CcuColCmd.heartbeat
|
||||
if (m_ticker++ % 5 == 0)
|
||||
{
|
||||
m_CcuColCmd.heartbeat++;
|
||||
m_lowerCommManager->processPeriodicTasks();
|
||||
m_upperCommManager->processPeriodicTasks();
|
||||
}
|
||||
// if (m_ticker++ % 5 == 0)
|
||||
// {
|
||||
// m_CcuColCmd.heartbeat++;
|
||||
// m_lowerCommManager->processPeriodicTasks();
|
||||
// m_upperCommManager->processPeriodicTasks();
|
||||
// }
|
||||
return(true);
|
||||
}
|
||||
|
||||
@@ -203,6 +210,10 @@ bool PowerManger::OnStartUp()
|
||||
PowerManagerFsm::start();
|
||||
InitEvent initEvent;
|
||||
PowerManagerFsm::dispatch(initEvent);
|
||||
|
||||
//初始化通信线程
|
||||
m_commThread.Initialise(_CommCB,this);
|
||||
m_commThread.Start();
|
||||
return(true);
|
||||
}
|
||||
|
||||
@@ -224,6 +235,9 @@ void PowerManger::registerVariables()
|
||||
Register(DB_TO_PM_SETPMSYS,0);
|
||||
Register(DB_TO_PM_SETDEVSWITCH,0);
|
||||
Register(DB_TO_PM_TASKSTOP,0);
|
||||
|
||||
Register(uDetect_xcVoltage_cmd::key,0);
|
||||
Register(uDetect_zdpVoltage_cmd::key,0);
|
||||
}
|
||||
|
||||
|
||||
@@ -249,20 +263,6 @@ bool PowerManger::buildReport()
|
||||
|
||||
bool PowerManger::FsmLoop()
|
||||
{
|
||||
//状态机循环
|
||||
// while (!m_FsmThread.IsQuitRequested())
|
||||
// {
|
||||
// // // 检查故障并触发事件
|
||||
// // if(int error = checkError()) {
|
||||
// // m_fsm.triggerFaultEvent(error);
|
||||
// // } else {
|
||||
// // // 自动状态转换由状态机内部处理
|
||||
// // MOOSPause(1000);
|
||||
// // }
|
||||
|
||||
// //延时1s
|
||||
// usleep(1000000);
|
||||
// }
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -278,7 +278,6 @@ int PowerManger::checkError()
|
||||
// m_pmCurrentState.ccustate.fcuGZ_3L != 0 ||
|
||||
// m_pmCurrentState.ccustate.insEmergencyStatusWord != 0)
|
||||
return 0;
|
||||
//2.检查断路器状态
|
||||
}
|
||||
|
||||
void PowerManger::printState(const std::string& stateName, const std::string& desp){
|
||||
@@ -360,6 +359,19 @@ unsigned char PowerManger::getFaultLevel()
|
||||
return maxLevel;
|
||||
}
|
||||
|
||||
bool PowerManger::commLoop()
|
||||
{
|
||||
while(!m_commThread.IsQuitRequested())
|
||||
{
|
||||
m_CcuColCmd.heartbeat++;
|
||||
m_lowerCommManager->processPeriodicTasks();
|
||||
m_upperCommManager->processPeriodicTasks();
|
||||
// 延时1秒
|
||||
usleep(1000000);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void PowerManger::injectFault(unsigned type,unsigned int faultCode){
|
||||
LOG_F(INFO, "注入故障: %d %d", type, faultCode);
|
||||
TestEvent testEvent("故障注入测试",type,faultCode);
|
||||
|
||||
@@ -124,7 +124,7 @@ class PowerManger : public AppCastingMOOSApp
|
||||
void initControlCmd();
|
||||
|
||||
public:
|
||||
// CMOOSThread m_FsmThread;
|
||||
CMOOSThread m_commThread;
|
||||
LowerCommManager* m_lowerCommManager;
|
||||
UpperCommManager* m_upperCommManager;
|
||||
|
||||
@@ -136,6 +136,7 @@ class PowerManger : public AppCastingMOOSApp
|
||||
bool FSM_RUN_IS_OK = true;
|
||||
|
||||
//==================================================================================
|
||||
bool commLoop();
|
||||
int checkError();
|
||||
|
||||
bool sendNotification(const std::string& key, const std::string& value) {
|
||||
|
||||
@@ -153,6 +153,28 @@ bool UpperCommManager::processUpperMsg(const string& key, const string& strJson)
|
||||
LOG_F(WARNING, "task stop error:%s", strJson.c_str());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if(key == uDetect_xcVoltage_cmd::key)
|
||||
{
|
||||
uDetect_xcVoltage_cmd xcCmd;
|
||||
xcCmd.fromJsonString(strJson);
|
||||
SideSonarCmd sideSonarCmd;
|
||||
sideSonarCmd.xcHighVoltageAdd = xcCmd.xcHighVoltageAdd_int32;
|
||||
sideSonarCmd.xcLowVoltageAdd = xcCmd.xcLowVoltageAdd_int32;
|
||||
PowerManagerFsm::dispatch(sideSonarCmd);
|
||||
return true;
|
||||
}
|
||||
else if(key == uDetect_zdpVoltage_cmd::key)
|
||||
{
|
||||
uDetect_zdpVoltage_cmd zdpCmd;
|
||||
zdpCmd.fromJsonString(strJson);
|
||||
|
||||
DevCmdExt devCmdExt;
|
||||
devCmdExt.id = DeviceId::lowFreqSonar;
|
||||
devCmdExt.cmd = zdpCmd.zdpVoltageAdd_int32;
|
||||
PowerManagerFsm::dispatch(devCmdExt);
|
||||
LOG_F(INFO, "set dev switch success");
|
||||
return true;
|
||||
};
|
||||
LOG_F(WARNING, "Unknown key: %s", key.c_str());
|
||||
return false;
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
#include "upmsg/uExternComm_setPowerSystem.h"
|
||||
#include "upmsg/uPower_equState.h"
|
||||
#include "upmsg/uPower_sysState.h"
|
||||
|
||||
#include "upmsg/uDetect_zdpVoltage_cmd.h"
|
||||
#include "upmsg/uDetect_xcVoltage_cmd.h"
|
||||
#define _DEBUG
|
||||
|
||||
using namespace std;
|
||||
|
||||
@@ -5,5 +5,6 @@ void InitState::entry() {
|
||||
PowerManagerFsm::entry();
|
||||
LOG_F(INFO, "进入初始化状态");
|
||||
pm->initControlCmd();
|
||||
pm->m_lowerCommManager->operate_hold();
|
||||
transit<StandbyState>();
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
#include "PowerManagerFsm.hpp"
|
||||
|
||||
void Lifting::entry() {
|
||||
PowerManagerFsm::entry();
|
||||
pm->workCondition = WorkCondition::CHANING;
|
||||
//1. 关闭所有水声设备
|
||||
LOG_F(INFO,"前视声纳关机指令");
|
||||
pm->sendNotification("uExternComm_frontSonarControl_cmd","0");
|
||||
MOOSPause(10000);
|
||||
for(auto iter : underWterDevices)
|
||||
{
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, static_cast<DeviceId::Type>(iter), 0);
|
||||
}
|
||||
//2. 关闭动力电设备
|
||||
//2.1 断开所有艏部高压断路器
|
||||
pm->m_lowerCommManager->operate_HVA_actuatorCircuit_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HVA_bowFTDevice123Circuit_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HVA_bowRudderControlBoxCircuit_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HVA_mastSteeringGearControlBoxCircuit_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HVA_openWaterCoverStartCylinderCircuit_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HVA_xczCircuit_Breaker(0);
|
||||
MOOSPause(3);
|
||||
//2.2 断开所有艉部高压设备断路器
|
||||
pm->m_lowerCommManager->operate_HV_propulsionMotor_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_sternFt45_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_sternRudder1_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_sternRudder2_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_fbReserved_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_tyzReserved_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_reserved_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_dcDc5_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_coolingSystem_Breaker(0);
|
||||
MOOSPause(3);
|
||||
|
||||
//2.5 断开动力电断路器
|
||||
pm->m_lowerCommManager->operate_HV_bowHighVoltageBox_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_dcDc5_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_coolingSystem_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_dcDc5Module_Breaker(0);
|
||||
MOOSPause(3);
|
||||
pm->m_lowerCommManager->operate_HV_powerLithiumBattery_Breaker(0);
|
||||
//3. 关闭燃料电池
|
||||
//4. 关闭动力锂电池
|
||||
MOOSPause(3);
|
||||
{
|
||||
int count=0;
|
||||
while (!(pm->m_systemData->dyn_pos_relay_status == 0x02 && pm->m_systemData->dyn_neg_relay_status == 0x02))
|
||||
{
|
||||
LOG_F(INFO,"动力锂电池下电中...");
|
||||
MOOSPause(3);
|
||||
if(count>10)
|
||||
{
|
||||
LOG_F(INFO, "动力锂电池无下电反馈");
|
||||
break;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
}
|
||||
LOG_F(INFO, "动力锂电池已下电");
|
||||
pm->workCondition = WorkCondition::LIFT_MODE;
|
||||
LOG_F(INFO, "WorkCondition %d", pm->workCondition);
|
||||
}
|
||||
|
||||
void Lifting::react(MasterCommandEvent const &) {
|
||||
PowerManagerFsm::handelPowerCmd();
|
||||
PowerManagerFsm::handleModCmd();
|
||||
PowerManagerFsm::handleWorkCmd();
|
||||
}
|
||||
|
||||
void Lifting::react(DevCmdExt const &e)
|
||||
{
|
||||
LOG_F(INFO, "DevCmdExt 执行");
|
||||
PowerManagerFsm::react(e);
|
||||
}
|
||||
@@ -718,6 +718,30 @@ void PowerManagerFsm::handleFBSystemCmd(int id, int cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void PowerManagerFsm::react(SideSonarCmd const &e)
|
||||
{
|
||||
LOG_F(INFO, "处理探测模块舷侧声纳指令");
|
||||
if(e.xcHighVoltageAdd == 1)
|
||||
{
|
||||
pm->m_lowerCommManager->operate_HVA_xczCircuit_Breaker(1);
|
||||
pm->m_upperCommManager->processPeriodicTasks();
|
||||
}
|
||||
else if(e.xcHighVoltageAdd == 2)
|
||||
{
|
||||
pm->m_lowerCommManager->operate_HVA_xczCircuit_Breaker(0);
|
||||
pm->m_upperCommManager->processPeriodicTasks();
|
||||
}
|
||||
|
||||
if(e.xcLowVoltageAdd == 1)
|
||||
{
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::sideSonar, (unsigned char)1);
|
||||
}
|
||||
else if(e.xcLowVoltageAdd == 2)
|
||||
{
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::sideSonar, (unsigned char)0);
|
||||
}
|
||||
}
|
||||
|
||||
void PowerManagerFsm::handleSideSonarCmd(int id, int cmd)
|
||||
{
|
||||
if(id == DeviceId::sideSonar)
|
||||
@@ -2516,6 +2540,7 @@ void PowerManagerFsm::react(FaultEvent const &e)
|
||||
sensorSystemFault(e);
|
||||
}
|
||||
|
||||
|
||||
void PowerManagerFsm::handelPowerCmd(){
|
||||
switch (pm->m_msCmd.powerCMD)
|
||||
{
|
||||
@@ -2765,6 +2790,8 @@ void PowerManagerFsm::handleWorkCmd(){
|
||||
LOG_F(INFO, "收到上位机控制指令:DJ模式");
|
||||
transit<DJMode>();
|
||||
break;
|
||||
case 12:
|
||||
LOG_F(INFO, "收到上位机控制指令:起吊准备");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -44,6 +44,12 @@ struct DevCmdExt : tinyfsm::Event {
|
||||
DevCmdExt() : id(0), cmd(0) {};
|
||||
DevCmdExt(int id, int cmd) : id(id), cmd(cmd) {};
|
||||
};
|
||||
struct SideSonarCmd : tinyfsm::Event {
|
||||
int xcLowVoltageAdd;
|
||||
int xcHighVoltageAdd;
|
||||
SideSonarCmd() : xcLowVoltageAdd(0),xcHighVoltageAdd(0) {};
|
||||
SideSonarCmd(int xcLowVoltageAdd,int xcHighVoltageAdd) : xcLowVoltageAdd(xcLowVoltageAdd),xcHighVoltageAdd(xcHighVoltageAdd) {};
|
||||
};
|
||||
//==================测试事件================================
|
||||
struct TestEvent : tinyfsm::Event {
|
||||
std::string eventName;
|
||||
@@ -94,6 +100,8 @@ public:
|
||||
virtual void react(FaultEvent const &e);
|
||||
virtual void react(TaskStopEvent const &e);
|
||||
virtual void react(CycleTriggeredEvent const &e);
|
||||
virtual void react(SideSonarCmd const &e);
|
||||
|
||||
|
||||
//测试事件
|
||||
virtual void react(TestEvent const &);
|
||||
@@ -282,5 +290,10 @@ public:
|
||||
void react(MasterCommandEvent const &) override;
|
||||
};
|
||||
|
||||
class Lifting : public PowerManagerFsm {
|
||||
public:
|
||||
void entry() override;
|
||||
void react(MasterCommandEvent const &) override;
|
||||
};
|
||||
|
||||
#endif // POWER_MANAGER_FSM_HPP
|
||||
@@ -17,14 +17,14 @@ void ShoreBasedReady::entry() {
|
||||
pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start;
|
||||
//1.2 闭合动力电断路器
|
||||
pm->m_lowerCommManager->operate_HV_powerLithiumBattery_Breaker(1);
|
||||
MOOSPause(3);
|
||||
MOOSPause(100);
|
||||
pm->m_lowerCommManager->operate_HV_dcDc5Module_Breaker(1);
|
||||
MOOSPause(3);
|
||||
MOOSPause(100);
|
||||
pm->m_lowerCommManager->operate_HV_dcDc5_Breaker(1);
|
||||
pm->m_lowerCommManager->operate_HV_coolingSystem_Breaker(1);
|
||||
MOOSPause(10);
|
||||
MOOSPause(100);
|
||||
pm->m_lowerCommManager->operate_HV_bowHighVoltageBox_Breaker(1);
|
||||
MOOSPause(3);
|
||||
MOOSPause(100);
|
||||
//2. 启动动力电设备
|
||||
unsigned char cmd = 1;
|
||||
//2.0 艉舵
|
||||
@@ -44,7 +44,7 @@ void ShoreBasedReady::entry() {
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowCover5, (unsigned char)cmd);
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowCover6, (unsigned char)cmd);
|
||||
pm->m_upperCommManager->processPeriodicTasks();
|
||||
MOOSPause(3);
|
||||
MOOSPause(100);
|
||||
pm->m_lowerCommManager->operate_HVA_actuatorCircuit_Breaker(1);
|
||||
//2.2 敞水电缸
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowWaterInet1, (unsigned char)cmd);
|
||||
@@ -56,36 +56,36 @@ void ShoreBasedReady::entry() {
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowWaterInet7, (unsigned char)cmd);
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowWaterInet8, (unsigned char)cmd);
|
||||
pm->m_upperCommManager->processPeriodicTasks();
|
||||
MOOSPause(3);
|
||||
MOOSPause(100);
|
||||
pm->m_lowerCommManager->operate_HVA_openWaterCoverStartCylinderCircuit_Breaker(1);
|
||||
//2.3 艏舵
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowRudderDeploy, (unsigned char)cmd);
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowRudderServo1, (unsigned char)cmd);
|
||||
pm->m_upperCommManager->processPeriodicTasks();
|
||||
MOOSPause(3);
|
||||
MOOSPause(100);
|
||||
pm->m_lowerCommManager->operate_HVA_bowRudderControlBoxCircuit_Breaker(1);
|
||||
//2.4 桅杆舵机
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::mastLiftingServo, (unsigned char)cmd);
|
||||
pm->m_upperCommManager->processPeriodicTasks();
|
||||
MOOSPause(3);
|
||||
MOOSPause(100);
|
||||
pm->m_lowerCommManager->operate_HVA_mastSteeringGearControlBoxCircuit_Breaker(1);
|
||||
//2.5 艏部浮调机构
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust1, (unsigned char)cmd);
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust2, (unsigned char)cmd);
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust3, (unsigned char)cmd);
|
||||
pm->m_upperCommManager->processPeriodicTasks();
|
||||
MOOSPause(3);
|
||||
MOOSPause(100);
|
||||
pm->m_lowerCommManager->operate_HVA_bowFTDevice123Circuit_Breaker(1);
|
||||
//2.6 艉部浮调机构
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust4, (unsigned char)cmd);
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust5, (unsigned char)cmd);
|
||||
pm->m_upperCommManager->processPeriodicTasks();
|
||||
MOOSPause(3);
|
||||
MOOSPause(100);
|
||||
pm->m_lowerCommManager->operate_HV_sternFt45_Breaker(1);
|
||||
//2.7 推进电机
|
||||
pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::thruster, (unsigned char)cmd);
|
||||
pm->m_upperCommManager->processPeriodicTasks();
|
||||
MOOSPause(3);
|
||||
MOOSPause(100);
|
||||
pm->m_lowerCommManager->operate_HV_propulsionMotor_Breaker(1);
|
||||
pm->workCondition = WorkCondition::SHORE_BASED_READY;
|
||||
LOG_F(INFO, "进入岸基备航状态");
|
||||
|
||||
@@ -5,6 +5,7 @@ void StandbyState::entry() {
|
||||
PowerManagerFsm::entry();
|
||||
pm->workCondition = WorkCondition::STANDBY;
|
||||
pm->m_driver.getSTANDBYTable(&pm->m_subDisSysCmd);
|
||||
pm->m_lowerCommManager->operate_hold();
|
||||
LOG_F(INFO, "WorkCondition %d", pm->workCondition);
|
||||
}
|
||||
void StandbyState::react(StandbyEvent const &) {
|
||||
|
||||
@@ -891,6 +891,44 @@ const std::string DATA_HTML = R"(
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="collapsible">应急电池信息</button>
|
||||
<div class="content">
|
||||
<div class="system-data-grid">
|
||||
<div class="data-item">
|
||||
<span class="data-label">应急电池1总电压:</span>
|
||||
<span class="data-value" id="emergency-battery1-voltage">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">应急电池1总电流:</span>
|
||||
<span class="data-value" id="emergency-battery1-current">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">应急电池1最高温度:</span>
|
||||
<span class="data-value" id="emergency-battery1-max-temp">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">应急电池1故障字:</span>
|
||||
<span class="data-value" id="emergency-battery1-fault-word">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">应急电池2总电压:</span>
|
||||
<span class="data-value" id="emergency-battery2-voltage">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">应急电池2总电流:</span>
|
||||
<span class="data-value" id="emergency-battery2-current">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">应急电池2最高温度:</span>
|
||||
<span class="data-value" id="emergency-battery2-max-temp">正在加载...</span>
|
||||
</div>
|
||||
<div class="data-item">
|
||||
<span class="data-label">应急电池2故障字:</span>
|
||||
<span class="data-value" id="emergency-battery2-fault-word">正在加载...</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="collapsible">其他系统参数</button>
|
||||
<div class="content">
|
||||
<div class="system-data-grid">
|
||||
@@ -1682,6 +1720,40 @@ if (data.power_a_bus_status) {
|
||||
if (data.timestamp !== undefined) {
|
||||
document.getElementById('timestamp').textContent = new Date(data.timestamp).toLocaleString();
|
||||
}
|
||||
|
||||
// 应急电池数据
|
||||
if (data.emergency_battery1 && data.emergency_battery1.voltage !== undefined) {
|
||||
document.getElementById('emergency-battery1-voltage').textContent =
|
||||
data.emergency_battery1.voltage.toFixed(2) + ' V';
|
||||
}
|
||||
if (data.emergency_battery1 && data.emergency_battery1.current !== undefined) {
|
||||
document.getElementById('emergency-battery1-current').textContent =
|
||||
data.emergency_battery1.current.toFixed(2) + ' A';
|
||||
}
|
||||
if (data.emergency_battery1 && data.emergency_battery1.max_temp !== undefined) {
|
||||
document.getElementById('emergency-battery1-max-temp').textContent =
|
||||
data.emergency_battery1.max_temp.toFixed(1) + ' °C';
|
||||
}
|
||||
if (data.emergency_battery1 && data.emergency_battery1.fault_word !== undefined) {
|
||||
document.getElementById('emergency-battery1-fault-word').textContent =
|
||||
'0x' + data.emergency_battery1.fault_word.toString(16).toUpperCase();
|
||||
}
|
||||
if (data.emergency_battery2 && data.emergency_battery2.voltage !== undefined) {
|
||||
document.getElementById('emergency-battery2-voltage').textContent =
|
||||
data.emergency_battery2.voltage.toFixed(2) + ' V';
|
||||
}
|
||||
if (data.emergency_battery2 && data.emergency_battery2.current !== undefined) {
|
||||
document.getElementById('emergency-battery2-current').textContent =
|
||||
data.emergency_battery2.current.toFixed(2) + ' A';
|
||||
}
|
||||
if (data.emergency_battery2 && data.emergency_battery2.max_temp !== undefined) {
|
||||
document.getElementById('emergency-battery2-max-temp').textContent =
|
||||
data.emergency_battery2.max_temp.toFixed(1) + ' °C';
|
||||
}
|
||||
if (data.emergency_battery2 && data.emergency_battery2.fault_word !== undefined) {
|
||||
document.getElementById('emergency-battery2-fault-word').textContent =
|
||||
'0x' + data.emergency_battery2.fault_word.toString(16).toUpperCase();
|
||||
}
|
||||
}
|
||||
|
||||
// 充放电状态文本转换
|
||||
|
||||
@@ -579,6 +579,30 @@ void HttpServer::pushSystemData() {
|
||||
j["power_bus_status"]["reservedCurrent3"] = Json::Value(m_systemData->power_bus_status.reservedCurrent3); // 预留电流3
|
||||
j["power_bus_status"]["coolWaterPressure"] = Json::Value(m_systemData->power_bus_status.coolWaterPressure); // 冷却水压力
|
||||
|
||||
|
||||
//应急电池信息
|
||||
j["emergency_battery1"]["voltage"] = Json::Value(m_systemData->emergency_battery1_voltage); // 应急电池1总电压 [V]
|
||||
j["emergency_battery1"]["current"] = Json::Value(m_systemData->emergency_battery1_current); // 应急电池1总电流 [A]
|
||||
j["emergency_battery1"]["max_temp"] = Json::Value(m_systemData->emergency_battery1_max_temp); // 应急电池1最高温度 [°C]
|
||||
j["emergency_battery1"]["fault_word"] = Json::Value(m_systemData->emergency_battery1_fault_word); // 应急电池1故障字
|
||||
|
||||
j["emergency_battery2"]["voltage"] = Json::Value(m_systemData->emergency_battery2_voltage); // 应急电池2总电压 [V]
|
||||
j["emergency_battery2"]["current"] = Json::Value(m_systemData->emergency_battery2_current); // 应急电池2总电流 [A]
|
||||
j["emergency_battery2"]["max_temp"] = Json::Value(m_systemData->emergency_battery2_max_temp); // 应急电池2最高温度 [°C]
|
||||
j["emergency_battery2"]["fault_word"] = Json::Value(m_systemData->emergency_battery2_fault_word); // 应急电池2故障字
|
||||
|
||||
|
||||
//应急电池
|
||||
// emergency_battery1_voltage = data.emergency_battery1_voltage * 0.1;
|
||||
// emergency_battery1_current = data.emergency_battery1_current * 0.05;
|
||||
// emergency_battery1_max_temp = data.emergency_battery1_max_temp * 0.1;
|
||||
// emergency_battery1_fault_word = data.emergency_battery1_fault_word;
|
||||
// emergency_battery2_voltage = data.emergency_battery2_voltage * 0.1;
|
||||
// emergency_battery2_current = data.emergency_battery2_current * 0.05;
|
||||
// emergency_battery2_max_temp = data.emergency_battery2_max_temp * 0.1;
|
||||
// emergency_battery2_fault_word = data.emergency_battery2_fault_word;
|
||||
|
||||
|
||||
// union {
|
||||
// unsigned char lowFaultWord;
|
||||
// struct {
|
||||
|
||||
@@ -540,6 +540,11 @@ body {
|
||||
animation: alarm-pulse 2s infinite ease-in-out;
|
||||
}
|
||||
|
||||
.emergency-battery-card {
|
||||
|
||||
/* 移除特殊宽度限制,使用标准电池卡片样式 */
|
||||
}
|
||||
|
||||
@keyframes alarm-pulse {
|
||||
0% {
|
||||
border-color: #f87171; /* light red */
|
||||
@@ -774,6 +779,26 @@ body {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="battery-card emergency-battery-card">
|
||||
<h3>应急电池1状态</h3>
|
||||
<div class="battery-data">
|
||||
<div class="data-row"><span>总电压:</span><span id="emergency-battery1-voltage">-</span>V</div>
|
||||
<div class="data-row"><span>总电流:</span><span id="emergency-battery1-current">-</span>A</div>
|
||||
<div class="data-row"><span>最高温度:</span><span id="emergency-battery1-max-temp">-</span>°C</div>
|
||||
<div class="data-row"><span>故障字:</span><span id="emergency-battery1-fault-word">-</span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="battery-card emergency-battery-card">
|
||||
<h3>应急电池2状态</h3>
|
||||
<div class="battery-data">
|
||||
<div class="data-row"><span>总电压:</span><span id="emergency-battery2-voltage">-</span>V</div>
|
||||
<div class="data-row"><span>总电流:</span><span id="emergency-battery2-current">-</span>A</div>
|
||||
<div class="data-row"><span>最高温度:</span><span id="emergency-battery2-max-temp">-</span>°C</div>
|
||||
<div class="data-row"><span>故障字:</span><span id="emergency-battery2-fault-word">-</span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel-title">电池报警状态</div>
|
||||
<div class="battery-cards">
|
||||
@@ -1094,6 +1119,20 @@ body {
|
||||
updateWithDebounce('h2-concentration1', data.h2_concentration1, 0);
|
||||
updateWithDebounce('h2-concentration2', data.h2_concentration2, 0);
|
||||
|
||||
// 更新应急电池数据
|
||||
if (data.emergency_battery1) {
|
||||
updateWithDebounce('emergency-battery1-voltage', data.emergency_battery1.voltage, 2);
|
||||
updateWithDebounce('emergency-battery1-current', data.emergency_battery1.current, 2);
|
||||
updateWithDebounce('emergency-battery1-max-temp', data.emergency_battery1.max_temp, 1);
|
||||
updateStatusWithDebounce('emergency-battery1-fault-word', data.emergency_battery1.fault_word, getFaultWordText);
|
||||
}
|
||||
if (data.emergency_battery2) {
|
||||
updateWithDebounce('emergency-battery2-voltage', data.emergency_battery2.voltage, 2);
|
||||
updateWithDebounce('emergency-battery2-current', data.emergency_battery2.current, 2);
|
||||
updateWithDebounce('emergency-battery2-max-temp', data.emergency_battery2.max_temp, 1);
|
||||
updateStatusWithDebounce('emergency-battery2-fault-word', data.emergency_battery2.fault_word, getFaultWordText);
|
||||
}
|
||||
|
||||
// 更新电池报警状态
|
||||
updateWithDebounce('dyn-alarm-flag1', data.dyn_alarm_flag1, 0);
|
||||
updateWithDebounce('dyn-alarm-flag2', data.dyn_alarm_flag2, 0);
|
||||
@@ -1516,6 +1555,11 @@ body {
|
||||
return commands[cmd] || '未知指令';
|
||||
}
|
||||
|
||||
function getFaultWordText(faultWord) {
|
||||
if (faultWord === undefined || faultWord === null) return '-';
|
||||
return '0x' + faultWord.toString(16).toUpperCase().padStart(4, '0');
|
||||
}
|
||||
|
||||
function updateCcuControlData(data) {
|
||||
if (data.ccuColCmd) {
|
||||
const ccuData = data.ccuColCmd;
|
||||
@@ -1812,4 +1856,4 @@ body {
|
||||
</html>
|
||||
)";
|
||||
|
||||
#endif // HTTP_SERVER_INDEX_H
|
||||
#endif // HTTP_SERVER_INDEX_H
|
||||
@@ -4,4 +4,6 @@ ProcessConfig = pPowerManger
|
||||
{
|
||||
AppTick = 4
|
||||
CommsTick = 4
|
||||
log_level = INFO
|
||||
log_file = /path/to/your/logfile.log
|
||||
}
|
||||
@@ -51,7 +51,16 @@ typedef struct ccuState
|
||||
uint16_t ch3oh_concentration1; // 舱室甲醇气体浓度1,单位:0.01% LEL
|
||||
uint16_t ch3oh_concentration2; // 舱室甲醇气体浓度2,单位:0.01% LEL
|
||||
|
||||
uint16_t reserved1[10]; // 保留字段,地址范围35~52,共18个uint16_t,协议预留
|
||||
uint16_t reserved1[2]; // 保留字段前2个元素
|
||||
uint16_t emergency_battery1_voltage; // 应急电池1总电压 [V]
|
||||
uint16_t emergency_battery1_current; // 应急电池1总电流 [A]
|
||||
uint16_t emergency_battery1_max_temp; // 应急电池1最高温度 [°C]
|
||||
uint16_t emergency_battery1_fault_word; // 应急电池1故障字
|
||||
uint16_t emergency_battery2_voltage; // 应急电池2总电压 [V]
|
||||
uint16_t emergency_battery2_current; // 应急电池2总电流 [A]
|
||||
uint16_t emergency_battery2_max_temp; // 应急电池2最高温度 [°C]
|
||||
uint16_t emergency_battery2_fault_word; // 应急电池2故障字
|
||||
|
||||
uint16_t cabin_ox_concentration; // 仪表舱内氧气浓度 [%]
|
||||
uint16_t cabin_temperature; // 仪表舱内温度 [°C]
|
||||
uint16_t cabin_humidity; // 仪表舱内湿度 [%RH]
|
||||
@@ -632,7 +641,7 @@ namespace WorkCondition {
|
||||
UNDERWATER_RECON = 9, // 水下侦查
|
||||
SURFACE_RECON = 10, // 水面侦查
|
||||
DJ_MODE = 11, // DJ模式
|
||||
DEBUG_MODE = 12 // 调试模式
|
||||
LIFT_MODE = 12 // 调试模式
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -3,13 +3,17 @@
|
||||
#include <iostream>
|
||||
#include "../logc/loguru.hpp"
|
||||
|
||||
SQLite::SQLite(const std::string& dbPath)
|
||||
{
|
||||
if (sqlite3_open(dbPath.c_str(), &m_db) != SQLITE_OK) {
|
||||
LOG_F(WARNING, "Can't open database: %s", sqlite3_errmsg(m_db));
|
||||
SQLite::SQLite(const std::string& dbPath) {
|
||||
try {
|
||||
if (sqlite3_open(dbPath.c_str(), &m_db) != SQLITE_OK) {
|
||||
LOG_F(ERROR, "无法打开数据库: %s", sqlite3_errmsg(m_db));
|
||||
m_db = nullptr;
|
||||
}
|
||||
m_dbPath = dbPath;
|
||||
} catch (...) {
|
||||
LOG_F(ERROR, "SQLite构造函数发生异常");
|
||||
m_db = nullptr;
|
||||
}
|
||||
m_dbPath = dbPath;
|
||||
}
|
||||
|
||||
SQLite::~SQLite()
|
||||
@@ -71,9 +75,15 @@ bool SQLite::createTable()
|
||||
o2_concentration2 INTEGER,
|
||||
ch3oh_concentration1 INTEGER,
|
||||
ch3oh_concentration2 INTEGER,
|
||||
reserved1_1 INTEGER, reserved1_2 INTEGER, reserved1_3 INTEGER, reserved1_4 INTEGER,
|
||||
reserved1_5 INTEGER, reserved1_6 INTEGER, reserved1_7 INTEGER, reserved1_8 INTEGER,
|
||||
reserved1_9 INTEGER, reserved1_10 INTEGER,
|
||||
reserved1_1 INTEGER, reserved1_2 INTEGER,
|
||||
emergency_battery1_voltage INTEGER,
|
||||
emergency_battery1_current INTEGER,
|
||||
emergency_battery1_max_temp INTEGER,
|
||||
emergency_battery1_fault_word INTEGER,
|
||||
emergency_battery2_voltage INTEGER,
|
||||
emergency_battery2_current INTEGER,
|
||||
emergency_battery2_max_temp INTEGER,
|
||||
emergency_battery2_fault_word INTEGER,
|
||||
cabin_ox_concentration INTEGER,
|
||||
cabin_temperature INTEGER,
|
||||
cabin_humidity INTEGER,
|
||||
@@ -269,7 +279,7 @@ bool SQLite::createTable()
|
||||
workCondition INTEGER,
|
||||
fcuCmd INTEGER,
|
||||
fcuPowerEfficiency INTEGER,
|
||||
fcuInsEfficiency INTEGER,
|
||||
insChargeEnable INTEGER,
|
||||
insBatCmd INTEGER,
|
||||
powerBatCmd INTEGER,
|
||||
powerBatEfficiency INTEGER,
|
||||
@@ -375,8 +385,9 @@ bool SQLite::insertData(const ccuState data) {
|
||||
h2_concentration1, h2_concentration2, h2_concentration3,
|
||||
o2_concentration1, o2_concentration2,
|
||||
ch3oh_concentration1, ch3oh_concentration2,
|
||||
reserved1_1, reserved1_2, reserved1_3, reserved1_4, reserved1_5,
|
||||
reserved1_6, reserved1_7, reserved1_8, reserved1_9, reserved1_10,
|
||||
reserved1_1, reserved1_2,
|
||||
emergency_battery1_voltage, emergency_battery1_current, emergency_battery1_max_temp, emergency_battery1_fault_word,
|
||||
emergency_battery2_voltage, emergency_battery2_current, emergency_battery2_max_temp, emergency_battery2_fault_word,
|
||||
cabin_ox_concentration, cabin_temperature, cabin_humidity, cabin_pressure,
|
||||
power_cabin_ox_concentration, power_cabin_temperature,
|
||||
power_cabin_humidity, power_cabin_pressure,
|
||||
@@ -417,7 +428,9 @@ bool SQLite::insertData(const ccuState data) {
|
||||
?, ?,
|
||||
?, ?,
|
||||
?, ?, ?, ?, ?,
|
||||
?, ?, ?, ?, ?,
|
||||
?, ?,
|
||||
?, ?, ?, ?,
|
||||
?, ?, ?, ?,
|
||||
?, ?, ?, ?,
|
||||
?, ?, ?, ?,
|
||||
?,
|
||||
@@ -430,8 +443,6 @@ bool SQLite::insertData(const ccuState data) {
|
||||
?, ?,
|
||||
?, ?,
|
||||
?, ?,
|
||||
?, ?,
|
||||
?, ?,
|
||||
?, ?, ?,
|
||||
?, ?,
|
||||
?, ?, ?,
|
||||
@@ -443,7 +454,7 @@ bool SQLite::insertData(const ccuState data) {
|
||||
?, ?, ?,
|
||||
?, ?,
|
||||
?, ?,
|
||||
?, ?
|
||||
?
|
||||
);
|
||||
)";
|
||||
|
||||
@@ -497,7 +508,16 @@ bool SQLite::insertData(const ccuState data) {
|
||||
BIND_16(data.ch3oh_concentration1);
|
||||
BIND_16(data.ch3oh_concentration2);
|
||||
|
||||
for (int i = 0; i < 10; ++i) BIND_16(data.reserved1[i]);
|
||||
for (int i = 0; i < 2; ++i) BIND_16(data.reserved1[i]);
|
||||
|
||||
BIND_16(data.emergency_battery1_voltage);
|
||||
BIND_16(data.emergency_battery1_current);
|
||||
BIND_16(data.emergency_battery1_max_temp);
|
||||
BIND_16(data.emergency_battery1_fault_word);
|
||||
BIND_16(data.emergency_battery2_voltage);
|
||||
BIND_16(data.emergency_battery2_current);
|
||||
BIND_16(data.emergency_battery2_max_temp);
|
||||
BIND_16(data.emergency_battery2_fault_word);
|
||||
|
||||
BIND_16(data.cabin_ox_concentration);
|
||||
BIND_16(data.cabin_temperature);
|
||||
@@ -626,8 +646,6 @@ bool SQLite::insertData(const ccuColCmd cmd) {
|
||||
if (!success) {
|
||||
std::cerr << "执行插入失败: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
}
|
||||
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return success;
|
||||
}
|
||||
|
||||
@@ -33,5 +33,4 @@ public:
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -205,6 +205,16 @@ public:
|
||||
unsigned char insfaultCode;
|
||||
|
||||
|
||||
//应急电池
|
||||
double emergency_battery1_voltage; // 应急电池1总电压 [V]
|
||||
double emergency_battery1_current; // 应急电池1总电流 [A]
|
||||
double emergency_battery1_max_temp; // 应急电池1最高温度 [°C]
|
||||
uint16_t emergency_battery1_fault_word; // 应急电池1故障字
|
||||
double emergency_battery2_voltage; // 应急电池2总电压 [V]
|
||||
double emergency_battery2_current; // 应急电池2总电流 [A]
|
||||
double emergency_battery2_max_temp; // 应急电池2最高温度 [°C]
|
||||
uint16_t emergency_battery2_fault_word; // 应急电池2故障字
|
||||
|
||||
// MOOSD 状态
|
||||
bool moosd_status;
|
||||
//配电系统状态
|
||||
@@ -522,15 +532,15 @@ public:
|
||||
};
|
||||
~SystemData(){};
|
||||
|
||||
void updateCommonStatus(double time_out=3){
|
||||
void updateCommonStatus(double time_out=10){
|
||||
//更新时间
|
||||
double currentTime = MOOSTime();
|
||||
//判断是否超时
|
||||
device_common_status.ccu_status.isTimeout = (currentTime - device_common_status.ccu_status.lastUpdateTime) > time_out;
|
||||
device_common_status.dis_hv_c1.isTimeout = (currentTime - device_common_status.dis_hv_c1.lastUpdateTime) > time_out;
|
||||
device_common_status.dis_hv_c2.isTimeout = (currentTime - device_common_status.dis_hv_c2.lastUpdateTime) > time_out;
|
||||
device_common_status.dis_lv_c1.isTimeout = (currentTime - device_common_status.dis_lv_c1.lastUpdateTime) > time_out;
|
||||
device_common_status.dis_lv_c2.isTimeout = (currentTime - device_common_status.dis_lv_c2.lastUpdateTime) > time_out;
|
||||
device_common_status.ccu_status.isTimeout = abs(currentTime - device_common_status.ccu_status.lastUpdateTime) > time_out;
|
||||
device_common_status.dis_hv_c1.isTimeout = abs(currentTime - device_common_status.dis_hv_c1.lastUpdateTime) > time_out;
|
||||
device_common_status.dis_hv_c2.isTimeout = abs(currentTime - device_common_status.dis_hv_c2.lastUpdateTime) > time_out;
|
||||
device_common_status.dis_lv_c1.isTimeout = abs(currentTime - device_common_status.dis_lv_c1.lastUpdateTime) > time_out;
|
||||
device_common_status.dis_lv_c2.isTimeout = abs(currentTime - device_common_status.dis_lv_c2.lastUpdateTime) > time_out;
|
||||
};
|
||||
|
||||
void updateSystemData(ccuState data){
|
||||
@@ -695,6 +705,17 @@ public:
|
||||
water_leak_status_from_dynbat = (data.dyn_water_leak_status >> 4) & 0x0F; // 00 正常,01 异常漏水
|
||||
dcdc_status_from_insbat = (data.ins_water_leak_dcdc_status) & 0x0F; // 00 正常,01 故障
|
||||
|
||||
|
||||
//应急电池
|
||||
emergency_battery1_voltage = data.emergency_battery1_voltage * 0.1;
|
||||
emergency_battery1_current = data.emergency_battery1_current * 0.05;
|
||||
emergency_battery1_max_temp = data.emergency_battery1_max_temp * 0.1;
|
||||
emergency_battery1_fault_word = data.emergency_battery1_fault_word;
|
||||
emergency_battery2_voltage = data.emergency_battery2_voltage * 0.1;
|
||||
emergency_battery2_current = data.emergency_battery2_current * 0.05;
|
||||
emergency_battery2_max_temp = data.emergency_battery2_max_temp * 0.1;
|
||||
emergency_battery2_fault_word = data.emergency_battery2_fault_word;
|
||||
|
||||
//心跳计数器
|
||||
heartbeat = data.heartbeat;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
/* json 格式 XC阵控制软件→复合能源管控系统
|
||||
{
|
||||
"xcLowVoltageAdd_int32 " : XX //命令类型:“无命令”0,“申请仪表上电”1,“申请仪表断电”2;类型:int
|
||||
"xcHighVoltageAdd_int32 " : XX, //命令类型:“无命令”0,“申请高压上电”1,“申请高压断电”2;类型:int
|
||||
}
|
||||
*/
|
||||
#ifndef UDETECT_XCVOLTAGE_CMD_H
|
||||
#define UDETECT_XCVOLTAGE_CMD_H
|
||||
#include "../logc/loguru.hpp"
|
||||
#include "json/json.h"
|
||||
#include <string>
|
||||
#include <memory>
|
||||
|
||||
class uDetect_xcVoltage_cmd
|
||||
{
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
uDetect_xcVoltage_cmd(){};
|
||||
~uDetect_xcVoltage_cmd(){};
|
||||
|
||||
int xcLowVoltageAdd_int32;
|
||||
int xcHighVoltageAdd_int32;
|
||||
|
||||
static std::string key;
|
||||
|
||||
std::string toJsonString()
|
||||
{
|
||||
Json::Value j;
|
||||
j["xcLowVoltageAdd_int32"] = xcLowVoltageAdd_int32;
|
||||
j["xcHighVoltageAdd_int32"] = xcHighVoltageAdd_int32;
|
||||
|
||||
Json::StreamWriterBuilder builder;
|
||||
builder.settings_["indentation"] = "";
|
||||
return Json::writeString(builder, j);
|
||||
}
|
||||
bool fromJsonString(std::string jsonString)
|
||||
{
|
||||
Json::CharReaderBuilder readerBuilder;
|
||||
std::unique_ptr<Json::CharReader> reader(readerBuilder.newCharReader());
|
||||
Json::Value j;
|
||||
std::string errors;
|
||||
|
||||
bool parsingSuccessful = reader->parse(jsonString.c_str(), jsonString.c_str() + jsonString.length(), &j, &errors);
|
||||
if (!parsingSuccessful) {
|
||||
LOG_F(ERROR, "Failed to parse JSON: %s", errors.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
if (j.isMember("xcLowVoltageAdd_int32") && j.isMember("xcHighVoltageAdd_int32")) {
|
||||
xcLowVoltageAdd_int32 = j["xcLowVoltageAdd_int32"].asInt();
|
||||
xcHighVoltageAdd_int32 = j["xcHighVoltageAdd_int32"].asInt();
|
||||
LOG_F(INFO, "xcLowVoltageAdd_int32: %d", xcLowVoltageAdd_int32);
|
||||
LOG_F(INFO, "xcHighVoltageAdd_int32: %d", xcHighVoltageAdd_int32);
|
||||
LOG_F(INFO, "jsonString: %s", jsonString.c_str());
|
||||
return true;
|
||||
}
|
||||
LOG_F(ERROR, "JSON does not contain required fields");
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,58 @@
|
||||
/* json 格式 XC阵控制软件→复合能源管控系统
|
||||
{
|
||||
"zdpVoltageAdd_int32 " : XX //命令类型:“无命令”0,“申请仪表上电”1,“申请仪表断电”2;类型:int
|
||||
}
|
||||
*/
|
||||
#ifndef UDETECT_ZDPVOLTAGE_CMD_H
|
||||
#define UDETECT_ZDPVOLTAGE_CMD_H
|
||||
#include "../logc/loguru.hpp"
|
||||
#include "json/json.h"
|
||||
#include <string>
|
||||
#include <memory>
|
||||
|
||||
class uDetect_zdpVoltage_cmd
|
||||
{
|
||||
private:
|
||||
/* data */
|
||||
public:
|
||||
uDetect_zdpVoltage_cmd(){};
|
||||
~uDetect_zdpVoltage_cmd(){};
|
||||
|
||||
int zdpVoltageAdd_int32;
|
||||
|
||||
static std::string key;
|
||||
|
||||
std::string toJsonString()
|
||||
{
|
||||
Json::Value j;
|
||||
j["zdpVoltageAdd_int32"] = zdpVoltageAdd_int32;
|
||||
|
||||
Json::StreamWriterBuilder builder;
|
||||
builder.settings_["indentation"] = "";
|
||||
return Json::writeString(builder, j);
|
||||
}
|
||||
bool fromJsonString(std::string jsonString)
|
||||
{
|
||||
Json::CharReaderBuilder readerBuilder;
|
||||
std::unique_ptr<Json::CharReader> reader(readerBuilder.newCharReader());
|
||||
Json::Value j;
|
||||
std::string errors;
|
||||
|
||||
bool parsingSuccessful = reader->parse(jsonString.c_str(), jsonString.c_str() + jsonString.length(), &j, &errors);
|
||||
if (!parsingSuccessful) {
|
||||
LOG_F(ERROR, "Failed to parse JSON: %s", errors.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
if (j.isMember("zdpVoltageAdd_int32")) {
|
||||
zdpVoltageAdd_int32 = j["zdpVoltageAdd_int32"].asInt();
|
||||
LOG_F(INFO, "zdpVoltageAdd_int32: %d", zdpVoltageAdd_int32);
|
||||
LOG_F(INFO, "jsonString: %s", jsonString.c_str());
|
||||
return true;
|
||||
}
|
||||
LOG_F(ERROR, "JSON does not contain required fields");
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,6 @@
|
||||
#include "uDetect_zdpVoltage_cmd.h"
|
||||
#include "uDetect_xcVoltage_cmd.h"
|
||||
|
||||
// 定义静态成员变量
|
||||
std::string uDetect_zdpVoltage_cmd::key = "uDetect_zdpVoltage_cmd";
|
||||
std::string uDetect_xcVoltage_cmd::key = "uDetect_xcVoltage_cmd";
|
||||
Reference in New Issue
Block a user