修复Web服务内存泄露、数据竞争与页面显示bug,适配x86编译

- 修复WebSocket推送无背压导致mongoose发送缓冲无限增长的内存泄露
- 为SystemData增加互斥锁,消除pushSystemData与主线程的数据竞争
- 修复网页状态文本判断反转、漏水告警阈值、FC状态、H2单位等显示bug
- 按协议修正电池紧急状态枚举解码(0x3A-0x3D为1-4级报警)
- 调整CMake适配系统安装的MOOS/IvP及jsoncpp,删除ARM专用build_debug.sh
This commit is contained in:
zjk
2026-08-12 23:17:36 +08:00
parent 7b0d0ff34b
commit ea06a415a1
11 changed files with 76 additions and 124 deletions
+13 -21
View File
@@ -6,11 +6,18 @@
# Chris Gagner, and tips borrowed from Dave Billin # Chris Gagner, and tips borrowed from Dave Billin
#======================================================================= #=======================================================================
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
PROJECT( IVP_EXTEND ) PROJECT( IVP_EXTEND )
set (CMAKE_CXX_STANDARD 11) 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 # 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 # Find the "moos-ivp" base directory
#======================================================================= #=======================================================================
# Search for the moos-ivp folder # IvP 头文件与库从系统安装前缀加载
find_path( MOOSIVP_SOURCE_TREE_BASE INCLUDE_DIRECTORIES(${IVP_PREFIX}/include/ivp)
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
)
if (NOT MOOSIVP_SOURCE_TREE_BASE) FILE(GLOB IVP_INCLUDE_DIRS ${IVP_PREFIX}/include/ivp )
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_* )
INCLUDE_DIRECTORIES(${IVP_INCLUDE_DIRS}) 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}) LINK_DIRECTORIES(${IVP_LIBRARY_DIRS})
#====================================================================== #======================================================================
-61
View File
@@ -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}
+2 -2
View File
@@ -98,8 +98,8 @@ typedef struct ccuState
uint16_t dyn_resistance_pos; // 动力电池正极绝缘电阻,单位:kΩ uint16_t dyn_resistance_pos; // 动力电池正极绝缘电阻,单位:kΩ
uint16_t dyn_resistance_neg; // 动力电池负极绝缘电阻,单位:kΩ uint16_t dyn_resistance_neg; // 动力电池负极绝缘电阻,单位:kΩ
uint8_t ins_emergency_status; // 仪表电池紧急状态字,按位表示异常或告警状态 uint8_t ins_emergency_status; // 仪表电池紧急状态:0x00无报警 0x3A=4级报警 0x3B=3级报警 0x3C=2级报警 0x3D=1级报警
uint8_t dyn_emergency_status; // 动力电池紧急状态字,按位表示异常或告警状态 uint8_t dyn_emergency_status; // 动力电池紧急状态:0x00无报警 0x3A=4级报警 0x3B=3级报警 0x3C=2级报警 0x3D=1级报警
uint8_t reserved3[2]; // 保留字节,协议预留 uint8_t reserved3[2]; // 保留字节,协议预留
+20 -5
View File
@@ -195,7 +195,10 @@ bool LowerCommManager::updatePoweSystemStates(){
m_pm->m_db->insertData(m_pm->m_pmCurrentState.ccustate); //写入数据库 m_pm->m_db->insertData(m_pm->m_pmCurrentState.ccustate); //写入数据库
msg_CcuStateFbMsg_Update_time = time; msg_CcuStateFbMsg_Update_time = time;
m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.ccustate); 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<std::mutex> 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()) if(!m_udpComm->m_qReceiveDisHighVolBusBuffer.empty())
@@ -226,7 +229,10 @@ bool LowerCommManager::updatePoweSystemStates(){
delete pdis1; delete pdis1;
m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus1State); 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<std::mutex> 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()) if(!m_udpComm->m_qReceiveDisHighAVolBusBuffer.empty())
@@ -250,7 +256,10 @@ bool LowerCommManager::updatePoweSystemStates(){
delete pdis2; delete pdis2;
m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus2State); 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<std::mutex> 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; m_pm->m_currentDisBreakerState.bus3Breaker = *pdis3;
delete pdis3; delete pdis3;
m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus3State); 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<std::mutex> 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()) if(!m_udpComm->m_qReceiveDisLowBusBuffer.empty())
@@ -300,7 +312,10 @@ bool LowerCommManager::updatePoweSystemStates(){
m_pm->m_currentDisBreakerState.bus4Breaker = *pdis4; m_pm->m_currentDisBreakerState.bus4Breaker = *pdis4;
delete pdis4; delete pdis4;
m_pm->m_systemData->updateSystemData(m_pm->m_pmCurrentState.bus4State); 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<std::mutex> 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; return true;
+2 -2
View File
@@ -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); pm->m_systemData->insertFaultCode(0x130B);
} }
@@ -1807,7 +1807,7 @@ void PowerManagerFsm::basicNavigationFault()
pm->m_systemData->eraseFaultCode(0x1305); 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); pm->m_systemData->insertFaultCode(0x1412);
} }
+5 -5
View File
@@ -1798,11 +1798,11 @@ function getDCDCStatusText(status) {
// 紧急状态文本转换 // 紧急状态文本转换
function getEmergencyStatusText(status) { function getEmergencyStatusText(status) {
const statuses = { const statuses = {
0: '正常', 0: '无报警',
58: '四级紧急', 58: '4级报警',
59: '三级紧急', 59: '3级报警',
60: '二级紧急', 60: '2级报警',
61: '一级紧急', 61: '1级报警',
}; };
return statuses[status] || '未知状态'; return statuses[status] || '未知状态';
} }
@@ -353,6 +353,8 @@ void HttpServer::pushSystemData() {
return; return;
} }
std::lock_guard<std::mutex> dataLock(m_systemData->m_dataMutex);
// 序列化系统数据为JSON // 序列化系统数据为JSON
json j; json j;
@@ -790,6 +792,9 @@ void HttpServer::pushSystemData() {
// 发送给所有WebSocket客户端 // 发送给所有WebSocket客户端
std::lock_guard<std::mutex> lock(ws_connections_mutex_); std::lock_guard<std::mutex> lock(ws_connections_mutex_);
for (auto c : ws_connections_) { 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); mg_ws_send(c, msg.c_str(), msg.size(), WEBSOCKET_OP_TEXT);
} }
} }
@@ -1057,6 +1062,9 @@ void HttpServer::monitorLogFile() {
std::lock_guard<std::mutex> lock(ws_connections_mutex_); std::lock_guard<std::mutex> lock(ws_connections_mutex_);
for (auto c : ws_connections_) { 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); mg_ws_send(c, msg.c_str(), msg.size(), WEBSOCKET_OP_TEXT);
} }
} }
+1
View File
@@ -84,6 +84,7 @@ private:
std::streampos m_lastLogPosition = 0; std::streampos m_lastLogPosition = 0;
std::deque<std::string> m_logCache; // 缓存最近的日志 std::deque<std::string> m_logCache; // 缓存最近的日志
static const size_t MAX_CACHE_SIZE = 1000; // 最大缓存条数 static const size_t MAX_CACHE_SIZE = 1000; // 最大缓存条数
static const size_t MAX_WS_BACKLOG = 256 * 1024; // WebSocket发送积压阈值,超过则跳过推送
}; };
+14 -25
View File
@@ -762,8 +762,8 @@ body {
<div class="data-row"><span>输出功率限制:</span><span id="output-power-limit">-</span>W</div> <div class="data-row"><span>输出功率限制:</span><span id="output-power-limit">-</span>W</div>
<div class="data-row"><span>氢容量:</span><span id="hydrogen-capacity">-</span>%</div> <div class="data-row"><span>氢容量:</span><span id="hydrogen-capacity">-</span>%</div>
<div class="data-row"><span>液氧容量:</span><span id="liquid-oxygen-capacity">-</span>%</div> <div class="data-row"><span>液氧容量:</span><span id="liquid-oxygen-capacity">-</span>%</div>
<div class="data-row"><span>H2浓度1:</span><span id="h2-concentration1">-</span>ppm</div> <div class="data-row"><span>H2浓度1:</span><span id="h2-concentration1">-</span>% LEL</div>
<div class="data-row"><span>H2浓度2:</span><span id="h2-concentration2">-</span>ppm</div> <div class="data-row"><span>H2浓度2:</span><span id="h2-concentration2">-</span>% LEL</div>
</div> </div>
</div> </div>
@@ -994,11 +994,9 @@ body {
ws.onmessage = (event) => { ws.onmessage = (event) => {
try { try {
const data = JSON.parse(event.data); const data = JSON.parse(event.data);
console.log('收到数据:', data); // 调试日志
// 更新MOOSDB信息 // 更新MOOSDB信息
if (data.moosdb) { if (data.moosdb) {
console.log('更新MOOSDB数据:', data.moosdb);
updateWithDebounce('header-appFreq', data.moosdb.appFreq, 2); updateWithDebounce('header-appFreq', data.moosdb.appFreq, 2);
updateWithDebounce('card-appFreq', data.moosdb.appFreq, 2); updateWithDebounce('card-appFreq', data.moosdb.appFreq, 2);
updateWithDebounce('header-commFreq', data.moosdb.commFreq, 2); updateWithDebounce('header-commFreq', data.moosdb.commFreq, 2);
@@ -1061,7 +1059,6 @@ body {
// 更新动力电池数据 // 更新动力电池数据
if (batteryData.dyn) { if (batteryData.dyn) {
console.log('更新动力电池数据:', batteryData.dyn);
updateRelayStatus('dyn_pos_relay_status', batteryData.dyn.pos_relay_status); updateRelayStatus('dyn_pos_relay_status', batteryData.dyn.pos_relay_status);
updateRelayStatus('dyn_neg_relay_status', batteryData.dyn.neg_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); updateStatusWithDebounce('dyn_charge_status', batteryData.dyn.charge_status, getChargeStatusText);
updateEmergencyStatus('dyn_emergency_status', batteryData.dyn.emergency_status, getEmergencyStatusText); updateEmergencyStatus('dyn_emergency_status', batteryData.dyn.emergency_status, getEmergencyStatusText);
updateRelayStatus('dyn_charge_relay_status', data.dyn_charge_relay_status); 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) { if (batteryData.ins) {
console.log('更新仪表电池数据:', batteryData.ins);
updateRelayStatus('ins_pos_relay_status', batteryData.ins.pos_relay_status); updateRelayStatus('ins_pos_relay_status', batteryData.ins.pos_relay_status);
updateRelayStatus('ins_neg_relay_status', batteryData.ins.neg_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); updateStatusWithDebounce('ins_charge_status', batteryData.ins.charge_status, getChargeStatusText);
updateEmergencyStatus('ins_emergency_status', batteryData.ins.emergency_status, getEmergencyStatusText); updateEmergencyStatus('ins_emergency_status', batteryData.ins.emergency_status, getEmergencyStatusText);
updateRelayStatus('ins_charge_relay_status', data.ins_charge_relay_status); 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; return;
} }
console.log(`更新 ${elementId}: ${currentValue} -> ${formattedValue}`);
// 清除之前的定时器 // 清除之前的定时器
if (updateTimers[elementId]) { if (updateTimers[elementId]) {
clearTimeout(updateTimers[elementId]); clearTimeout(updateTimers[elementId]);
@@ -1442,11 +1432,11 @@ body {
function getEmergencyStatusText(status) { function getEmergencyStatusText(status) {
const statuses = { const statuses = {
0: '正常', 0: '无报警',
58: '四级紧急', 58: '4级报警',
59: '三级紧急', 59: '3级报警',
60: '二级紧急', 60: '2级报警',
61: '一级紧急', 61: '1级报警',
}; };
return statuses[status] || '未知'; return statuses[status] || '未知';
} }
@@ -1473,19 +1463,19 @@ body {
} }
function getDCDCStatusText(status) { function getDCDCStatusText(status) {
return status === 1 ? '正常' : '异常'; return status === 0 ? '正常' : '异常';
} }
function getCoolingStatusText(status) { function getCoolingStatusText(status) {
return status === 1 ? '正常' : '异常'; return status === 0 ? '正常' : '异常';
} }
function getInsulationStatusText(status) { function getInsulationStatusText(status) {
return status === 1 ? '正常' : '异常'; return status === 0 ? '正常' : '绝缘低';
} }
function getPowerStatusText(status) { function getPowerStatusText(status) {
return status === 1 ? '正常' : '异常'; return status === 0 ? '正常' : '故障';
} }
function getWaterAlarmText(status) { function getWaterAlarmText(status) {
@@ -1498,7 +1488,7 @@ body {
} }
function getFCStatusText(status) { 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] || '未知'; return statuses[status] || '未知';
} }
@@ -1588,7 +1578,6 @@ body {
} }
const text = getStatusText(value); const text = getStatusText(value);
console.log(`更新设备状态 ${elementId}: ${value} -> ${text}`);
if (element.textContent === text) { if (element.textContent === text) {
return; return;
@@ -1628,7 +1617,7 @@ body {
if (status === undefined || status === null) return; if (status === undefined || status === null) return;
const isOn = status === 1; const isOn = status === 1;
const newText = isOn ? '闭合' : '断开'; const newText = isOn ? '闭合' : (status === 2 ? '断开' : '无效');
// 获取上次的状态 // 获取上次的状态
const lastState = lastRelayStates[elementId]; const lastState = lastRelayStates[elementId];
@@ -1826,7 +1815,7 @@ body {
(data.dyn_alarm_flag1 > 0) || (data.dyn_alarm_flag2 > 0) || (data.dyn_alarm_flag1 > 0) || (data.dyn_alarm_flag2 > 0) ||
(data.dyn_alarm_flag3 > 0) || (data.dyn_alarm_flag4 > 0) || (data.dyn_alarm_flag3 > 0) || (data.dyn_alarm_flag4 > 0) ||
(data.dyn_alarm_flag5 > 0) || (data.dyn_alarm_flag6 > 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) { if (hasInsAlarmData) {
+3 -2
View File
@@ -5,6 +5,7 @@
#include<string> #include<string>
#include <map> #include <map>
#include <unordered_set> #include <unordered_set>
#include <cstdint>
#define BREAK_OFF 0xAA #define BREAK_OFF 0xAA
#define BREAK_ON 0x55 #define BREAK_ON 0x55
@@ -107,8 +108,8 @@ typedef struct ccuState
uint16_t dyn_resistance_pos; // 动力电池正极绝缘电阻,单位:kΩ uint16_t dyn_resistance_pos; // 动力电池正极绝缘电阻,单位:kΩ
uint16_t dyn_resistance_neg; // 动力电池负极绝缘电阻,单位:kΩ uint16_t dyn_resistance_neg; // 动力电池负极绝缘电阻,单位:kΩ
uint8_t ins_emergency_status; // 仪表电池紧急状态字,按位表示异常或告警状态 uint8_t ins_emergency_status; // 仪表电池紧急状态:0x00无报警 0x3A=4级报警 0x3B=3级报警 0x3C=2级报警 0x3D=1级报警
uint8_t dyn_emergency_status; // 动力电池紧急状态字,按位表示异常或告警状态 uint8_t dyn_emergency_status; // 动力电池紧急状态:0x00无报警 0x3A=4级报警 0x3B=3级报警 0x3C=2级报警 0x3D=1级报警
uint8_t reserved3[2]; // 保留字节,协议预留 uint8_t reserved3[2]; // 保留字节,协议预留
+7
View File
@@ -616,6 +616,7 @@ public:
~SystemData(){}; ~SystemData(){};
void updateCommonStatus(double time_out=30){ void updateCommonStatus(double time_out=30){
std::lock_guard<std::mutex> lock(m_dataMutex);
//更新时间 //更新时间
double currentTime = MOOSTime(false); double currentTime = MOOSTime(false);
//判断是否超时 //判断是否超时
@@ -627,6 +628,7 @@ public:
}; };
void updateSystemData(ccuState data){ void updateSystemData(ccuState data){
std::lock_guard<std::mutex> lock(m_dataMutex);
fc_mode = data.fc_mode; fc_mode = data.fc_mode;
fc_status = data.fc_status; fc_status = data.fc_status;
fc_fault_level = data.fc_fault_level; fc_fault_level = data.fc_fault_level;
@@ -811,6 +813,7 @@ public:
} }
std::set<unsigned int> disSysFaultCode; std::set<unsigned int> disSysFaultCode;
mutable std::mutex faultCodeMutex; mutable std::mutex faultCodeMutex;
mutable std::mutex m_dataMutex; // 保护普通数据字段,供更新线程与HTTP服务线程互斥访问
void updateBreakerFault(unsigned char& breakerStatus, unsigned char rawStatus, unsigned int faultCode) void updateBreakerFault(unsigned char& breakerStatus, unsigned char rawStatus, unsigned int faultCode)
{ {
std::lock_guard<std::mutex> lock(faultCodeMutex); std::lock_guard<std::mutex> lock(faultCodeMutex);
@@ -830,6 +833,7 @@ public:
breakerStatus = newStatus; // 保证状态更新也是原子的 breakerStatus = newStatus; // 保证状态更新也是原子的
} }
void updateSystemData(disHighVolBusState data){ void updateSystemData(disHighVolBusState data){
std::lock_guard<std::mutex> lock(m_dataMutex);
updateBreakerFault(power_bus_status.fuelCellCircuitBreaker, data.fuelCellCircuitBreaker, 1); updateBreakerFault(power_bus_status.fuelCellCircuitBreaker, data.fuelCellCircuitBreaker, 1);
updateBreakerFault(power_bus_status.powerLithiumBatteryCircuitBreaker, data.powerLithiumBatteryCircuitBreaker, 2); updateBreakerFault(power_bus_status.powerLithiumBatteryCircuitBreaker, data.powerLithiumBatteryCircuitBreaker, 2);
updateBreakerFault(power_bus_status.propulsionMotorCircuitBreaker, data.propulsionMotorCircuitBreaker, 3); updateBreakerFault(power_bus_status.propulsionMotorCircuitBreaker, data.propulsionMotorCircuitBreaker, 3);
@@ -899,6 +903,7 @@ public:
power_bus_status.coolWaterPressure = data.coolWaterPressure * 0.1; power_bus_status.coolWaterPressure = data.coolWaterPressure * 0.1;
}; };
void updateSystemData(disHighAVolBusState data){ void updateSystemData(disHighAVolBusState data){
std::lock_guard<std::mutex> lock(m_dataMutex);
//断路器状态 (0x55 1 0xAA 0 0x5A 2) //断路器状态 (0x55 1 0xAA 0 0x5A 2)
updateBreakerFault(power_a_bus_status.bowFTDevice123CircuitBreaker, data.bowFTDevice123CircuitBreaker, 13); updateBreakerFault(power_a_bus_status.bowFTDevice123CircuitBreaker, data.bowFTDevice123CircuitBreaker, 13);
updateBreakerFault(power_a_bus_status.actuatorCircuitBreaker, data.actuatorCircuitBreaker, 14); updateBreakerFault(power_a_bus_status.actuatorCircuitBreaker, data.actuatorCircuitBreaker, 14);
@@ -943,6 +948,7 @@ public:
power_a_bus_status.openWaterCoverStartCylinderCurrent = data.openWaterCoverStartCylinderCurrent * 0.1; power_a_bus_status.openWaterCoverStartCylinderCurrent = data.openWaterCoverStartCylinderCurrent * 0.1;
}; };
void updateSystemData(disLowMainBusState data){ void updateSystemData(disLowMainBusState data){
std::lock_guard<std::mutex> lock(m_dataMutex);
//断路器状态 (0x55 1 0xAA 0 0x5A 2) //断路器状态 (0x55 1 0xAA 0 0x5A 2)
updateBreakerFault(instrument_main_bus_status.lithiumBatteryGroupInstrumentCircuitBreaker, data.lithiumBatteryGroupInstrumentCircuitBreaker, 19); updateBreakerFault(instrument_main_bus_status.lithiumBatteryGroupInstrumentCircuitBreaker, data.lithiumBatteryGroupInstrumentCircuitBreaker, 19);
updateBreakerFault(instrument_main_bus_status.bowLowVoltageDistributionBoxCircuitBreaker,data.bowLowVoltageDistributionBoxCircuitBreaker, 20); updateBreakerFault(instrument_main_bus_status.bowLowVoltageDistributionBoxCircuitBreaker,data.bowLowVoltageDistributionBoxCircuitBreaker, 20);
@@ -984,6 +990,7 @@ public:
instrument_main_bus_status.plcControlPowerCurrent = data.plcControlPowerCurrent * 0.1; instrument_main_bus_status.plcControlPowerCurrent = data.plcControlPowerCurrent * 0.1;
} }
void updateSystemData(disLowBusState data){ void updateSystemData(disLowBusState data){
std::lock_guard<std::mutex> lock(m_dataMutex);
//断路器状态 (0x55 1 0xAA 0 0x5A 2) //断路器状态 (0x55 1 0xAA 0 0x5A 2)
updateBreakerFault(instrument_bus_status.unit1CircuitBreaker, data.unit1CircuitBreaker, 26); updateBreakerFault(instrument_bus_status.unit1CircuitBreaker, data.unit1CircuitBreaker, 26);
updateBreakerFault(instrument_bus_status.unit2CircuitBreaker, data.unit2CircuitBreaker, 27); updateBreakerFault(instrument_bus_status.unit2CircuitBreaker, data.unit2CircuitBreaker, 27);