From a073dc3c983b4c56c5da92642c9ad11995bdb844 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期一, 11 五月 2020 18:05:31 +0800 Subject: [PATCH] 新的科目三 --- lib/src/main/cpp/master/comm_if.cpp | 260 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 259 insertions(+), 1 deletions(-) diff --git a/lib/src/main/cpp/master/comm_if.cpp b/lib/src/main/cpp/master/comm_if.cpp index 2dd5537..c99a0d4 100644 --- a/lib/src/main/cpp/master/comm_if.cpp +++ b/lib/src/main/cpp/master/comm_if.cpp @@ -37,7 +37,8 @@ #define ID_SM_RTK_PLAT_LOGIN 0x0005 #define ID_SM_READ_MAP 0x0006 #define ID_MS_MAP 0x8006 -#define ID_MS_ROAD_MAP 0x8013 +#define ID_MS_ROAD_MAP 0x8014 +#define ID_MS_ROAD_MAP2 0x8013 #define ID_SM_READ_CAR 0x0007 #define ID_MS_CAR 0x8007 @@ -745,6 +746,263 @@ } break; } + case ID_MS_ROAD_MAP2: { + Document doc; + doc.Parse(value); + if (!doc.HasParseError()) { + DEBUG("寮�濮嬭В鏋愯矾鑰冨湴鍥�"); + + vector<PointF> mapPoints; + mapPoints.clear(); + + if (doc.HasMember("points")) { + const Value &s = doc["points"]; + + DEBUG("寰楀埌鎵�鏈夌偣 鍏� %d", s.Size()/2); + + int n = 0; + PointF temp; + + // X-Y鍧愭爣闆嗗悎 + for (Value::ConstValueIterator itr = s.Begin(); + itr != s.End(); ++itr, ++n) { + if ((n % 2) == 0) { + temp.X = (*itr).GetDouble(); + } else { + temp.Y = (*itr).GetDouble(); + mapPoints.push_back(temp); + } + } + } + + road_exam_map map; + + map.roads.clear(); + map.specialAreas.clear(); + map.triggerLines.clear(); + + if (doc.HasMember("road")) { + const Value &a = doc["road"]; + + if (a.IsArray()) { + for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) { + road_t road; + + if (itr->HasMember("id")) { + const Value &s = (*itr)["id"]; + DEBUG("璺痠d %d", s.GetInt()); + road.id = s.GetInt(); + } + if (itr->HasMember("start_line")) { + const Value &a2 = (*itr)["start_line"]; + + PointF p1, p2; + int n = 0; + + for (Value::ConstValueIterator itr2 = a2.Begin(); itr2 != a2.End(); ++itr2, ++n) { + DEBUG("璧峰绾� %d", (*itr2).GetInt()); + if (n == 0) { + p1 = mapPoints[(*itr2).GetInt()]; + } else if (n == 1) { + p2 = mapPoints[(*itr2).GetInt()]; + } + } + + MakeLine(&road.startLine, &p1, &p2); + } + if (itr->HasMember("stop_line")) { + const Value &a2 = (*itr)["stop_line"]; + + PointF p1, p2; + int n = 0; + + for (Value::ConstValueIterator itr2 = a2.Begin(); itr2 != a2.End(); ++itr2, ++n) { + DEBUG("缁撴潫绾� %d", (*itr2).GetInt()); + if (n == 0) { + p1 = mapPoints[(*itr2).GetInt()]; + } else if (n == 1) { + p2 = mapPoints[(*itr2).GetInt()]; + } + } + + MakeLine(&road.stopLine, &p1, &p2); + } + if (itr->HasMember("active")) { + const Value &s = (*itr)["active"]; + DEBUG("璺彛鍔ㄤ綔 %d", s.GetInt()); + + road.active = s.GetInt(); + } + if (itr->HasMember("tts")) { + const Value &s = (*itr)["tts"]; + road.tts = s.GetString(); + } + if (itr->HasMember("stop_flag")) { + const Value &s = (*itr)["stop_flag"]; + road.stopFlag = s.GetInt(); + } + if (itr->HasMember("next_road")) { + const Value &s = (*itr)["next_road"]; + road.targetRoad = s.GetInt(); + } + if (itr->HasMember("left_edge")) { + const Value &a2 = (*itr)["left_edge"]; + DEBUG("宸﹁竟绾�"); + + if (a2.IsArray()) { + for (Value::ConstValueIterator itr2 = a2.Begin(); itr2 != a2.End(); ++itr2) { + edge_t edge; + + if (itr2->HasMember("type")) { + const Value &s = (*itr2)["type"]; + DEBUG("\t绫诲瀷 %d", s.GetInt()); + + edge.character = s.GetInt(); + } + if (itr2->HasMember("line")) { + const Value &a3 = (*itr2)["line"]; + if (a3.IsArray()) { + for (Value::ConstValueIterator itr3 = a3.Begin(); itr3 != a3.End(); ++itr3) { + DEBUG("\t绾跨偣 %d", (*itr3).GetInt()); + edge.points.push_back(mapPoints[(*itr3).GetInt()]); + } + } + } + + road.leftEdge.push_back(edge); + } + } + } + if (itr->HasMember("right_edge")) { + const Value &a2 = (*itr)["right_edge"]; + DEBUG("鍙宠竟绾�"); + if (a2.IsArray()) { + for (Value::ConstValueIterator itr2 = a2.Begin(); itr2 != a2.End(); ++itr2) { + edge_t edge; + + if (itr2->HasMember("type")) { + const Value &s = (*itr2)["type"]; + DEBUG("\t绫诲瀷 %d", s.GetInt()); + edge.character = s.GetInt(); + } + if (itr2->HasMember("line")) { + const Value &a3 = (*itr2)["line"]; + if (a3.IsArray()) { + for (Value::ConstValueIterator itr3 = a3.Begin(); itr3 != a3.End(); ++itr3) { + DEBUG("\t绾跨偣 %d", (*itr3).GetInt()); + edge.points.push_back(mapPoints[(*itr3).GetInt()]); + } + } + } + + road.rightEdge.push_back(edge); + } + } + } + if (itr->HasMember("separate")) { + const Value &a2 = (*itr)["separate"]; + DEBUG("娈垫暟閲� %d", a2.Size()); + + for (Value::ConstValueIterator itr2 = a2.Begin(); itr2 != a2.End(); ++itr2) { + DEBUG("\t绾挎暟閲� %d", (*itr2).Size()); + separate_t sep; + + for (Value::ConstValueIterator itr3 = (*itr2).Begin(); itr3 != (*itr2).End(); ++itr3) { + DEBUG("\t\t鑺傛暟閲� %d", (*itr3).Size()); + vector<segment_t> sline; + + for (Value::ConstValueIterator itr4 = (*itr3).Begin(); itr4 != (*itr3).End(); ++itr4) { + const Value &type = (*itr4)["type"]; + const Value &line = (*itr4)["line"]; + + segment_t seg; + + DEBUG("\t\t\t鑺傜被鍨� = %d", type.GetInt()); + seg.character = type.GetInt(); + + if ((*itr4).HasMember("left_lane_direct")) { + const Value &dir = (*itr4)["left_lane_direct"]; + DEBUG("\t\t\t宸﹁溅閬撴柟鍚� %d", dir.GetInt()); + seg.left_lane_direct = dir.GetInt(); + } else { + seg.left_lane_direct = 0; + } + + if ((*itr4).HasMember("right_lane_direct")) { + const Value &dir = (*itr4)["right_lane_direct"]; + DEBUG("\t\t\t鍙宠溅閬撴柟鍚� %d", dir.GetInt()); + seg.right_lane_direct = dir.GetInt(); + } else { + seg.right_lane_direct = 0; + } + + for (Value::ConstValueIterator itr5 = line.Begin(); itr5 != line.End(); ++itr5) { + DEBUG("\t\t\t鐐� = %d", (*itr5).GetInt()); + + seg.points.push_back(mapPoints[(*itr5).GetInt()]); + } + + sline.push_back(seg); + } + sep.lines.push_back(sline); + } + + road.separate.push_back(sep); + } + } + + map.roads.push_back(road); + } + } + } + + if (doc.HasMember("special_area")) { + const Value &a = doc["special_area"]; + + vector<special_area_t> specialAreas; + + for (Value::ConstValueIterator itr = a.Begin(); + itr != a.End(); ++itr) { + special_area_t specialArea; + + if (itr->HasMember("type")) { + const Value &s = (*itr)["type"]; + specialArea.type = s.GetInt(); + } + if (itr->HasMember("id")) { + const Value &s = (*itr)["id"]; + specialArea.id = s.GetInt(); + } + if (itr->HasMember("road")) { + const Value &s = (*itr)["road"]; + specialArea.road = s.GetInt(); + } + + if (itr->HasMember("area")) { + const Value &a2 = (*itr)["area"]; + + for (Value::ConstValueIterator itr2 = a2.Begin(); + itr2 != a2.End(); ++itr2) { + specialArea.area.push_back(mapPoints[(*itr2).GetInt()]); + } + } + + map.specialAreas.push_back(specialArea); + } + } + if (doc.HasMember("trigger_line")) { + + } + DEBUG("鍦板浘瑙f瀽瀹屾瘯"); + + CleanRoadMap(); + SetRoadMap(map); + } else { + DEBUG("############## 鍦板浘瑙f瀽鍑洪敊###################"); + } + + break; + } case ID_MS_MAP: { Document doc; doc.Parse(value); -- Gitblit v1.8.0