From 712eb83d17ffc6e259af6c53ba63bbd58cd1242b Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期三, 19 八月 2020 18:33:42 +0800
Subject: [PATCH] 坐标

---
 lib/src/main/cpp/test_items2/road_exam.cpp |  331 +++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 212 insertions(+), 119 deletions(-)

diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp
index 8bb5cea..0f0c587 100644
--- a/lib/src/main/cpp/test_items2/road_exam.cpp
+++ b/lib/src/main/cpp/test_items2/road_exam.cpp
@@ -23,6 +23,7 @@
 #include <map>
 #include <string>
 #include <cstdlib>
+#include <algorithm>
 
 #define DEBUG(fmt, args...)     LOGD("<road_exam> <%s>: " fmt, __func__, ##args)
 
@@ -72,6 +73,13 @@
     int gain;
     struct RtkTime time;
 } change_lane_t;
+
+typedef struct {
+    int road_index;
+    int stop_line_index;
+    int sep;
+    double distance;
+} road_end_point_t;
 
 static const int INVALID_ROAD = -1;
 
@@ -168,6 +176,7 @@
 static void ResetTurnDetect(const car_model *car);
 static void DetectTurn(const car_model *car, int moveDirect, const struct RtkTime *rtkTime);
 
+static int NearbyCrossingGuide(int &stopLineIndex, int roadIndex, road_t &road, const car_model *car);
 
 static trigger_line_t * EntryItem(int index, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList);
 
@@ -175,7 +184,7 @@
 
 static int CalcRoadIndex(int currRoadIndex, road_exam_map &RoadMap, const car_model *car);
 
-void AnalysisRoad(road_exam_map &RoadMap, int roadIndex, lane_t lane, const car_model *car);
+static double AnalysisRoad(road_exam_map &RoadMap, int roadIndex, lane_t lane, const car_model *car);
 
 void InitRoadExam(road_exam_map &RoadMap)
 {
@@ -1098,33 +1107,118 @@
     }
 }
 
-static void HintCrossing(int roadIndex, road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList)
+/*********************************************************
+ * 璁$畻褰撳墠鎵�鍦ㄥ垎閬撶嚎鐨勫墿浣欓暱搴�
+ * @param RoadMap
+ * @param lane
+ * @param car
+ * @return
+ */
+static double SeparateLength(road_exam_map &RoadMap, lane_t lane, const car_model *car)
 {
-    for (int i = 0; i < road.stopLine.size(); ++i) {
-        PointF point;
+    double distance = 0;
+
+    if (lane.road < 0 || lane.total == 0 || lane.sep < 0)
+        return distance;
+
+    int n = RoadMap.roads[lane.road].separate[lane.sep].lines[0].size();
+    int m = RoadMap.roads[lane.road].separate[lane.sep].lines[0][n-1].points.size();
+
+    return CalcDistanceReference(car->carXY[car->axial[AXIAL_FRONT]],
+            RoadMap.roads[lane.road].separate[lane.sep].lines[0][n-1].points[m-1],
+            RoadMap.roads[lane.road].rightEdge);
+}
+
+/***********************************************************
+ * 鍓嶅悜鏈�杩戠殑璺彛鍋滄绾挎垨瀵煎悜绾胯捣鐐癸紝涓�瀹氳窛绂诲唴鍋氬嚭璺彛鎻愮ず锛屾垨椤圭洰鑷姩瑙﹀彂
+ * @param roadIndex
+ * @param RoadMap
+ * @param car
+ */
+static road_end_point_t NearbyRoadEndPoint(int roadIndex, road_exam_map &RoadMap, const car_model *car)
+{
+    road_end_point_t rec;
+
+    rec.road_index = roadIndex;
+    rec.stop_line_index = 0;
+    rec.distance = 0;
+
+    if (roadIndex < 0 || roadIndex >= RoadMap.roads.size())
+        return rec;
+
+    // 鏈�杩戠殑璺彛璺濈
+    int stop_line_index;
+    PointF nearbyStopPoint;
+
+    NearbyCrossingGuide(stop_line_index, roadIndex, RoadMap.roads[roadIndex], car);
+    nearbyStopPoint.X = RoadMap.roads[roadIndex].stopLine[stop_line_index].line.X1;
+    nearbyStopPoint.Y = RoadMap.roads[roadIndex].stopLine[stop_line_index].line.Y1;
+
+    double dis1 = CalcDistanceReference(car->carXY[car->axial[AXIAL_FRONT]], nearbyStopPoint, RoadMap.roads[roadIndex].rightEdge);
+
+    struct ep_ {
+        int sep;
         double distance;
+    } ep;
 
-        point.X = road.stopLine[i].line.X1;
-        point.Y = road.stopLine[i].line.Y1;
+    vector<struct  ep_> dset;
 
-        distance = CalcDistanceReference(car->carXY[car->axial[AXIAL_FRONT]], point, road.rightEdge);
+    ep.sep = -1;
+    ep.distance = dis1;
+    dset.push_back(ep);
 
-        if (distance > 10 && distance < 50) {
-            // 鎻愮ず璺彛鎬庝箞璧�
-            if (GetCrossingStatus(roadIndex, i) == CROSSING_NOT_HINT) {
-                if (!road.stopLine[i].tts.empty()) {
-                    DEBUG("璺彛鎻愮ず %s", road.stopLine[i].tts.c_str());
-                    PlayTTS(road.stopLine[i].tts.c_str());
+    // 鏈�杩戠殑鍒嗛亾绾胯窛绂伙紝涓斾笉瓒呰繃鏈�杩戣矾鍙�
+    for (int i = 0; i < RoadMap.roads[roadIndex].separate.size(); ++i) {
+        for (int j = 0;  j < RoadMap.roads[roadIndex].separate[i].lines.size(); ++j) {
+            for (int k = 0; k < RoadMap.roads[roadIndex].separate[i].lines[j].size(); ++k) {
+                if (RoadMap.roads[roadIndex].separate[i].lines[j][k].character != LINE_DOTTED &&
+                        RoadMap.roads[roadIndex].separate[i].lines[j][k].points.size() > 0) {
+                    double dis2 = CalcDistanceReference(car->carXY[car->axial[AXIAL_FRONT]], RoadMap.roads[roadIndex].separate[i].lines[j][k].points[0], RoadMap.roads[roadIndex].rightEdge);
+
+                    if (dis2 < -1e-3) {
+                        continue;
+                    }else if (dis2 < dis1) {
+                        // 鎵惧嚭鏈�鐭殑鐐�
+                        ep.sep = i;
+                        ep.distance = dis2;
+                        dset.push_back(ep);
+                        continue;
+                    }
+                    goto FIND_END_POINT;
                 }
-                ChangeCrossingStatus(roadIndex, i, CROSSING_HAS_HINT);
             }
-        } else if (distance > 55 && GetCrossingStatus(roadIndex, i) != CROSSING_NOT_HINT) {
-            ChangeCrossingStatus(roadIndex, i, CROSSING_NOT_HINT);
         }
+    }
+
+    FIND_END_POINT:
+    sort(dset.begin(), dset.end(), [=](struct ep_ x, struct ep_ y)->bool {return x.distance < y.distance;});
+
+    rec.stop_line_index = stop_line_index;
+    rec.distance = dset[0].distance;
+    rec.sep = dset[0].sep;
+
+    return rec;
+}
+
+static void HintCrossing(road_exam_map &RoadMap, int roadIndex, int stopIndex, double distance) {
+    if (roadIndex < 0 || roadIndex >= RoadMap.roads.size())
+        return;
+
+    if (distance > 5 && distance < 70) {
+        // 鎻愮ず璺彛鎬庝箞璧�
+        if (GetCrossingStatus(roadIndex, stopIndex) == CROSSING_NOT_HINT) {
+            if (!RoadMap.roads[roadIndex].stopLine[stopIndex].tts.empty()) {
+                DEBUG("璺彛鎻愮ず %s", RoadMap.roads[roadIndex].stopLine[stopIndex].tts.c_str());
+                PlayTTS(RoadMap.roads[roadIndex].stopLine[stopIndex].tts.c_str());
+            }
+            ChangeCrossingStatus(roadIndex, stopIndex, CROSSING_HAS_HINT);
+        }
+    } else if (distance > 75 && GetCrossingStatus(roadIndex, stopIndex) != CROSSING_NOT_HINT) {
+        ChangeCrossingStatus(roadIndex, stopIndex, CROSSING_NOT_HINT);
     }
 }
 
-static int NearbyCrossingGuide(int &stopLineIndex, int roadIndex, road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList)
+static int NearbyCrossingGuide(int &stopLineIndex, int roadIndex, road_t &road, const car_model *car)
 {
     int guide = 0, stopLine = 0;
     double distance;
@@ -1173,6 +1267,9 @@
     stopLineIndex = stopLine;
     return guide;
 }
+
+static uint8_t itemExec[4] = {0};
+static double odo;
 
 void TestRoadGeneral(road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime)
 {
@@ -1372,8 +1469,6 @@
 
     if (currExamMapIndex >= 0) {
         car_sensor_value_t brk = ReadCarSensorValue(BREAK);
-        HintCrossing(currExamMapIndex, RoadMap.roads[currExamMapIndex], car, CarModelList);
-
         // 妫�娴嬮�氳繃璺彛銆佷汉琛岄亾绛夊尯鍩熸椂锛岄噴鏀惧埞杞︽垨鍑忛��
         ApproachTarget(RoadMap, car, currExamMapIndex, (brk.value == BREAK_ACTIVE), speed, moveDirect, rtkTime);
     }
@@ -1393,13 +1488,13 @@
 
 //    DEBUG("Lane淇℃伅 road %d sep %d total %d no %d guide %d", Lane.road, Lane.sep, Lane.total, Lane.no, Lane.guide);
     if (Lane.guide > 0 && currExamMapIndex >= 0) {
-        int stop_line;
+        int stop_line_index;
 
-        if (!(NearbyCrossingGuide(stop_line, currExamMapIndex, RoadMap.roads[currExamMapIndex], car, CarModelList) & Lane.guide)) {
-            if (!GetErrorLaneRpt(currExamMapIndex, stop_line)) {
+        if (!(NearbyCrossingGuide(stop_line_index, currExamMapIndex, RoadMap.roads[currExamMapIndex], car) & Lane.guide)) {
+            if (!GetErrorLaneRpt(currExamMapIndex, stop_line_index)) {
                 DEBUG("涓嶆寜瑙勫畾杞﹂亾鏍囧悜琛岄┒");
                 AddExamFault(9, rtkTime);
-                SetErrorLaneRpt(currExamMapIndex, stop_line, true);
+                SetErrorLaneRpt(currExamMapIndex, stop_line_index, true);
             }
         }
     }
@@ -1408,8 +1503,92 @@
         DEBUG("瀵煎悜绫诲瀷鍒囨崲 %d", Lane.guide);
     }
 
-    if (currExamMapIndex >= 0) {
-        AnalysisRoad(RoadMap, currExamMapIndex, Lane, car);
+    if (currExamMapIndex >= 0 && Lane.guide == 0) {
+        double BigStraightRoad = AnalysisRoad(RoadMap, currExamMapIndex, Lane, car);
+
+        road_end_point_t ep = NearbyRoadEndPoint(currExamMapIndex, RoadMap, car);
+
+        HintCrossing(RoadMap, ep.road_index, ep.stop_line_index, ep.distance);
+
+        double freeSepDis = SeparateLength(RoadMap, Lane, car);
+
+        // 鍓╀綑璺濈灏辨槸瀵煎悜绾胯捣鐐圭殑璺濈
+        if (Lane.sep >= 0 && Lane.sep == ep.sep) {
+            freeSepDis = ep.distance;
+        }
+
+        DEBUG("鐩撮亾鍓╀綑璺濈 %f, 杞﹂亾鍓╀綑璺濈 %f", BigStraightRoad, freeSepDis);
+
+        if (startCar == START_CAR_DONE) {
+            if (itemExec[0] == 1 || itemExec[1] == 1 || itemExec[2] == 1 || itemExec[3] == 1) {
+
+                DEBUG("椤圭洰鎵ц璺濈<%d %d %d %d> %f", itemExec[0], itemExec[1], itemExec[2], itemExec[3], ReadOdo() - odo);
+
+                if (ReadOdo() - odo > 120) {
+                    odo = ReadOdo();
+                    if (itemExec[0] == 1) {
+                        itemExec[0] = 2;
+                    }
+                    if (itemExec[1] == 1) {
+                        itemExec[1] = 2;
+                    }
+                    if (itemExec[2] == 1) {
+                        itemExec[2] = 2;
+                    }
+                    if (itemExec[3] == 1) {
+                        itemExec[3] = 2;
+                    }
+                }
+                goto BIG_DOG;
+            }
+
+            if (itemExec[0] == 2 || itemExec[1] == 2 || itemExec[2] == 2 || itemExec[3] == 2) {
+                DEBUG("椤圭洰浼戞伅璺濈<%d %d %d %d> %f", itemExec[0], itemExec[1], itemExec[2], itemExec[3], ReadOdo() - odo);
+
+                if (ReadOdo() - odo > 100) {
+                    if (itemExec[0] == 2) {
+                        itemExec[0] = 3;
+                    }
+                    if (itemExec[1] == 2) {
+                        itemExec[1] = 3;
+                    }
+                    if (itemExec[2] == 2) {
+                        itemExec[2] = 3;
+                    }
+                    if (itemExec[3] == 2) {
+                        itemExec[3] = 3;
+                    }
+                }
+                goto BIG_DOG;
+            }
+
+
+            if (BigStraightRoad > 170 && ep.distance > 170) {
+                if (itemExec[0] == 0) {
+                    PlayTTS("浜岀嫍鐩寸嚎琛岄┒");
+                    itemExec[0] = 1;
+                    odo = ReadOdo();
+                }
+            } else if (BigStraightRoad > 150 && ep.distance > 150) {
+                if (itemExec[3] == 0) {
+                    PlayTTS("浜岀嫍鍔犲噺妗�");
+                    itemExec[3] = 1;
+                    odo = ReadOdo();
+                }
+            } else if (freeSepDis > 150) {
+                if (itemExec[2] == 0) {
+                    PlayTTS("浜岀嫍鍙橀亾");
+                    itemExec[2] = 1;
+                    odo = ReadOdo();
+                } else if (itemExec[1] == 0) {
+                    PlayTTS("浜岀嫍瓒呰溅");
+                    itemExec[1] = 1;
+                    odo = ReadOdo();
+                }
+            }
+
+            BIG_DOG:;
+        }
     }
 
     // 妫�娴嬪帇绾跨姸鎬�
@@ -1430,9 +1609,8 @@
             stopCar = STOP_CAR_DONE;
     }
 
-
     // 鎵ц鏌愪釜椤圭洰
-    if (currRoadItem != NULL) {
+    /*if (currRoadItem != NULL) {
         if (currRoadItem->active == ROAD_ITEM_CHANGE_LANE) {
             if (DistanceOf(car->basePoint, roadItemStartPoint) > CHANGE_LANE_RANGE) {
                 DEBUG("鍙橀亾璺濈瓒呮爣");
@@ -1482,7 +1660,7 @@
                 StartDriveStraightExam(currRoadItem->tts);
             }
         }
-    }
+    }*/
 }
 
 void Rtk2DriveTimer(struct drive_timer &tm, const struct RtkTime *rtkTime)
@@ -1625,61 +1803,6 @@
     prevTurnWise = angle;
 }
 
-static char CheckCarTurn(LIST_CAR_MODEL &CarModelList)
-{
-    // 鏈�杩�2绉掑唴锛屾瘡0.5绉掔殑瑙掑害宸ぇ浜�5搴︼紝涓旀柟鍚戠浉鍚岋紝杩炵画4娆★紱鎴栫獊鐜拌秴30搴︾殑杞悜锛涜涓鸿浆鍚戙��
-    if (CarModelList.size() < 1)
-        return false;
-
-    list<car_model *>::iterator iter = CarModelList.begin();
-
-    car_model *c1 = *iter, *c2;
-
-    ++iter;
-
-    char turn[TURN_CHECK_CNT] = {0};
-    int checkCnt = 0;
-
-//    DEBUG("CheckCarTurn.........");
-
-    while (iter != CarModelList.end() && checkCnt < TURN_CHECK_CNT) {
-        c2 = *iter;
-
-        uint32_t tdiff = TimeGetDiff(c1->tm.hh, c1->tm.mm, c1->tm.ss, c1->tm.mss * 10, c2->tm.hh, c2->tm.mm, c2->tm.ss, c2->tm.mss*10);
-
-        if (tdiff >= TURN_CHECK_INTERVAL) {
-            int ang = 0;
-            turn[checkCnt] = isTurn((int)c1->yaw, (int)c2->yaw, ang);
-//            DEBUG("%c  瑙掑害姣旇緝 %02d:%02d:%02d.%03d  %02d:%02d:%02d.%03d", turn[checkCnt], c1->tm.hh, c1->tm.mm, c1->tm.ss, c1->tm.mss * 10, c2->tm.hh, c2->tm.mm, c2->tm.ss, c2->tm.mss*10);
-
-            if (turn[checkCnt] == 'N') {
-                break;
-            } else if (ang >= 30) {
-                DEBUG("宸﹀彸杞‘璁� %c", turn[checkCnt]);
-                return turn[checkCnt];
-            }
-
-            c1 = c2;
-            checkCnt++;
-        }
-
-        ++iter;
-    }
-
-    int i = 0;
-    for (; checkCnt == TURN_CHECK_CNT && i < TURN_CHECK_CNT-1; ++i) {
-        if (turn[i] != turn[i+1])
-            break;
-    }
-
-    if (i == TURN_CHECK_CNT-1) {
-        DEBUG("宸﹀彸杞‘璁� %c", turn[0]);
-        return turn[0];
-    }
-
-    return 0;
-}
-
 /**********************************************************
  * 鎸夋暣涓溅韬槸鍚﹁鐩栬绠�
  * @param RoadMapList
@@ -1738,37 +1861,6 @@
     return false;
 }
 
-
-/***************************************************
- * 鎺ヨ繎璺彛鏃讹紝鎻愮ず涓嬩竴姝ユ�庝箞璧�
- * @param road
- * @param car
- * @param CarModelList
- */
-/*static void ArrivedRoadEnd(road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList)
-{
-    // 璁$畻杞﹀墠杩涜建杩瑰欢闀跨嚎
-    double yaw = YawOf(car->carXY[ car->axial[AXIAL_FRONT] ], car->carXY[ car->axial[AXIAL_REAR] ]);
-
-    PointF extPoint = PointExtend(car->carXY[ car->axial[AXIAL_FRONT] ], NEXT_ROAD_TIP, yaw);
-    Line extLine;
-
-    MakeLine(&extLine, &car->carXY[ car->axial[AXIAL_FRONT] ], &extPoint);
-
-    if (IntersectionOf(extLine, road.stopLine) == GM_Intersection &&
-        IntersectionOfLine(extPoint, road.stopLine) == -1) {
-            if (DistanceOf(extPoint, road.stopLine) > 1.0 && !road.arrivedTail) {
-                // 鎺ヨ繎璺彛鍚庯紝瑕佹鏌ヨ溅杈嗘槸鍚﹁繘鍏ラ敊璇溅閬�
-                DEBUG("鎺ヨ繎璺彛");
-                road.arrivedTail = true;
-                if (!road.tts.empty())
-                    PlayTTS(road.tts.c_str());
-            }
-    } else if (road.arrivedTail) {
-        road.arrivedTail = false;
-    }
-}*/
-
 static trigger_line_t * EntryItem(int index, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList)
 {
     for (int i = 0; i < RoadMap.triggerLines.size(); ++i) {
@@ -1809,21 +1901,22 @@
     return true;
 }
 
-void AnalysisRoad(road_exam_map &RoadMap, int roadIndex, lane_t lane, const car_model *car)
+static double AnalysisRoad(road_exam_map &RoadMap, int roadIndex, lane_t lane, const car_model *car)
 {
     double distance = 0;
 
     if (roadIndex < 0 || roadIndex >= RoadMap.roads.size())
-        return;
+        return 0;
 
     for (int i = 0; i < RoadMap.roads[roadIndex].rightEdge.size(); ++i) {
         for (int j = 1; j < RoadMap.roads[roadIndex].rightEdge[i].points.size(); ++j) {
             PointF point = RoadMap.roads[roadIndex].rightEdge[i].points[j];
-            distance = CalcDistanceReference(car->carXY[car->axial[AXIAL_FRONT]], point, RoadMap.roads[roadIndex].rightEdge);
+            distance = CalcDistanceReference(car->carXY[car->axial[AXIAL_FRONT]], point, RoadMap.roads[roadIndex].leftEdge);
             if (distance > 1e-3) {
-                DEBUG("鐩撮亾鍓╀綑璺濈 %f", distance);
-                return;
+                return distance;
             }
         }
     }
+
+    return 0;
 }

--
Gitblit v1.8.0