From d05c25aa4823e9d2aa812e9c0e3d1d66bb9861dd Mon Sep 17 00:00:00 2001
From: fctom1215 <fctom1215@outlook.com>
Date: 星期六, 29 八月 2020 10:47:17 +0800
Subject: [PATCH] 坐标

---
 lib/src/main/cpp/test_items2/road_exam.cpp |  130 +++++++++++++++++++++++++------------------
 1 files changed, 75 insertions(+), 55 deletions(-)

diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp
index b4e0483..53eea6a 100644
--- a/lib/src/main/cpp/test_items2/road_exam.cpp
+++ b/lib/src/main/cpp/test_items2/road_exam.cpp
@@ -72,7 +72,7 @@
 const double SLIDE_DISTANCE_THRESHOLD_RED = 0.3;
 const double SLIDE_DISTANCE_THRESHOLD_YELLOW = 0.1;
 
-const double EXAM_RANGE = 3000.0;                       // 鑷冲皯椹鹃┒璺濈
+const double EXAM_RANGE = 2700.0;                       // 鑷冲皯椹鹃┒璺濈
 
 static bool occurOverSpeed;
 static bool occurSecondBreak;
@@ -93,6 +93,8 @@
 
 static struct RtkTime gearErrorTimePoint;
 static struct RtkTime gearNSlideTimePoint;
+
+static car_sensor_value_t turnSignalStatus;
 
 static int gearErrorTime;
 
@@ -127,13 +129,14 @@
 } RoadExamItem_t;
 static map<int, int> RoadExamItem;
 static int RoadExamStatus;
+static bool win;
 
 static struct RtkTime beginTurnTime, prevDetectTurnTime;
 static int startTurnYaw, prevYaw;
 static int turnCnt, turnTimeCnt;
 static int prevTurnWise;
 
-static const uint32_t GEAR_N_SLIDE_TIMEOUT = D_SEC(5);
+static const uint32_t GEAR_N_SLIDE_TIMEOUT = D_SEC(10);
 static const uint32_t GEAR_ERROR_TIMEOUT = D_SEC(15);
 static const uint32_t STOP_CAR_TIME = D_SEC(2);
 static const uint32_t CHANGE_LANE_MIN_INTERVAL = D_SEC(10);
@@ -199,6 +202,8 @@
     RoadExamItem[ROAD_EXAM_ITEM_CAR_STOP] = ROAD_EXAM_ITEM_NOT_EXEC;
 
     RoadExamStatus = ROAD_EXAM_READY_NEXT;
+
+    win = false;
 }
 
 void TerminateRoadExam(void)
@@ -879,7 +884,7 @@
             checkCrashGreenTimeout = 0;
             // 璁板綍寮�濮嬪帇绾跨殑鏃堕棿锛屼笉纭畾鏄惁鏈夊彉閬撴剰鍥撅紝寰呯‘璁ゅ彉閬撳悗鍐嶅鐞嗕箣
             crashGreenStartTime = *rtkTime;
-
+            turnSignalStatus = ReadCarSensorValue(TURN_SIGNAL_LAMP);
             DEBUG("寮�濮嬪帇铏氱嚎 %02d-%02d-%02d %02d:%02d:%02d", crashGreenStartTime.YY, crashGreenStartTime.MM, crashGreenStartTime.DD, crashGreenStartTime.hh, crashGreenStartTime.mm, crashGreenStartTime.ss, crashGreenStartTime.mss * 10);
         }
         crashDottedLine = true;
@@ -926,40 +931,45 @@
         if (newLane.road == Lane.road && newLane.sep == Lane.sep) {
             gain = newLane.no - Lane.no;
         } else {
-            DEBUG("杞﹂亾鍒嗘鍒囨崲");
+            DEBUG("杞﹂亾鍒嗘鍒囨崲 Old Lane road = %d sep = %d no = %d New Lane road = %d sep = %d no = %d", Lane.road, Lane.sep, Lane.no, newLane.road, newLane.sep, newLane.no);
             ChangeLane.gain = 0;
         }
 
         // 妫�鏌ヨ浆鍚戠伅
         if (gain != 0) {
             DEBUG("鍙橀亾 new lane %d, gain %d", newLane.no, gain);
-            car_sensor_value_t lamp = ReadCarSensorValue(TURN_SIGNAL_LAMP);
-            if (lamp.name == TURN_SIGNAL_LAMP) {
-                if (gain < 0) {
-                    if (lamp.value != LEFT_TURN_LIGHT) {
-                        DEBUG("鍙樿皟鏈墦鐏�!!");
-                        // 娌℃墦鐏紝涓嶅悎鏍�
-                        AddExamFault(13, rtkTime);
-                    } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) < TURN_SIGNAL_LAMP_ADVANCE) {
-                        DEBUG("杞悜鐏椂闂翠笉瓒� %02d-%02d-%02d %02d:%02d:%02d.%03d  -> %02d-%02d-%02d %02d:%02d:%02d.%03d",
-                              crashGreenStartTime.YY, crashGreenStartTime.MM, crashGreenStartTime.DD, crashGreenStartTime.hh, crashGreenStartTime.mm, crashGreenStartTime.ss, crashGreenStartTime.mss * 10,
-                              lamp.time.YY, lamp.time.MM, lamp.time.DD, lamp.time.hh, lamp.time.mm, lamp.time.ss, lamp.time.mss * 10);
+            if (gain < 0) {
+                if (turnSignalStatus.value != LEFT_TURN_LIGHT) {
+                    DEBUG("鍙樿皟鏈墦鐏�!!");
+                    // 娌℃墦鐏紝涓嶅悎鏍�
+                    AddExamFault(13, rtkTime);
+                } else if (TimeGetDiff(&crashGreenStartTime, &turnSignalStatus.time) <
+                           TURN_SIGNAL_LAMP_ADVANCE) {
+                    DEBUG("杞悜鐏椂闂翠笉瓒� %02d-%02d-%02d %02d:%02d:%02d.%03d  -> %02d-%02d-%02d %02d:%02d:%02d.%03d",
+                          crashGreenStartTime.YY, crashGreenStartTime.MM, crashGreenStartTime.DD,
+                          crashGreenStartTime.hh, crashGreenStartTime.mm, crashGreenStartTime.ss,
+                          crashGreenStartTime.mss * 10,
+                          turnSignalStatus.time.YY, turnSignalStatus.time.MM, turnSignalStatus.time.DD, turnSignalStatus.time.hh,
+                          turnSignalStatus.time.mm, turnSignalStatus.time.ss, turnSignalStatus.time.mss * 10);
 
-                        // 涓嶈冻3绉掞紝涓嶅悎鏍�
-                        AddExamFault(14, rtkTime);
-                    }
-                } else {
-                    if (lamp.value != RIGHT_TURN_LIGHT) {
-                        DEBUG("鍙樿皟鏈墦鐏�!!");
-                        // 娌℃墦鐏紝涓嶅悎鏍�
-                        AddExamFault(13, rtkTime);
-                    } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) < TURN_SIGNAL_LAMP_ADVANCE) {
-                        DEBUG("杞悜鐏椂闂翠笉瓒� %02d-%02d-%02d %02d:%02d:%02d.%03d  -> %02d-%02d-%02d %02d:%02d:%02d.%03d",
-                              crashGreenStartTime.YY, crashGreenStartTime.MM, crashGreenStartTime.DD, crashGreenStartTime.hh, crashGreenStartTime.mm, crashGreenStartTime.ss, crashGreenStartTime.mss * 10,
-                              lamp.time.YY, lamp.time.MM, lamp.time.DD, lamp.time.hh, lamp.time.mm, lamp.time.ss, lamp.time.mss * 10);
-                        // 涓嶈冻3绉掞紝涓嶅悎鏍�
-                        AddExamFault(14, rtkTime);
-                    }
+                    // 涓嶈冻3绉掞紝涓嶅悎鏍�
+                    AddExamFault(14, rtkTime);
+                }
+            } else {
+                if (turnSignalStatus.value != RIGHT_TURN_LIGHT) {
+                    DEBUG("鍙樿皟鏈墦鐏�!!");
+                    // 娌℃墦鐏紝涓嶅悎鏍�
+                    AddExamFault(13, rtkTime);
+                } else if (TimeGetDiff(&crashGreenStartTime, &turnSignalStatus.time) <
+                           TURN_SIGNAL_LAMP_ADVANCE) {
+                    DEBUG("杞悜鐏椂闂翠笉瓒� %02d-%02d-%02d %02d:%02d:%02d.%03d  -> %02d-%02d-%02d %02d:%02d:%02d.%03d",
+                          crashGreenStartTime.YY, crashGreenStartTime.MM, crashGreenStartTime.DD,
+                          crashGreenStartTime.hh, crashGreenStartTime.mm, crashGreenStartTime.ss,
+                          crashGreenStartTime.mss * 10,
+                          turnSignalStatus.time.YY, turnSignalStatus.time.MM, turnSignalStatus.time.DD, turnSignalStatus.time.hh,
+                          turnSignalStatus.time.mm, turnSignalStatus.time.ss, turnSignalStatus.time.mss * 10);
+                    // 涓嶈冻3绉掞紝涓嶅悎鏍�
+                    AddExamFault(14, rtkTime);
                 }
             }
 
@@ -1238,6 +1248,11 @@
 
     UpdataOdo(speed, moveDirect, rtkTime);
 
+    if (!win) {
+        win = true;
+        turnSignalStatus = ReadCarSensorValue(TURN_SIGNAL_LAMP);
+    }
+
     // 鍒硅溅鎻愮ず闊�
     RingBreak();
 
@@ -1323,6 +1338,7 @@
     
     // 鎸′綅涓嶅尮閰嶈秴鏃�
     if (currGearError && prevGearError) {
+        DEBUG("鎸′綅閿欒澧炲姞 %ld姣 褰撳墠鎸′綅 %d 鏃堕�� %f", TimeGetDiff(rtkTime, &gearErrorTimePoint), ReadCarStatus(GEAR), ConvertMs2KMh(speed));
         gearErrorTime += TimeGetDiff(rtkTime, &gearErrorTimePoint);
     }
     if (gearErrorTime > GEAR_ERROR_TIMEOUT) {
@@ -1425,10 +1441,11 @@
 //    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_index;
+        int act = NearbyCrossingGuide(stop_line_index, currExamMapIndex, RoadMap.roads[currExamMapIndex], car);
 
-        if (!(NearbyCrossingGuide(stop_line_index, currExamMapIndex, RoadMap.roads[currExamMapIndex], car) & Lane.guide)) {
+        if (act != 0 && !(act & Lane.guide)) {
             if (!GetErrorLaneRpt(currExamMapIndex, stop_line_index)) {
-                DEBUG("涓嶆寜瑙勫畾杞﹂亾鏍囧悜琛岄┒ %d: %d  guide = %d", currExamMapIndex, stop_line_index, Lane.guide);
+                DEBUG("涓嶆寜瑙勫畾杞﹂亾鏍囧悜琛岄┒ %d: %d  鏈熸湜 = %d guide = %d", currExamMapIndex, stop_line_index, act, Lane.guide);
                 AddExamFault(9, rtkTime);
                 SetErrorLaneRpt(currExamMapIndex, stop_line_index, true);
             }
@@ -1547,7 +1564,7 @@
                 testing = TestOvertake(Lane.no, rtkTime);
                 break;
             case ROAD_EXAM_ITEM_STRAIGHT:
-                testing = TestDriveStraight(car, rtkTime);
+                testing = TestDriveStraight(RoadMap, roadIndex, car, rtkTime);
                 break;
             case ROAD_EXAM_ITEM_CAR_STOP:
                 testing = TestStopCar(RoadMap, roadIndex, car, moveDirect, rtkTime);
@@ -1650,6 +1667,8 @@
             turnCnt++;
             beginTurnTime = *rtkTime;
             startTurnYaw = (int) car->yaw;
+
+            turnSignalStatus = ReadCarSensorValue(TURN_SIGNAL_LAMP);
         }
     } else if (turnCnt == 1) {
         if (angle != 0 && moveDirect != 0) {
@@ -1661,6 +1680,8 @@
             } else {
                 beginTurnTime = *rtkTime;
                 startTurnYaw = (int) car->yaw;
+
+                turnSignalStatus = ReadCarSensorValue(TURN_SIGNAL_LAMP);
             }
         } else {
             turnCnt = 0;
@@ -1676,28 +1697,27 @@
                 // 纭杞集琛屼负锛屾娴嬪紑濮嬪垰杞集鏃惰浆鍚戠伅鎯呭喌
                 turnCnt = -1;
 
-                car_sensor_value_t lamp = ReadCarSensorValue(TURN_SIGNAL_LAMP);
-                if (lamp.name == TURN_SIGNAL_LAMP) {
-                    if (wise < 0) {
-                        if (lamp.value != LEFT_TURN_LIGHT) {
-                            DEBUG("鍙樿皟鏈墦鐏�!!");
-                            // 娌℃墦鐏紝涓嶅悎鏍�
-                            AddExamFault(13, rtkTime);
-                        } else if (TimeGetDiff(&beginTurnTime, &lamp.time) < TURN_SIGNAL_LAMP_ADVANCE) {
-                            DEBUG("杞悜鐏椂闂翠笉瓒�");
-                            // 涓嶈冻3绉掞紝涓嶅悎鏍�
-                            AddExamFault(14, rtkTime);
-                        }
-                    } else {
-                        if (lamp.value != RIGHT_TURN_LIGHT) {
-                            DEBUG("鍙樿皟鏈墦鐏�!!");
-                            // 娌℃墦鐏紝涓嶅悎鏍�
-                            AddExamFault(13, rtkTime);
-                        } else if (TimeGetDiff(&beginTurnTime, &lamp.time) < TURN_SIGNAL_LAMP_ADVANCE) {
-                            DEBUG("杞悜鐏椂闂翠笉瓒�");
-                            // 涓嶈冻3绉掞紝涓嶅悎鏍�
-                            AddExamFault(14, rtkTime);
-                        }
+                if (wise < 0) {
+                    if (turnSignalStatus.value != LEFT_TURN_LIGHT) {
+                        DEBUG("鍙樿皟鏈墦鐏�!!");
+                        // 娌℃墦鐏紝涓嶅悎鏍�
+                        AddExamFault(13, rtkTime);
+                    } else if (TimeGetDiff(&beginTurnTime, &turnSignalStatus.time) <
+                               TURN_SIGNAL_LAMP_ADVANCE) {
+                        DEBUG("杞悜鐏椂闂翠笉瓒�");
+                        // 涓嶈冻3绉掞紝涓嶅悎鏍�
+                        AddExamFault(14, rtkTime);
+                    }
+                } else {
+                    if (turnSignalStatus.value != RIGHT_TURN_LIGHT) {
+                        DEBUG("鍙樿皟鏈墦鐏�!!");
+                        // 娌℃墦鐏紝涓嶅悎鏍�
+                        AddExamFault(13, rtkTime);
+                    } else if (TimeGetDiff(&beginTurnTime, &turnSignalStatus.time) <
+                               TURN_SIGNAL_LAMP_ADVANCE) {
+                        DEBUG("杞悜鐏椂闂翠笉瓒�");
+                        // 涓嶈冻3绉掞紝涓嶅悎鏍�
+                        AddExamFault(14, rtkTime);
                     }
                 }
             } else if (turnTimeCnt > D_SEC(10)) {

--
Gitblit v1.8.0