diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp index 58e7c65..47ba4b2 100644 --- a/src/pPowerManger/LowerCommManager.cpp +++ b/src/pPowerManger/LowerCommManager.cpp @@ -79,7 +79,7 @@ void LowerCommManager::processPeriodicTasks() { sendCcuCommand(m_pm->m_CcuColCmd); //延时5ms usleep(5000); - sendDisSysCommand(m_pm->m_targetDisBreakerState); + // sendDisSysCommand(m_pm->m_targetDisBreakerState); m_udpComm->clearMsgQueue(); } diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index e504811..ae074d3 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -135,15 +135,24 @@ bool PowerManger::Iterate() CycleTriggeredEvent cycleEvent; PowerManagerFsm::dispatch(cycleEvent); faultLevel = getFaultLevel(); + + // 更新系统数据 m_systemData->updateSystemData(m_pmCurrentState.ccustate); m_systemData->updateSystemData(m_pmCurrentState.bus1State); m_systemData->updateSystemData(m_pmCurrentState.bus2State); m_systemData->updateSystemData(m_pmCurrentState.bus3State); m_systemData->updateSystemData(m_pmCurrentState.bus4State); + m_systemData->device_common_status.ccu_status.lastUpdateTime = m_lowerCommManager->msg_CcuStateFbMsg_Update_time; + m_systemData->device_common_status.dis_hv_c1.lastUpdateTime = m_lowerCommManager->msg_disHighVolBusFbMsg_Update_time; + m_systemData->device_common_status.dis_hv_c2.lastUpdateTime = m_lowerCommManager->msg_disHighAVolBusFbMsg_Update_time; + m_systemData->device_common_status.dis_lv_c1.lastUpdateTime = m_lowerCommManager->msg_disHighBVolBusFbMsg_Update_time; + m_systemData->device_common_status.dis_lv_c2.lastUpdateTime = m_lowerCommManager->msg_disLowBusFbMsg_Update_time; + m_systemData->updateCommonStatus(); + if (m_ticker++ % 5 == 0) { m_CcuColCmd.heartbeat++; - // m_lowerCommManager->processPeriodicTasks(); + m_lowerCommManager->processPeriodicTasks(); m_upperCommManager->processPeriodicTasks(); } return(true); diff --git a/src/pPowerManger/httpserver/dashboard.h b/src/pPowerManger/httpserver/dashboard.h new file mode 100644 index 0000000..01ded9c --- /dev/null +++ b/src/pPowerManger/httpserver/dashboard.h @@ -0,0 +1,406 @@ + +#ifndef HTTP_SERVER_DASHBOARD_H +#define HTTP_SERVER_DASHBOARD_H + +#include + +const std::string DASHBOARD_HTML = R"row( + + + + 断路器控制面板 + + + +
+
+
高压母线设备
+ +
+
燃料电池断路器
+
+ + +
+
+
+
+
动力锂电池断路器
+
+ + +
+
+
+
推进电机断路器
+
+ + +
+
+
+
锂电池组仪表断路器
+
+ + +
+
+
+
DC/DC5模块断路器
+
+ + +
+
+
+
艏部高压配电箱断路器
+
+ + +
+
+
+
艉部FT装置4/5断路器
+
+ + +
+
+
+
艉舵开关1断路器
+
+ + +
+
+
+
艉舵开关2断路器
+
+ + +
+
+
+
FB预留断路器
+
+ + +
+
+
+
TYZ预留断路器
+
+ + +
+
+
+
预留断路器
+
+ + +
+
+
+
DC/DC5模块启动
+
+ + +
+
+
+
冷却系统启动
+
+ + +
+
+
+ +
+
艏高压设备
+ +
+
艏部FT装置1-3断路器
+
+ + +
+
+
+
+
启闭机构断路器
+
+ + +
+
+
+
桅杆舵机控制箱断路器
+
+ + +
+
+
+
XCZ断路器
+
+ + +
+
+
+
艏舵控制箱断路器
+
+ + +
+
+
+
敞水盖启动电缸断路器
+
+ + +
+
+
+ +
+
仪表母线设备
+ +
+
锂电池组(仪表)断路器
+
+ + +
+
+
+
+
艏部低压配电箱断路器
+
+ + +
+
+
+
UNIT4仪表DC48V断路器
+
+ + +
+
+
+
DC-C1直流配电板断路器
+
+ + +
+
+
+
预留断路器1
+
+ + +
+
+
+
预留断路器2
+
+ + +
+
+
+
应急锂电池组2断路器
+
+ + +
+
+
+ +
+
艏低压设备
+ +
+
UNIT1断路器
+
+ + +
+
+
+
+
UNIT2断路器
+
+ + +
+
+
+
UNIT3断路器
+
+ + +
+
+
+
UNIT5断路器
+
+ + +
+
+
+
艏部PZ装置断路器
+
+ + +
+
+
+
预留断路器1
+
+ + +
+
+
+
预留断路器2
+
+ + +
+
+
+
应急锂电池组1断路器
+
+ + +
+
+
+
+ + + + +)row"; +#endif // HTTP_SERVER_DASHBOARD_H diff --git a/src/pPowerManger/httpserver/httpserver.cpp b/src/pPowerManger/httpserver/httpserver.cpp index 31cf551..0af6f80 100644 --- a/src/pPowerManger/httpserver/httpserver.cpp +++ b/src/pPowerManger/httpserver/httpserver.cpp @@ -1,5 +1,6 @@ #include "httpserver.h" #include "index.h" +#include "dashboard.h" #include "../PowerManger.h" #include "mongoose.h" #include @@ -59,6 +60,40 @@ void HttpServer::handleWebSocketEvent(struct mg_connection* c, int ev, void* ev_ LOG_F(INFO, "Upgrading to WebSocket: id=%lu fd=%d", c->id, c->fd); mg_ws_upgrade(c, hm, nullptr); LOG_F(INFO, "WebSocket upgrade completed: id=%lu fd=%d", c->id, c->fd); + } else if (mg_match(hm->uri, mg_str("/dashboard"), NULL)) { + // 返回仪表盘HTML + mg_http_reply(c, 200, "Content-Type: text/html; charset=utf-8\r\n", DASHBOARD_HTML.c_str()); + } else if (mg_match(hm->uri, mg_str("/control"), NULL)) { + // 处理断路器控制请求 + if (mg_strcmp(hm->method, mg_str("POST")) == 0) { + // 解析JSON请求 + char *device_type = mg_json_get_str(hm->body, "$.device_type"); + char *device_id = mg_json_get_str(hm->body, "$.device_id"); + char *action = mg_json_get_str(hm->body, "$.action"); + + if (device_type && device_id && action) { + //TODO: 处理断路器控制逻辑 + LOG_F(INFO, "Received control request: device_type=%s, device_id=%s, action=%s ,from Net DashBoard id=%lu fd=%d", + device_type, device_id, action, c->id, c->fd); + + // 模拟随机成功或失败 (70%成功率) + bool success = (rand() % 10) < 7; + const char *message = success ? "操作成功" : "操作失败"; + + // 返回JSON响应 + mg_http_reply(c, 200, "Content-Type: application/json\r\n", + "{\"success\": %s, \"message\": \"%s\"}", + success ? "true" : "false", message); + } else { + mg_http_reply(c, 400, "Content-Type: text/plain\r\n", "Invalid request"); + } + // 释放分配的内存 + if (device_type) free(device_type); + if (device_id) free(device_id); + if (action) free(action); + } else { + mg_http_reply(c, 405, "Content-Type: text/plain\r\n", "Method Not Allowed"); + } } else { // 返回主页HTML mg_http_reply(c, 200, "Content-Type: text/html; charset=utf-8\r\n", INDEX_HTML.c_str()); @@ -225,8 +260,33 @@ void HttpServer::pushSystemData() { j["dyn_power_limit2"] = Json::Value(m_systemData->dyn_power_limit2); // 动力电池2功率限制值 //设备在线状态 - j["device_online_flag1"] = Json::Value(m_systemData->device_online_flag1); - j["device_online_flag2"] = Json::Value(m_systemData->device_online_flag2); + j["device_onile"]["device_online_flag1"] = Json::Value(m_systemData->device_online_flag1); + j["device_onile"]["device_online_flag2"] = Json::Value(m_systemData->device_online_flag2); + + j["device_onile"]["ins_online_state"] = Json::Value(m_systemData->device_online_status.ins_online_state); // 仪表锂电在线标志位 + j["device_onile"]["dyn_online_state"] = Json::Value(m_systemData->device_online_status.dyn_online_state); // 动力锂电在线标志位 + j["device_onile"]["fuel_online_state"] = Json::Value(m_systemData->device_online_status.fuel_online_state); // 燃电锂电在线标志位 + j["device_onile"]["high_voltage_online_state"] = Json::Value(m_systemData->device_online_status.high_voltage_online_state); // 高压配电板在线标志位 + j["device_onile"]["low_voltage_online_state"] = Json::Value(m_systemData->device_online_status.low_voltage_online_state); // 低压配电板在线标志位 + j["device_onile"]["composite_online_state"] = Json::Value(m_systemData->device_online_status.composite_online_state); // 复合管控主机在线标志位 + j["device_onile"]["composite_backup_online_state"] = Json::Value(m_systemData->device_online_status.composite_backup_online_state); // 复合管控备机在线标志位 + + //通信状态 + //ccu状态 + j["comm_state"]["ccu_status"]["isTimeout"] = Json::Value(m_systemData->device_common_status.ccu_status.isTimeout); + j["comm_state"]["ccu_status"]["lastUpdateTime"] = Json::Value(m_systemData->device_common_status.ccu_status.lastUpdateTime); + + //高压配电状态 + j["comm_state"]["dis_hv_c1"]["isTimeout"] = Json::Value(m_systemData->device_common_status.dis_hv_c1.isTimeout); + j["comm_state"]["dis_hv_c1"]["lastUpdateTime"] = Json::Value(m_systemData->device_common_status.dis_hv_c1.lastUpdateTime); + j["comm_state"]["dis_hv_c2"]["isTimeout"] = Json::Value(m_systemData->device_common_status.dis_hv_c2.isTimeout); + j["comm_state"]["dis_hv_c2"]["lastUpdateTime"] = Json::Value(m_systemData->device_common_status.dis_hv_c2.lastUpdateTime); + + //低压配电状态 + j["comm_state"]["dis_lv_c1"]["isTimeout"] = Json::Value(m_systemData->device_common_status.dis_lv_c1.isTimeout); + j["comm_state"]["dis_lv_c1"]["lastUpdateTime"] = Json::Value(m_systemData->device_common_status.dis_lv_c1.lastUpdateTime); + j["comm_state"]["dis_lv_c2"]["isTimeout"] = Json::Value(m_systemData->device_common_status.dis_lv_c2.isTimeout); + j["comm_state"]["dis_lv_c2"]["lastUpdateTime"] = Json::Value(m_systemData->device_common_status.dis_lv_c2.lastUpdateTime); //复合管控器心跳计算器 j["heartbeat"] = Json::Value(m_systemData->heartbeat); diff --git a/src/pPowerManger/systemData.h b/src/pPowerManger/systemData.h index 99de9b4..b7068af 100644 --- a/src/pPowerManger/systemData.h +++ b/src/pPowerManger/systemData.h @@ -346,6 +346,38 @@ public: float emergency1BusbarVoltage; } instrument_bus_status; + struct COMMON_STATUS + { + //超时状态 + bool isTimeout; + //最后更新时间 + double lastUpdateTime; + }; + + struct DeviceCommonStatus + { + COMMON_STATUS ccu_status; + COMMON_STATUS dis_hv_c1; + COMMON_STATUS dis_hv_c2; + COMMON_STATUS dis_lv_c1; + COMMON_STATUS dis_lv_c2; + } device_common_status; + + struct DeviceOnlineStatus + { + //在线状态 + //0x00: 未上线 + //0x01: 在线 + //0x02: 上线后掉线 + uint8_t ins_online_state; //仪表锂电在线标志位 + uint8_t dyn_online_state; //动力锂电在线标志位 + uint8_t fuel_online_state; //燃电锂电在线标志位 + uint8_t high_voltage_online_state; //高压配电板在线标志位 + uint8_t low_voltage_online_state; //低压配电板在线标志位 + uint8_t composite_online_state; //复合管控主机在线标志位 + uint8_t composite_backup_online_state; //复合管控备机在线标志位 + } device_online_status; + public: SystemData(){ //初始化变量全部为0 @@ -353,6 +385,17 @@ public: }; ~SystemData(); + void updateCommonStatus(double time_out=3){ + //更新时间 + 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; + }; + void updateSystemData(ccuState data){ fc_mode = data.fc_mode; fc_status = data.fc_status; @@ -481,6 +524,16 @@ public: //设备在线状态 device_online_flag1 = data.device_online_flag1; device_online_flag2 = data.device_online_flag2; + + //更新设备在线状态 + device_online_status.ins_online_state = (data.device_online_flag1 >> 0) & 0xFF; // byte0:仪表锂电在线标志位 + device_online_status.dyn_online_state = (data.device_online_flag1 >> 8) & 0xFF; // byte1:动力锂电在线标志位 + device_online_status.fuel_online_state = (data.device_online_flag1 >> 16) & 0xFF; // byte2:燃电锂电在线标志位 + device_online_status.high_voltage_online_state = (data.device_online_flag1 >> 24) & 0xFF; // byte3:高压配电板在线标志位 + + device_online_status.low_voltage_online_state = (data.device_online_flag2 >> 0) & 0xFF; // byte0:低压配电板在线标志位 + device_online_status.composite_online_state = (data.device_online_flag2 >> 8) & 0xFF; // byte1:复合管控主机在线标志位 + device_online_status.composite_backup_online_state = (data.device_online_flag2 >> 16) & 0xFF; // byte2:复合管控备机在线标志位 //心跳计数器 heartbeat = data.heartbeat;