diff --git a/CMakeLists.txt b/CMakeLists.txt index 068914a..e053d57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,11 +6,18 @@ # Chris Gagner, and tips borrowed from Dave Billin #======================================================================= -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) +CMAKE_MINIMUM_REQUIRED(VERSION 3.5) PROJECT( IVP_EXTEND ) set (CMAKE_CXX_STANDARD 11) -set (MOOSIVP_SOURCE_TREE_BASE "/home/zjk/project/lib/moos-ivp") + +#======================================================================= +# IvP 库安装前缀(MOOS 与 IvP 均安装于系统 /usr/local) +#======================================================================= +set (IVP_PREFIX "/usr/local") + +# jsoncpp 头文件目录(Ubuntu 布局:/usr/include/jsoncpp/json/) +INCLUDE_DIRECTORIES(/usr/include/jsoncpp) #======================================================================= # Set the output directories for the binary and library files @@ -36,28 +43,13 @@ INCLUDE_DIRECTORIES(${MOOS_INCLUDE_DIRS}) # Find the "moos-ivp" base directory #======================================================================= -# Search for the moos-ivp folder -find_path( MOOSIVP_SOURCE_TREE_BASE - NAMES build-ivp.sh build-moos.sh configure-ivp.sh - PATHS "../moos-ivp" "../../moos-ivp" "../../moos-ivp/trunk/" "../moos-ivp/trunk/" - DOC "Base directory of the MOOS-IvP source tree" - NO_DEFAULT_PATH -) +# IvP 头文件与库从系统安装前缀加载 +INCLUDE_DIRECTORIES(${IVP_PREFIX}/include/ivp) -if (NOT MOOSIVP_SOURCE_TREE_BASE) - message("Please set MOOSIVP_SOURCE_TREE_BASE to ") - message("the location of the \"moos-ivp\" folder ") - return() -endif() - -#====================================================================== -# Specify where to find IvP's headers and libraries... -#====================================================================== - -FILE(GLOB IVP_INCLUDE_DIRS ${MOOSIVP_SOURCE_TREE_BASE}/ivp/src/lib_* ) +FILE(GLOB IVP_INCLUDE_DIRS ${IVP_PREFIX}/include/ivp ) INCLUDE_DIRECTORIES(${IVP_INCLUDE_DIRS}) -FILE(GLOB IVP_LIBRARY_DIRS ${MOOSIVP_SOURCE_TREE_BASE}/lib ) +FILE(GLOB IVP_LIBRARY_DIRS ${IVP_PREFIX}/lib ) LINK_DIRECTORIES(${IVP_LIBRARY_DIRS}) #====================================================================== diff --git a/build_debug.sh b/build_debug.sh deleted file mode 100755 index 3f27600..0000000 --- a/build_debug.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash - -INVOCATION_ABS_DIR=`pwd` -# 默认设为Debug模式,避免无符号编译(核心修改1) -BUILD_TYPE="Debug" -CMD_LINE_ARGS="" - -#------------------------------------------------------------------- -# Part 1: Check for and handle command-line arguments -#------------------------------------------------------------------- -for ARGI; do - if [ "${ARGI}" = "--help" -o "${ARGI}" = "-h" ] ; then - printf "%s [SWITCHES] \n" $0 - printf "Switches: \n" - printf " --help, -h \n" - printf " --debug, -d \n" - printf " --release, -r \n" - printf "Notes: \n" - printf " (1) All other command line args will be passed as args \n" - printf " to \"make\" when it is eventually invoked. \n" - printf " (2) For example -k will continue making when/if a failure \n" - printf " is encountered in building one of the subdirectories. \n" - printf " (3) For example -j2 will utilize a 2nd core in the build \n" - printf " if your machine has two cores. -j4 etc for quad core. \n" - exit 0; - elif [ "${ARGI}" = "--debug" -o "${ARGI}" = "-d" ] ; then - BUILD_TYPE="Debug" - elif [ "${ARGI}" = "--release" -o "${ARGI}" = "-r" ] ; then - BUILD_TYPE="Release" - else - CMD_LINE_ARGS=$CMD_LINE_ARGS" "$ARGI - fi -done - -#------------------------------------------------------------------- -# Part 2: Invoke the call to make in the build directory -#------------------------------------------------------------------- - -mkdir -p build -cd build - -# 核心修改2:添加RK3588 ARM64编译选项+强制调试符号 -# -DCMAKE_CXX_FLAGS:全局C++编译选项,适配RK3588的cortex-a76架构 -# -DCMAKE_BUILD_TYPE:指定编译模式 -# -DCMAKE_CXX_FLAGS_DEBUG:Debug模式强制-O0 + 完整调试符号 -# -DCMAKE_CXX_FLAGS_RELEASE:Release模式保留-g(调试符号),仅优化级别-O2 -cmake \ - -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ - -DCMAKE_CXX_FLAGS="-march=armv8-a -mtune=cortex-a76 -mstrict-align -fPIC" \ - -DCMAKE_CXX_FLAGS_DEBUG="-O0 -g -ggdb" \ - -DCMAKE_CXX_FLAGS_RELEASE="-O2 -g -ggdb" \ - ../ - -# 核心修改3:添加-j参数加速编译(适配RK3588多核),默认用4核(可根据板卡调整) -# 若你传了-j参数,会覆盖默认的-j4 -# if [[ ! $CMD_LINE_ARGS =~ "-j" ]]; then -# CMD_LINE_ARGS="-j4 ${CMD_LINE_ARGS}" -# fi - -make ${CMD_LINE_ARGS} -cd ${INVOCATION_ABS_DIR} \ No newline at end of file diff --git a/src/pPMtest/pmSysvariable.h b/src/pPMtest/pmSysvariable.h index c1bfb35..414234a 100644 --- a/src/pPMtest/pmSysvariable.h +++ b/src/pPMtest/pmSysvariable.h @@ -98,8 +98,8 @@ typedef struct ccuState uint16_t dyn_resistance_pos; // 动力电池正极绝缘电阻,单位:kΩ uint16_t dyn_resistance_neg; // 动力电池负极绝缘电阻,单位:kΩ - uint8_t ins_emergency_status; // 仪表电池紧急状态字,按位表示异常或告警状态 - uint8_t dyn_emergency_status; // 动力电池紧急状态字,按位表示异常或告警状态 + uint8_t ins_emergency_status; // 仪表电池紧急状态:0x00无报警 0x3A=4级报警 0x3B=3级报警 0x3C=2级报警 0x3D=1级报警 + uint8_t dyn_emergency_status; // 动力电池紧急状态:0x00无报警 0x3A=4级报警 0x3B=3级报警 0x3C=2级报警 0x3D=1级报警 uint8_t reserved3[2]; // 保留字节,协议预留 diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp index 6b96a8c..f7d5c01 100644 --- a/src/pPowerManger/LowerCommManager.cpp +++ b/src/pPowerManger/LowerCommManager.cpp @@ -195,7 +195,10 @@ bool LowerCommManager::updatePoweSystemStates(){ m_pm->m_db->insertData(m_pm->m_pmCurrentState.ccustate); //写入数据库 msg_CcuStateFbMsg_Update_time = time; m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.ccustate); - m_pm->m_systemData->device_common_status.ccu_status.lastUpdateTime = m_pm->m_lowerCommManager->msg_CcuStateFbMsg_Update_time; + { + std::lock_guard lock(m_pm->m_systemData->m_dataMutex); + m_pm->m_systemData->device_common_status.ccu_status.lastUpdateTime = m_pm->m_lowerCommManager->msg_CcuStateFbMsg_Update_time; + } } } if(!m_udpComm->m_qReceiveDisHighVolBusBuffer.empty()) @@ -226,7 +229,10 @@ bool LowerCommManager::updatePoweSystemStates(){ delete pdis1; m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus1State); - m_pm->m_systemData->device_common_status.dis_hv_c1.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighVolBusFbMsg_Update_time; + { + std::lock_guard lock(m_pm->m_systemData->m_dataMutex); + m_pm->m_systemData->device_common_status.dis_hv_c1.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighVolBusFbMsg_Update_time; + } } } if(!m_udpComm->m_qReceiveDisHighAVolBusBuffer.empty()) @@ -250,7 +256,10 @@ bool LowerCommManager::updatePoweSystemStates(){ delete pdis2; m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus2State); - m_pm->m_systemData->device_common_status.dis_hv_c2.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighAVolBusFbMsg_Update_time; + { + std::lock_guard lock(m_pm->m_systemData->m_dataMutex); + m_pm->m_systemData->device_common_status.dis_hv_c2.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighAVolBusFbMsg_Update_time; + } } } @@ -275,7 +284,10 @@ bool LowerCommManager::updatePoweSystemStates(){ m_pm->m_currentDisBreakerState.bus3Breaker = *pdis3; delete pdis3; m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus3State); - m_pm->m_systemData->device_common_status.dis_lv_c1.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighBVolBusFbMsg_Update_time; + { + std::lock_guard lock(m_pm->m_systemData->m_dataMutex); + m_pm->m_systemData->device_common_status.dis_lv_c1.lastUpdateTime = m_pm->m_lowerCommManager->msg_disHighBVolBusFbMsg_Update_time; + } } } if(!m_udpComm->m_qReceiveDisLowBusBuffer.empty()) @@ -300,7 +312,10 @@ bool LowerCommManager::updatePoweSystemStates(){ m_pm->m_currentDisBreakerState.bus4Breaker = *pdis4; delete pdis4; m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus4State); - m_pm->m_systemData->device_common_status.dis_lv_c2.lastUpdateTime = m_pm->m_lowerCommManager->msg_disLowBusFbMsg_Update_time; + { + std::lock_guard lock(m_pm->m_systemData->m_dataMutex); + m_pm->m_systemData->device_common_status.dis_lv_c2.lastUpdateTime = m_pm->m_lowerCommManager->msg_disLowBusFbMsg_Update_time; + } } } return true; diff --git a/src/pPowerManger/fsm/PowerManagerFsm.cpp b/src/pPowerManger/fsm/PowerManagerFsm.cpp index 072fbcd..ec37632 100644 --- a/src/pPowerManger/fsm/PowerManagerFsm.cpp +++ b/src/pPowerManger/fsm/PowerManagerFsm.cpp @@ -1777,7 +1777,7 @@ void PowerManagerFsm::basicNavigationFault() } } //=====处理动力电池故障====================== - if(pm->m_systemData->dyn_emergency_status >= 1 ) + if(pm->m_systemData->dyn_emergency_status != 0 ) { pm->m_systemData->insertFaultCode(0x130B); } @@ -1807,7 +1807,7 @@ void PowerManagerFsm::basicNavigationFault() pm->m_systemData->eraseFaultCode(0x1305); } //=====处理仪表锂电池失效================= - if(pm->m_systemData->ins_emergency_status > 1) + if(pm->m_systemData->ins_emergency_status != 0) { pm->m_systemData->insertFaultCode(0x1412); } diff --git a/src/pPowerManger/httpserver/data.h b/src/pPowerManger/httpserver/data.h index b47275d..9d4dae3 100644 --- a/src/pPowerManger/httpserver/data.h +++ b/src/pPowerManger/httpserver/data.h @@ -1798,11 +1798,11 @@ function getDCDCStatusText(status) { // 紧急状态文本转换 function getEmergencyStatusText(status) { const statuses = { - 0: '正常', - 58: '四级紧急', - 59: '三级紧急', - 60: '二级紧急', - 61: '一级紧急', + 0: '无报警', + 58: '4级报警', + 59: '3级报警', + 60: '2级报警', + 61: '1级报警', }; return statuses[status] || '未知状态'; } diff --git a/src/pPowerManger/httpserver/httpserver.cpp b/src/pPowerManger/httpserver/httpserver.cpp index e570b9f..7562f62 100644 --- a/src/pPowerManger/httpserver/httpserver.cpp +++ b/src/pPowerManger/httpserver/httpserver.cpp @@ -352,7 +352,9 @@ void HttpServer::pushSystemData() { LOG_F(ERROR, "System data pointer is null"); return; } - + + std::lock_guard dataLock(m_systemData->m_dataMutex); + // 序列化系统数据为JSON json j; @@ -790,6 +792,9 @@ void HttpServer::pushSystemData() { // 发送给所有WebSocket客户端 std::lock_guard lock(ws_connections_mutex_); for (auto c : ws_connections_) { + if (c->send.len > MAX_WS_BACKLOG) { + continue; + } mg_ws_send(c, msg.c_str(), msg.size(), WEBSOCKET_OP_TEXT); } } @@ -1057,6 +1062,9 @@ void HttpServer::monitorLogFile() { std::lock_guard lock(ws_connections_mutex_); for (auto c : ws_connections_) { + if (c->send.len > MAX_WS_BACKLOG) { + continue; + } mg_ws_send(c, msg.c_str(), msg.size(), WEBSOCKET_OP_TEXT); } } diff --git a/src/pPowerManger/httpserver/httpserver.h b/src/pPowerManger/httpserver/httpserver.h index 9a81512..7323c7c 100644 --- a/src/pPowerManger/httpserver/httpserver.h +++ b/src/pPowerManger/httpserver/httpserver.h @@ -84,6 +84,7 @@ private: std::streampos m_lastLogPosition = 0; std::deque m_logCache; // 缓存最近的日志 static const size_t MAX_CACHE_SIZE = 1000; // 最大缓存条数 + static const size_t MAX_WS_BACKLOG = 256 * 1024; // WebSocket发送积压阈值,超过则跳过推送 }; diff --git a/src/pPowerManger/httpserver/index.h b/src/pPowerManger/httpserver/index.h index 6e12a0f..35e96e8 100644 --- a/src/pPowerManger/httpserver/index.h +++ b/src/pPowerManger/httpserver/index.h @@ -762,8 +762,8 @@ body {
输出功率限制:-W
氢容量:-%
液氧容量:-%
-
H2浓度1:-ppm
-
H2浓度2:-ppm
+
H2浓度1:-% LEL
+
H2浓度2:-% LEL
@@ -994,11 +994,9 @@ body { ws.onmessage = (event) => { try { const data = JSON.parse(event.data); - console.log('收到数据:', data); // 调试日志 // 更新MOOSDB信息 if (data.moosdb) { - console.log('更新MOOSDB数据:', data.moosdb); updateWithDebounce('header-appFreq', data.moosdb.appFreq, 2); updateWithDebounce('card-appFreq', data.moosdb.appFreq, 2); updateWithDebounce('header-commFreq', data.moosdb.commFreq, 2); @@ -1061,7 +1059,6 @@ body { // 更新动力电池数据 if (batteryData.dyn) { - console.log('更新动力电池数据:', batteryData.dyn); updateRelayStatus('dyn_pos_relay_status', batteryData.dyn.pos_relay_status); updateRelayStatus('dyn_neg_relay_status', batteryData.dyn.neg_relay_status); @@ -1077,13 +1074,10 @@ body { updateStatusWithDebounce('dyn_charge_status', batteryData.dyn.charge_status, getChargeStatusText); updateEmergencyStatus('dyn_emergency_status', batteryData.dyn.emergency_status, getEmergencyStatusText); updateRelayStatus('dyn_charge_relay_status', data.dyn_charge_relay_status); - updateWithDebounce('dyn_alarm_flag1', data.dyn_alarm_flag1, 0); - updateWithDebounce('dyn_alarm_flag2', data.dyn_alarm_flag2, 0); } // 更新仪表电池数据 if (batteryData.ins) { - console.log('更新仪表电池数据:', batteryData.ins); updateRelayStatus('ins_pos_relay_status', batteryData.ins.pos_relay_status); updateRelayStatus('ins_neg_relay_status', batteryData.ins.neg_relay_status); @@ -1099,8 +1093,6 @@ body { updateStatusWithDebounce('ins_charge_status', batteryData.ins.charge_status, getChargeStatusText); updateEmergencyStatus('ins_emergency_status', batteryData.ins.emergency_status, getEmergencyStatusText); updateRelayStatus('ins_charge_relay_status', data.ins_charge_relay_status); - updateWithDebounce('ins_alarm_flag1', data.ins_alarm_flag1, 0); - updateWithDebounce('ins_alarm_flag2', data.ins_alarm_flag2, 0); } // 更新燃料电池和环境数据 @@ -1360,8 +1352,6 @@ body { return; } - console.log(`更新 ${elementId}: ${currentValue} -> ${formattedValue}`); - // 清除之前的定时器 if (updateTimers[elementId]) { clearTimeout(updateTimers[elementId]); @@ -1442,11 +1432,11 @@ body { function getEmergencyStatusText(status) { const statuses = { - 0: '正常', - 58: '四级紧急', - 59: '三级紧急', - 60: '二级紧急', - 61: '一级紧急', + 0: '无报警', + 58: '4级报警', + 59: '3级报警', + 60: '2级报警', + 61: '1级报警', }; return statuses[status] || '未知'; } @@ -1473,19 +1463,19 @@ body { } function getDCDCStatusText(status) { - return status === 1 ? '正常' : '异常'; + return status === 0 ? '正常' : '异常'; } function getCoolingStatusText(status) { - return status === 1 ? '正常' : '异常'; + return status === 0 ? '正常' : '异常'; } function getInsulationStatusText(status) { - return status === 1 ? '正常' : '异常'; + return status === 0 ? '正常' : '绝缘低'; } function getPowerStatusText(status) { - return status === 1 ? '正常' : '异常'; + return status === 0 ? '正常' : '故障'; } function getWaterAlarmText(status) { @@ -1498,7 +1488,7 @@ body { } function getFCStatusText(status) { - const statuses = { 0: '无效', 1: '初始化', 2: '待机', 3: '启动中', 4: '运行', 5: '关机中', 6: '故障' }; + const statuses = { 0: '无效', 1: '初始化', 2: '待机', 3: '启动中', 4: '运行', 5: '关机中', 6: '故障', 7: '维护', 8: '校准', 9: '测试', 10: '紧急停止', 11: '重启', 12: '升级', 13: '维护完成' }; return statuses[status] || '未知'; } @@ -1588,7 +1578,6 @@ body { } const text = getStatusText(value); - console.log(`更新设备状态 ${elementId}: ${value} -> ${text}`); if (element.textContent === text) { return; @@ -1628,7 +1617,7 @@ body { if (status === undefined || status === null) return; const isOn = status === 1; - const newText = isOn ? '闭合' : '断开'; + const newText = isOn ? '闭合' : (status === 2 ? '断开' : '无效'); // 获取上次的状态 const lastState = lastRelayStates[elementId]; @@ -1826,7 +1815,7 @@ body { (data.dyn_alarm_flag1 > 0) || (data.dyn_alarm_flag2 > 0) || (data.dyn_alarm_flag3 > 0) || (data.dyn_alarm_flag4 > 0) || (data.dyn_alarm_flag5 > 0) || (data.dyn_alarm_flag6 > 0) || - (data.water_leak_status_from_dynbat > 1); + (data.water_leak_status_from_dynbat > 0); } if (hasInsAlarmData) { diff --git a/src/pPowerManger/pmSysvariable.h b/src/pPowerManger/pmSysvariable.h index 612f852..8b33129 100644 --- a/src/pPowerManger/pmSysvariable.h +++ b/src/pPowerManger/pmSysvariable.h @@ -5,6 +5,7 @@ #include #include #include +#include #define BREAK_OFF 0xAA #define BREAK_ON 0x55 @@ -107,8 +108,8 @@ typedef struct ccuState uint16_t dyn_resistance_pos; // 动力电池正极绝缘电阻,单位:kΩ uint16_t dyn_resistance_neg; // 动力电池负极绝缘电阻,单位:kΩ - uint8_t ins_emergency_status; // 仪表电池紧急状态字,按位表示异常或告警状态 - uint8_t dyn_emergency_status; // 动力电池紧急状态字,按位表示异常或告警状态 + uint8_t ins_emergency_status; // 仪表电池紧急状态:0x00无报警 0x3A=4级报警 0x3B=3级报警 0x3C=2级报警 0x3D=1级报警 + uint8_t dyn_emergency_status; // 动力电池紧急状态:0x00无报警 0x3A=4级报警 0x3B=3级报警 0x3C=2级报警 0x3D=1级报警 uint8_t reserved3[2]; // 保留字节,协议预留 diff --git a/src/pPowerManger/systemData.h b/src/pPowerManger/systemData.h index ebfc663..60802bb 100644 --- a/src/pPowerManger/systemData.h +++ b/src/pPowerManger/systemData.h @@ -616,6 +616,7 @@ public: ~SystemData(){}; void updateCommonStatus(double time_out=30){ + std::lock_guard lock(m_dataMutex); //更新时间 double currentTime = MOOSTime(false); //判断是否超时 @@ -627,6 +628,7 @@ public: }; void updateSystemData(ccuState data){ + std::lock_guard lock(m_dataMutex); fc_mode = data.fc_mode; fc_status = data.fc_status; fc_fault_level = data.fc_fault_level; @@ -811,6 +813,7 @@ public: } std::set disSysFaultCode; mutable std::mutex faultCodeMutex; + mutable std::mutex m_dataMutex; // 保护普通数据字段,供更新线程与HTTP服务线程互斥访问 void updateBreakerFault(unsigned char& breakerStatus, unsigned char rawStatus, unsigned int faultCode) { std::lock_guard lock(faultCodeMutex); @@ -830,6 +833,7 @@ public: breakerStatus = newStatus; // 保证状态更新也是原子的 } void updateSystemData(disHighVolBusState data){ + std::lock_guard lock(m_dataMutex); updateBreakerFault(power_bus_status.fuelCellCircuitBreaker, data.fuelCellCircuitBreaker, 1); updateBreakerFault(power_bus_status.powerLithiumBatteryCircuitBreaker, data.powerLithiumBatteryCircuitBreaker, 2); updateBreakerFault(power_bus_status.propulsionMotorCircuitBreaker, data.propulsionMotorCircuitBreaker, 3); @@ -899,6 +903,7 @@ public: power_bus_status.coolWaterPressure = data.coolWaterPressure * 0.1; }; void updateSystemData(disHighAVolBusState data){ + std::lock_guard lock(m_dataMutex); //断路器状态 (0x55 1 0xAA 0 0x5A 2) updateBreakerFault(power_a_bus_status.bowFTDevice123CircuitBreaker, data.bowFTDevice123CircuitBreaker, 13); updateBreakerFault(power_a_bus_status.actuatorCircuitBreaker, data.actuatorCircuitBreaker, 14); @@ -943,6 +948,7 @@ public: power_a_bus_status.openWaterCoverStartCylinderCurrent = data.openWaterCoverStartCylinderCurrent * 0.1; }; void updateSystemData(disLowMainBusState data){ + std::lock_guard lock(m_dataMutex); //断路器状态 (0x55 1 0xAA 0 0x5A 2) updateBreakerFault(instrument_main_bus_status.lithiumBatteryGroupInstrumentCircuitBreaker, data.lithiumBatteryGroupInstrumentCircuitBreaker, 19); updateBreakerFault(instrument_main_bus_status.bowLowVoltageDistributionBoxCircuitBreaker,data.bowLowVoltageDistributionBoxCircuitBreaker, 20); @@ -984,6 +990,7 @@ public: instrument_main_bus_status.plcControlPowerCurrent = data.plcControlPowerCurrent * 0.1; } void updateSystemData(disLowBusState data){ + std::lock_guard lock(m_dataMutex); //断路器状态 (0x55 1 0xAA 0 0x5A 2) updateBreakerFault(instrument_bus_status.unit1CircuitBreaker, data.unit1CircuitBreaker, 26); updateBreakerFault(instrument_bus_status.unit2CircuitBreaker, data.unit2CircuitBreaker, 27);