From 7fdc4fa80d5d04b5936fc1bdd617b64c6ae9ef37 Mon Sep 17 00:00:00 2001
From: lizhanwei <Dana_Lee1016@126.com>
Date: 星期一, 26 四月 2021 13:17:00 +0800
Subject: [PATCH] Merge branch 'master' of https://gitee.com/endian11/DriveJudge

---
 lib/src/main/cpp/test_items/park_edge.cpp |  134 +++++++++++++++++++++++++++++++++++---------
 1 files changed, 107 insertions(+), 27 deletions(-)

diff --git a/lib/src/main/cpp/test_items/park_edge.cpp b/lib/src/main/cpp/test_items/park_edge.cpp
index e7b9366..cf155ed 100644
--- a/lib/src/main/cpp/test_items/park_edge.cpp
+++ b/lib/src/main/cpp/test_items/park_edge.cpp
@@ -20,6 +20,12 @@
 
 using namespace std;
 
+enum {
+    TESTING,
+    TEST_FAIL,          // 鍥犺Е鍙戞煇浜涜鍒欙紝鍦ㄨ溅韬湭瀹屽叏绔嬪満鎯呭喌涓嬶紝鎻愬墠缁堟閮ㄥ垎娴嬭瘯
+    TEST_FINISH
+};
+
 const uint32_t CHECK_PARK_DELAY = 400;
 
 static int mapIndex = 0;
@@ -30,9 +36,10 @@
 static bool occurCrashRedLine1, occurCrashRedLine2;
 static int prevMoveStatus, storeMoveStatusBeforeStop;
 static int parkStatus;
-static bool occurMoveBack, parkSuccess;
+static int gearAtStop;
+static bool occurMoveBack, checkPark, parkSuccess, checkLight;
 static uint32_t moveBackTimePoint;
-static bool testing = false;
+static int testStatus;
 
 static bool CrashRedLine1(const Polygon *map, const car_model *car);
 static bool CrashRedLine2(const Polygon *map, const car_model *car);
@@ -44,7 +51,7 @@
 {
     DEBUG("杩涘叆渚ф柟鍋滆溅鍦哄湴");
 
-    testing = true;
+    testStatus = TESTING;
     mapIndex = index;
 
     occurCrashRedLine1 = occurCrashRedLine2 = false;        // 杩欎釜绉戠洰瑙勫畾鐗规畩鐐癸紝鍙戠敓涓�娆℃墸10鍒嗭紝鑰屼笉鐩存帴娣樻卑
@@ -54,12 +61,16 @@
     parkSuccess = false;
     parkStatus = 0;
     occurMoveBack = false;
+    checkPark = false;
+    checkLight = false;
+    gearAtStop = -1;
 
+    PlayTTS("鎮ㄥ凡杩涘叆渚ф柟鍋滆溅鍖哄煙", NULL);
     // 浠呭綋鍙戠敓鍊掕溅锛屾墠鎰忓懗鐫�椤圭洰寮�濮�
-    if (moveStatus == -1) {
+    /*if (moveStatus == -1) {
         occurMoveBack = true;
         moveBackTimePoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-    }
+    }*/
 }
 
 int TestParkEdge(const Polygon *map, const car_model *car, const car_model *carPrev, double speed, int moveStatus, const struct RtkTime *rtkTime)
@@ -67,9 +78,39 @@
     vector<double> dtox;
     vector<Line> line_set;
     Line distance_line;
+    bool is_gear_r = false;
+
+    // 棣栨鎸傚�掓尅锛� 鎵嶆剰鍛崇潃椤圭洰寮�濮�
+    if (testStatus == TESTING) {
+        if (ReadCarStatus(GEAR) == GEAR_R) {
+            is_gear_r = true;
+            if (!occurMoveBack) {
+                occurMoveBack = true;
+                moveBackTimePoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss,
+                                                      rtkTime->mss * 10);      // 寮�濮嬭鏃�
+                MA_EnterMap(mapIndex, MAP_TYPE_PART_EDGE, 1);
+            }
+        } else {
+            is_gear_r = false;
+            if (occurMoveBack && !checkPark) {
+                // 妫�鏌ヨ溅韬叆搴撴儏鍐�
+                DEBUG("妫�鏌ヨ溅韬叆搴撴儏鍐�");
+                checkPark = true;
+                if (EnterParking(map, car)) {
+                    parkStatus = 1;
+                    parkSuccess = true;
+                } else {
+                    // 鍋滄鍚庯紝杞﹁韩鍑虹嚎锛屼笉鍚堟牸
+                    AddExamFault(20401, rtkTime);
+                    parkSuccess = false;
+                    DEBUG("绉诲簱涓嶅叆");
+                }
+            }
+        }
+    }
 
     if (CrashRedLine1(map, car)) {
-        if (!occurCrashRedLine1 && occurMoveBack) {
+        if (!occurCrashRedLine1 /*&& occurMoveBack*/) {
             // 杞﹁疆鍘嬭竟绾匡紝姣忔鎵�10鍒�
             AddExamFault(20403, rtkTime);
             DEBUG("杞﹁疆鍘嬭竟绾�");
@@ -80,7 +121,7 @@
     }
 
     if (CrashRedLine2(map, car)) {
-        if (!occurCrashRedLine2 && occurMoveBack) {
+        if (!occurCrashRedLine2 /*&& occurMoveBack*/) {
             // 杞﹁韩鍘嬪簱浣嶇嚎锛屾瘡娆℃墸10鍒�
             AddExamFault(20404, rtkTime);
             DEBUG("杞﹁韩鍘嬪簱浣嶇嚎");
@@ -90,14 +131,20 @@
         occurCrashRedLine2 = false;
     }
 
-    if (ExitParkArea(map, car) || ExitParkArea2(map, car)) {
-        if (!parkSuccess && occurMoveBack && !reportParkFail) {
+    if (ExitParkArea2(map, car)) {
+        /*if (!parkSuccess && occurMoveBack && !reportParkFail) {
             // 鐩存帴椹剁娴嬭瘯鍖猴紝璁や负绉诲簱涓嶅叆
             AddExamFault(10103, rtkTime);
             reportParkFail = true;
             DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�");
+        }*/
+        if (occurMoveBack && !checkPark) {
+            // 鍊掕溅鐩存帴椹剁娴嬭瘯鍖�
+            AddExamFault(10103, rtkTime);
+            DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�");
         }
-        testing = false;
+
+        testStatus = TEST_FINISH;
         goto TEST_END;
     }
 
@@ -117,6 +164,13 @@
     DistanceOfTire2X(dtox, car, line_set);
     MA_SendDistance(dtox[0], dtox[1]);
 
+    if (testStatus == TESTING && !occurMoveBack && ExitParkArea(map, car)) {
+        // 鍏ュ簱鍚庝竴鐩村墠杩涳紝杞﹀ご绉诲嚭椹剁绾�
+        AddExamFault(10103, rtkTime);
+        DEBUG("鐩存帴椹剁娴嬭瘯鍖�,涓嶆寜鑰冭瘯鍛樻寚浠ら┚椹�");
+        testStatus = TEST_FAIL;
+    }
+
     if (occurMoveBack) {
         uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
 
@@ -133,15 +187,33 @@
             parkStatus = 0;
             stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
             storeMoveStatusBeforeStop = prevMoveStatus;
-
+            gearAtStop = is_gear_r ? 1 : 0;
             DEBUG("鍋滆溅浜� %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss);
-        } else {
+        } else if (prevMoveStatus == 0) {
             DEBUG("缁х画琛岄┒ %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss);
             uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
 
             DEBUG("鍋滆溅鏃堕棿 %ld", tp - stopTimepoint);
 
-            if (moveStatus == storeMoveStatusBeforeStop) {
+            if (tp - stopTimepoint >= CorrectPauseCriteria(examParam.park_edge_pause_criteria)
+            && occurMoveBack
+            && gearAtStop == (is_gear_r ? 1 : 0)) {
+                // 鍋滆溅瓒�2绉掞紝姣忔鎵�5鍒�
+                AddExamFault(20406, rtkTime);
+                DEBUG("鍋滆溅瓒呮椂");
+            }
+
+            if (moveStatus == 1 && checkPark && !checkLight) {
+                // 鍦ㄨ繖閲屾鏌ヨ浆鍚戠伅鐘舵��
+                checkLight = true;
+                if (ReadCarStatus(TURN_SIGNAL_LAMP) != LEFT_TURN_LIGHT) {
+                    // 涓嶅紑杞悜鐏紝鎵�10鍒�
+                    AddExamFault(20405, rtkTime);
+                    DEBUG("鏈紑鍚浆鍚戠伅");
+                }
+            }
+
+            /*if (moveStatus == storeMoveStatusBeforeStop) {
                 // 鍚屾柟鍚戝啀鍚姩锛岀户缁垽鏂槸鍚﹀仠杞﹁秴鏃�
                 if (tp - stopTimepoint >= CorrectPauseCriteria(examParam.park_edge_pause_criteria) && occurMoveBack) {
                     // 鍋滆溅瓒�2绉掞紝姣忔鎵�5鍒�
@@ -172,18 +244,18 @@
                         DEBUG("鏈紑鍚浆鍚戠伅");
                     }
                 }
-            }
+            }*/
 
-            if (moveStatus == -1 && !occurMoveBack) {
+           /* if (moveStatus == -1 && !occurMoveBack) {
                 DEBUG("寮�濮嬪�掕溅");
                 occurMoveBack = true;
                 moveBackTimePoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
                 MA_EnterMap(mapIndex, MAP_TYPE_PART_EDGE, 1);
-            }
+            }*/
         }
 
         prevMoveStatus = moveStatus;
-    } else if (moveStatus == 0 && parkStatus == 0) {
+    } /*else if (moveStatus == 0 && parkStatus == 0) {
         uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
 
         if (tp - stopTimepoint >= CHECK_PARK_DELAY) {
@@ -194,13 +266,15 @@
                 parkStatus = -1;
             }
         }
-    }
+    }*/
 
 TEST_END:
-    if (!testing && occurMoveBack) {
+    if (testStatus == TEST_FINISH) {
+        DEBUG("渚ф柟鍋滆溅缁撴潫");
         MA_EnterMap(mapIndex, MAP_TYPE_PART_EDGE, 0);
+        return 0;
     }
-    return testing ? 1 : 0;
+    return 1;
 }
 
 // 杞﹁疆鏄惁鍘嬮亾璺竟绾�
@@ -234,7 +308,7 @@
     bool ret = false;
 
     Line red_line;
-    const int red_lines[][2] = {{2, 3}, {3, 4}, {4, 5}};
+    const int red_lines[][2] = {{0, 7}, {2, 3}, {3, 4}, {4, 5}};
 
     Polygon car_body;
 
@@ -249,6 +323,14 @@
         if (IntersectionOf(red_line, &car_body) != GM_None) {
             ret = true;
             break;
+        }
+    }
+
+    if (!occurMoveBack) {
+        // 鍊掕溅鍓嶏紝杞﹁韩涓嶅緱鍘嬪簱浣嶈櫄绾�
+        MakeLine(&red_line, &map->point[2], &map->point[5]);
+        if (IntersectionOf(red_line, &car_body) != GM_None) {
+            ret = true;
         }
     }
 
@@ -282,14 +364,12 @@
     return succ;
 }
 
-// 鏁翠釜杞﹁締閮借椹惰繃鍓嶅簱浣嶇嚎
+// 杞﹀ご瑕侀┒杩囧墠搴撲綅绾�
 static bool ExitParkArea(const Polygon *map, const car_model *car)
 {
-    for (int i = 0; i < car->bodyNum; ++i) {
-        if (IntersectionOfLine(map->point[6], map->point[7], car->carXY[car->body[i]]) != -1)
-            return false;
-    }
-    return true;
+    if (IntersectionOfLine(map->point[6], map->point[7], car->carXY[ car->axial[AXIAL_FRONT] ]) == -1)
+            return true;
+    return false;
 }
 
 static bool ExitParkArea2(const Polygon *map, const car_model *car)

--
Gitblit v1.8.0