From 5f2c0e4d864e765b4a155676fe375b38bb64313b Mon Sep 17 00:00:00 2001 From: Tian jianyong <11429339@qq.com> Date: Tue, 6 May 2025 13:27:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=A2=E7=BB=BF=E7=81=AF?= =?UTF-8?q?=E7=9A=84=E4=B8=A4=E4=B8=AA=E6=96=B9=E5=90=91=E7=9A=84=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7=E7=8A=B6=E6=80=81=E5=A4=84=E7=90=86=E5=92=8C=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E9=A1=B5=E9=9D=A2=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/System.cpp | 140 +++++++----- src/core/System.h | 6 +- src/detector/TrafficLightDetector.cpp | 4 +- src/network/HTTPDataSource.cpp | 4 +- src/types/TrafficLightTypes.h | 10 +- tests/DataCollectorTest.cpp | 7 +- tests/TrafficLightDetectorTest.cpp | 3 +- tools/map_websocket.html | 297 ++++++++++++++------------ 8 files changed, 256 insertions(+), 215 deletions(-) diff --git a/src/core/System.cpp b/src/core/System.cpp index d829865..89848a1 100644 --- a/src/core/System.cpp +++ b/src/core/System.cpp @@ -9,6 +9,8 @@ #include "network/TrafficLightHttpServer.h" #include "config/SystemConfig.h" #include "types/TrafficLightTypes.h" +#include "network/WebSocketServer.h" +#include System* System::instance_ = nullptr; @@ -494,6 +496,16 @@ void System::broadcastPositionUpdate(const MovingObject& obj) { " timestamp=", msg.timestamp); } +// 新增辅助函数:将 SignalStatus 转换为字符串 +std::string signalStatusToString(SignalStatus status) { + switch (status) { + case SignalStatus::RED: return "RED"; + case SignalStatus::GREEN: return "GREEN"; + case SignalStatus::YELLOW: return "YELLOW"; + default: return "UNKNOWN"; + } +} + void System::broadcastTrafficLightStatus(const TrafficLightSignal& signal) { if (!ws_server_) { return; @@ -505,8 +517,13 @@ void System::broadcastTrafficLightStatus(const TrafficLightSignal& signal) { nlohmann::json j = { {"type", "traffic_light_status"}, {"id", signal.trafficLightId}, - {"status", static_cast(signal.status)}, - {"timestamp", signal.timestamp} }; + // 修改: 将 status 改为一个包含 ns 和 ew 状态的对象 + {"status", { + {"ns", signalStatusToString(signal.ns_status)}, + {"ew", signalStatusToString(signal.ew_status)} + }}, + {"timestamp", signal.timestamp} + }; // 添加路口信息 if (intersection) { @@ -517,12 +534,13 @@ void System::broadcastTrafficLightStatus(const TrafficLightSignal& signal) { } ws_server_->broadcast(j.dump()); + + // 修改日志记录 Logger::debug("广播红绿灯状态: id=", signal.trafficLightId, - " status=", static_cast(signal.status), - " intersection=", intersection ? intersection->id : "", - " position=(", intersection ? intersection->position.longitude : 0.0, ",", - intersection ? intersection->position.latitude : 0.0, ")", - " timestamp=", signal.timestamp); + ", NS_Status=", signalStatusToString(signal.ns_status), + ", EW_Status=", signalStatusToString(signal.ew_status), + ", intersection=", intersection ? intersection->id : "", + ", timestamp=", signal.timestamp); } std::string getRiskLevelString(RiskLevel level) { @@ -774,61 +792,65 @@ bool System::handleSafetyZoneRisk(const Vehicle& vehicle, } void System::processPushedTrafficLightData(const nlohmann::json& di_data) { - const auto& config = SystemConfig::instance(); - const std::string target_id = config.simulated_mobile_light_target_intersection_id; - - if (target_id.empty()) { - Logger::warning("Target intersection ID for pushed traffic light data is not configured."); - return; - } - - // 使用配置的 ID 查找路口信息 - const Intersection* intersection = intersection_config_.findById(target_id); - if (!intersection) { - Logger::warning("Configured target intersection ID ", target_id, " not found."); - return; - } - - // 解析 DI 数据获取当前状态 (简化: 只处理南北向) - SignalStatus current_status = SignalStatus::UNKNOWN; try { - // DI-13: 北绿 (NS Green) + const auto& config = SystemConfig::instance(); + const std::string targetIntersectionId = config.simulated_mobile_light_target_intersection_id; + const Intersection* targetIntersection = intersection_config_.findById(targetIntersectionId); + + if (!targetIntersection) { + Logger::warning("Configured target intersection ID not found in intersection config: ", targetIntersectionId); + return; + } + + SignalStatus ns_status = SignalStatus::UNKNOWN; + SignalStatus ew_status = SignalStatus::UNKNOWN; + if (di_data.contains("DI-13") && di_data.at("DI-13").get() == 1) { - current_status = SignalStatus::GREEN; - } - // DI-12: 北黄 (NS Yellow) - else if (di_data.contains("DI-12") && di_data.at("DI-12").get() == 1) { - current_status = SignalStatus::YELLOW; - } - // DI-11: 北红 (NS Red) - else if (di_data.contains("DI-11") && di_data.at("DI-11").get() == 1) { - current_status = SignalStatus::RED; - } - // 可以添加东西向 DI-14 (E/W Red), DI-15 (E/W Yellow), DI-16 (E/W Green) 的解析逻辑 - else { + ns_status = SignalStatus::GREEN; + } else if (di_data.contains("DI-12") && di_data.at("DI-12").get() == 1) { + ns_status = SignalStatus::YELLOW; + } else if (di_data.contains("DI-11") && di_data.at("DI-11").get() == 1) { + ns_status = SignalStatus::RED; + } else { Logger::warning("Received DI data has unknown or invalid N/S state: ", di_data.dump()); - // 可以选择不广播或广播 UNKNOWN - // return; // 如果状态无效则不广播 } - } catch (const json::exception& e) { - Logger::error("Error parsing DI data JSON: ", e.what(), ", Data: ", di_data.dump()); - return; + + if (di_data.contains("DI-16") && di_data.at("DI-16").get() == 1) { + ew_status = SignalStatus::GREEN; + } else if (di_data.contains("DI-15") && di_data.at("DI-15").get() == 1) { + ew_status = SignalStatus::YELLOW; + } else if (di_data.contains("DI-14") && di_data.at("DI-14").get() == 1) { + ew_status = SignalStatus::RED; + } else { + Logger::warning("Received DI data has unknown or invalid E/W state: ", di_data.dump()); + } + + TrafficLightSignal signal; + signal.trafficLightId = "DI_PUSHED_" + targetIntersectionId; + signal.ns_status = ns_status; + signal.ew_status = ew_status; + signal.timestamp = std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()).count(); + + if (ws_server_) { + nlohmann::json messageJson; + messageJson["type"] = "intersection_traffic_light_status"; + messageJson["intersection_id"] = targetIntersection->id; + messageJson["position"] = { + {"latitude", targetIntersection->position.latitude}, + {"longitude", targetIntersection->position.longitude} + }; + messageJson["ns_status"] = static_cast(signal.ns_status); + messageJson["ew_status"] = static_cast(signal.ew_status); + messageJson["timestamp"] = signal.timestamp; + + ws_server_->broadcast(messageJson.dump()); + Logger::debug("广播路口交通灯状态: ", messageJson.dump()); + } else { + Logger::warning("WebSocket server is not available, cannot broadcast intersection status."); + } + + } catch (const std::exception& e) { + Logger::error("处理推送的交通信号灯数据时出错: ", e.what()); } - - // 创建 TrafficLightSignal 结构体 - TrafficLightSignal signal; - signal.trafficLightId = intersection->trafficLightId; // 使用找到的路口的红绿灯 ID - signal.status = current_status; - signal.timestamp = std::chrono::duration_cast( - std::chrono::system_clock::now().time_since_epoch()) - .count(); - signal.intersectionId = intersection->id; - signal.latitude = intersection->position.latitude; - signal.longitude = intersection->position.longitude; - - Logger::debug("Processing pushed traffic light data for intersection: ", intersection->id, - ", status: ", static_cast(signal.status)); - - // 广播信号状态 - broadcastTrafficLightStatus(signal); } \ No newline at end of file diff --git a/src/core/System.h b/src/core/System.h index 8eb417d..ff4ee52 100644 --- a/src/core/System.h +++ b/src/core/System.h @@ -16,6 +16,7 @@ #include "network/MessageTypes.h" #include "config/IntersectionConfig.h" #include "network/TrafficLightHttpServer.h" +#include // 前向声明 class DataCollector; @@ -43,9 +44,12 @@ public: const SystemConfig& getSystemConfig() const { return SystemConfig::instance(); } const IntersectionConfig& getIntersectionConfig() const { return intersection_config_; } - // 新增: 处理推送的红绿灯数据 + // 新增: 处理推送的红绿灯数据 (改回接收 json 对象) void processPushedTrafficLightData(const nlohmann::json& di_data); + // 处理来自数据源的交通信号灯状态 + void processTrafficLightStatus(const TrafficLightSignal& signal); + private: void processLoop(); void processCollisions(const std::vector& detectedRisks, diff --git a/src/detector/TrafficLightDetector.cpp b/src/detector/TrafficLightDetector.cpp index b6ff766..84e4f5a 100644 --- a/src/detector/TrafficLightDetector.cpp +++ b/src/detector/TrafficLightDetector.cpp @@ -27,7 +27,9 @@ void TrafficLightDetector::processSignal(const TrafficLightSignal& signal, for (const auto& vehicle : vehicles) { if (controllable_vehicles_.isControllable(vehicle.vehicleNo)) { // 根据信号灯状态发送指令 - switch (signal.status) { + // FIXME: 临时修改 - 仅根据南北向状态发送指令,未考虑车辆方向和东西向状态。 + // 需要根据车辆行驶方向判断应该参考 ns_status 还是 ew_status。 + switch (signal.ns_status) { case SignalStatus::RED: sendSignalCommand(vehicle.vehicleNo, SignalState::RED); break; diff --git a/src/network/HTTPDataSource.cpp b/src/network/HTTPDataSource.cpp index 7582369..0f16b47 100644 --- a/src/network/HTTPDataSource.cpp +++ b/src/network/HTTPDataSource.cpp @@ -582,8 +582,8 @@ bool HTTPDataSource::parseTrafficLightResponse(const std::string& response, std: for (const auto& item : data) { TrafficLightSignal signal; signal.trafficLightId = item["id"].get(); - signal.status = [&]() { - int state = item["state"].get(); + signal.ns_status = [&]() { + int state = item["ns_status"].get(); switch (state) { case 0: return SignalStatus::RED; case 1: return SignalStatus::GREEN; diff --git a/src/types/TrafficLightTypes.h b/src/types/TrafficLightTypes.h index 3c89fff..249c26c 100644 --- a/src/types/TrafficLightTypes.h +++ b/src/types/TrafficLightTypes.h @@ -12,16 +12,10 @@ enum class SignalStatus { struct TrafficLightSignal { std::string trafficLightId; // 红绿灯设备 ID - SignalStatus status; // 信号灯状态 + SignalStatus ns_status = SignalStatus::UNKNOWN; // 南北向状态 + SignalStatus ew_status = SignalStatus::UNKNOWN; // 东西向状态 uint64_t timestamp; // 时间戳 std::string intersectionId; // 路口编号 double latitude; // 路口纬度 double longitude; // 路口经度 - - static SignalStatus parseStatus(const std::string& status) { - if (status == "red") return SignalStatus::RED; - if (status == "green") return SignalStatus::GREEN; - if (status == "yellow") return SignalStatus::YELLOW; - return SignalStatus::UNKNOWN; - } }; \ No newline at end of file diff --git a/tests/DataCollectorTest.cpp b/tests/DataCollectorTest.cpp index 7529aea..2337aec 100644 --- a/tests/DataCollectorTest.cpp +++ b/tests/DataCollectorTest.cpp @@ -118,7 +118,8 @@ protected: TrafficLightSignal createTestTrafficLight(const std::string& id, int state) { TrafficLightSignal signal; signal.trafficLightId = id; - signal.status = static_cast(state); + signal.ns_status = static_cast(state); + signal.ew_status = static_cast(state); signal.timestamp = std::chrono::duration_cast( std::chrono::system_clock::now().time_since_epoch()).count(); return signal; @@ -379,9 +380,9 @@ TEST_F(DataCollectorTest, TrafficLightSignalsTest) { EXPECT_EQ(signals.size(), 3); if (signals.size() >= 3) { EXPECT_EQ(signals[0].trafficLightId, "TL001"); - EXPECT_EQ(signals[0].status, SignalStatus::RED); // RED = 0 + EXPECT_EQ(signals[0].ns_status, SignalStatus::RED); // RED = 0 EXPECT_EQ(signals[1].trafficLightId, "TL002"); - EXPECT_EQ(signals[1].status, SignalStatus::GREEN); // GREEN = 1 + EXPECT_EQ(signals[1].ns_status, SignalStatus::GREEN); // GREEN = 1 } // 停止数据采集 diff --git a/tests/TrafficLightDetectorTest.cpp b/tests/TrafficLightDetectorTest.cpp index dae325c..7a6561b 100644 --- a/tests/TrafficLightDetectorTest.cpp +++ b/tests/TrafficLightDetectorTest.cpp @@ -76,7 +76,8 @@ protected: TrafficLightSignal createTestSignal(const std::string& id, SignalStatus status) { TrafficLightSignal signal; signal.trafficLightId = id; - signal.status = status; + signal.ns_status = status; + signal.ew_status = status; signal.timestamp = std::chrono::system_clock::now().time_since_epoch().count(); return signal; } diff --git a/tools/map_websocket.html b/tools/map_websocket.html index 377cc6e..3a2dbba 100644 --- a/tools/map_websocket.html +++ b/tools/map_websocket.html @@ -1,8 +1,9 @@ + 机场车辆监控 - + +

机场车辆监控系统

@@ -175,7 +218,7 @@ - \ No newline at end of file + + \ No newline at end of file