修复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:
+13
-21
@@ -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})
|
||||
|
||||
#======================================================================
|
||||
|
||||
@@ -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}
|
||||
@@ -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]; // 保留字节,协议预留
|
||||
|
||||
|
||||
@@ -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<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())
|
||||
@@ -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<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())
|
||||
@@ -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<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;
|
||||
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<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())
|
||||
@@ -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<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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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] || '未知状态';
|
||||
}
|
||||
|
||||
@@ -353,6 +353,8 @@ void HttpServer::pushSystemData() {
|
||||
return;
|
||||
}
|
||||
|
||||
std::lock_guard<std::mutex> dataLock(m_systemData->m_dataMutex);
|
||||
|
||||
// 序列化系统数据为JSON
|
||||
json j;
|
||||
|
||||
@@ -790,6 +792,9 @@ void HttpServer::pushSystemData() {
|
||||
// 发送给所有WebSocket客户端
|
||||
std::lock_guard<std::mutex> 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<std::mutex> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,6 +84,7 @@ private:
|
||||
std::streampos m_lastLogPosition = 0;
|
||||
std::deque<std::string> m_logCache; // 缓存最近的日志
|
||||
static const size_t MAX_CACHE_SIZE = 1000; // 最大缓存条数
|
||||
static const size_t MAX_WS_BACKLOG = 256 * 1024; // WebSocket发送积压阈值,超过则跳过推送
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -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="hydrogen-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浓度2:</span><span id="h2-concentration2">-</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>% LEL</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include<string>
|
||||
#include <map>
|
||||
#include <unordered_set>
|
||||
#include <cstdint>
|
||||
|
||||
#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]; // 保留字节,协议预留
|
||||
|
||||
|
||||
@@ -616,6 +616,7 @@ public:
|
||||
~SystemData(){};
|
||||
|
||||
void updateCommonStatus(double time_out=30){
|
||||
std::lock_guard<std::mutex> lock(m_dataMutex);
|
||||
//更新时间
|
||||
double currentTime = MOOSTime(false);
|
||||
//判断是否超时
|
||||
@@ -627,6 +628,7 @@ public:
|
||||
};
|
||||
|
||||
void updateSystemData(ccuState data){
|
||||
std::lock_guard<std::mutex> 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<unsigned int> 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<std::mutex> lock(faultCodeMutex);
|
||||
@@ -830,6 +833,7 @@ public:
|
||||
breakerStatus = newStatus; // 保证状态更新也是原子的
|
||||
}
|
||||
void updateSystemData(disHighVolBusState data){
|
||||
std::lock_guard<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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);
|
||||
|
||||
Reference in New Issue
Block a user