From 53be5cac481ddc7927ca3f8fe75a5180f0d6567a Mon Sep 17 00:00:00 2001
From: fctom1215 <fctom1215@outlook.com>
Date: 星期五, 27 三月 2020 00:16:33 +0800
Subject: [PATCH] 角度修正。

---
 lib/src/main/cpp/test_items2/drive_straight.cpp    |   29 +++++----
 lib/src/main/cpp/test_items2/through_something.cpp |    2 
 lib/src/main/cpp/test_items2/dummy_light.cpp       |    2 
 lib/src/main/cpp/test_items2/road_exam.cpp         |   87 ++++++++++++++++++++++++++---
 lib/src/main/cpp/test_items2/stop_car.cpp          |   18 +++--
 lib/src/main/cpp/test_items2/operate_gear.cpp      |    2 
 6 files changed, 109 insertions(+), 31 deletions(-)

diff --git a/lib/src/main/cpp/test_items2/drive_straight.cpp b/lib/src/main/cpp/test_items2/drive_straight.cpp
index ee94653..16a8832 100644
--- a/lib/src/main/cpp/test_items2/drive_straight.cpp
+++ b/lib/src/main/cpp/test_items2/drive_straight.cpp
@@ -56,23 +56,28 @@
             crossStartLine = true;
             startPoint = car->basePoint;
             edgeDistance = DistanceOf(car->basePoint, road_edge);
+
+            DEBUG("褰撳墠鍩哄噯璺竟闂磋窛 %f", edgeDistance);
         }
     } else {
         double distanceToStart = DistanceOf(car->basePoint, startPoint);
 
-        if (distanceToStart > CHECK_STAGE_DISTANCE) {
-            if (!reportOffsetOver && fabs(DistanceOf(car->basePoint, road_edge) - edgeDistance) > MAX_OFFSET_DISTANCE) {
-                DEBUG("鐩寸嚎鍋忕Щ澶т簬30鍘樼背");
-                // 鍋忕Щ澶т簬30鍘樼背锛屼笉鍚堟牸
-                AddExamFault(30, rtkTime);
-                reportOffsetOver = true;
+        DEBUG("璺竟闂磋窛 %f --- %f", DistanceOf(car->basePoint, road_edge), edgeDistance);
 
-                //////////////////////////////////////////////
-                startPoint = car->basePoint;
-                edgeDistance = DistanceOf(car->basePoint, road_edge);
-                reportOffsetOver = false;
-            }
-        } else {
+        if (!reportOffsetOver && fabs(DistanceOf(car->basePoint, road_edge) - edgeDistance) > MAX_OFFSET_DISTANCE) {
+            DEBUG("鐩寸嚎鍋忕Щ澶т簬30鍘樼背");
+            // 鍋忕Щ澶т簬30鍘樼背锛屼笉鍚堟牸
+            AddExamFault(30, rtkTime);
+            reportOffsetOver = true;
+
+            //////////////////////////////////////////////
+            startPoint = car->basePoint;
+            edgeDistance = DistanceOf(car->basePoint, road_edge);
+            reportOffsetOver = false;
+        }
+
+        if (distanceToStart > CHECK_STAGE_DISTANCE) {
+            DEBUG("澶嶄綅杈硅窛鍋忕Щ閲�");
             startPoint = car->basePoint;
             edgeDistance = DistanceOf(car->basePoint, road_edge);
             reportOffsetOver = false;
diff --git a/lib/src/main/cpp/test_items2/dummy_light.cpp b/lib/src/main/cpp/test_items2/dummy_light.cpp
index c048150..81a3a02 100644
--- a/lib/src/main/cpp/test_items2/dummy_light.cpp
+++ b/lib/src/main/cpp/test_items2/dummy_light.cpp
@@ -58,9 +58,9 @@
 
 void DummyLightTTSDone(int id)
 {
-    DEBUG("DummyLightTTSDone %d", id);
     // 绛夎闊虫挱鎶ュ畬姣曞悗璁℃椂
     if (id == examTtsSeq) {
+        DEBUG("DummyLightTTSDone %d", id);
         for (int i = 0; i < contentNum; ++i) {
             if (content[i].itemStatus == TTS_DOING) {
                 content[i].itemStatus = TTS_DONE;
diff --git a/lib/src/main/cpp/test_items2/operate_gear.cpp b/lib/src/main/cpp/test_items2/operate_gear.cpp
index 98ea7bf..1785dfb 100644
--- a/lib/src/main/cpp/test_items2/operate_gear.cpp
+++ b/lib/src/main/cpp/test_items2/operate_gear.cpp
@@ -156,9 +156,9 @@
 
 void OperateGearTTSDone(int id)
 {
-    DEBUG("鍗囬檷鎸℃寚浠ゅ彂鍑哄畬姣� %d", id);
     // 绛夎闊虫挱鎶ュ畬姣曞悗璁℃椂
     if (id == examTtsSeq) {
+        DEBUG("鍗囬檷鎸℃寚浠ゅ彂鍑哄畬姣� %d", id);
         opGear = CHECK_OP;
         AppTimer_add(CheckGear, D_SEC(7));
     }
diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp
index e48b855..1a86093 100644
--- a/lib/src/main/cpp/test_items2/road_exam.cpp
+++ b/lib/src/main/cpp/test_items2/road_exam.cpp
@@ -25,7 +25,7 @@
 
 using namespace std;
 
-#define TURN_CHECK_CNT          4
+#define TURN_CHECK_CNT          6
 
 enum {
     START_CAR_NOT_DO,
@@ -33,7 +33,7 @@
     START_CAR_DONE
 };
 
-static const int TURN_THRESHOLD = 5;
+static const int TURN_THRESHOLD = 1;
 static const int TURN_CHECK_INTERVAL = 500;
 const double SLIDE_DISTANCE_THRESHOLD_RED = 0.3;
 const double SLIDE_DISTANCE_THRESHOLD_YELLOW = 0.1;
@@ -57,10 +57,12 @@
 static bool slideLongDistance;
 static bool slideNormalDistance;
 static bool occurSlide;
+static bool startCarLeftTurnSignal, checkStartCarSignal;
 
 static struct drive_timer crashGreenRunTime, crashGreenCmpTime, crashGreenStartTime, turnSignalChangeTime;
 static struct drive_timer gearErrorTimePoint;
 static struct drive_timer gearNSlideTimePoint;
+static struct drive_timer startCarLeftTurnSignalTime;
 
 static int gearErrorTime;
 static int gearNSlideTime;
@@ -71,6 +73,10 @@
 static bool checkDoor = false;
 static bool handBreakActive = false;
 static bool reportRPMOver = false;
+
+static const uint32_t TURN_ERROR_COLD_TIME = D_SEC(10);
+
+static bool turnError13Cold, turnError14Cold;
 
 static const int MAX_ENGINE_RPM = 2500;
 static const double START_CAR_MOVE_DISTANCE = 10.0;
@@ -94,6 +100,10 @@
 static bool CrashGreenLine(LIST_ROAD_MAP &RoadMapList, const car_model *car, PointF &p1, PointF &p2);
 static int CrashTriggerLine(LIST_ROAD_MAP &RoadMapList, const car_model *car, LIST_CAR_MODEL &CarModelList);
 static int FindMapIndexById(int id, LIST_ROAD_MAP &RoadMapList);
+
+static void TurnSignalError13ColdTimer(union sigval sig);
+static void TurnSignalError14ColdTimer(union sigval sig);
+static void ReportTurnSignalError(int err, const struct RtkTime *rtkTime);
 
 void InitRoadExam(void)
 {
@@ -127,6 +137,10 @@
     checkDoor = false;
     handBreakActive = false;
     reportRPMOver = false;
+
+    checkStartCarSignal = startCarLeftTurnSignal = false;
+
+    turnError13Cold = turnError14Cold = true;
 }
 
 void TerminateRoadExam(void)
@@ -134,6 +148,42 @@
     TerminateDummyLightExam();
     TerminateStopCarExam();
     TerminateOperateGearExam();
+
+    AppTimer_delete(TurnSignalError13ColdTimer);
+    AppTimer_delete(TurnSignalError14ColdTimer);
+}
+
+static void TurnSignalError13ColdTimer(union sigval sig)
+{
+    AppTimer_delete(TurnSignalError13ColdTimer);
+
+    turnError13Cold = true;
+}
+
+static void TurnSignalError14ColdTimer(union sigval sig)
+{
+    AppTimer_delete(TurnSignalError14ColdTimer);
+
+    turnError14Cold = true;
+}
+
+static void ReportTurnSignalError(int err, const struct RtkTime *rtkTime)
+{
+    if (err == 13 && turnError13Cold) {
+        DEBUG("璧锋涓嶅紑杞悜鐏�");
+        AddExamFault(13, rtkTime);
+
+        turnError13Cold = false;
+        AppTimer_delete(TurnSignalError13ColdTimer);
+        AppTimer_add(TurnSignalError13ColdTimer, TURN_ERROR_COLD_TIME);
+    } else if (err == 14 && turnError14Cold) {
+        DEBUG("璧锋杞悜鐏笉瓒�3绉�");
+        AddExamFault(14, rtkTime);
+
+        turnError14Cold = false;
+        AppTimer_delete(TurnSignalError14ColdTimer);
+        AppTimer_add(TurnSignalError14ColdTimer, TURN_ERROR_COLD_TIME);
+    }
 }
 
 static void TestRoadStartCar(const car_model *car, double speed, int moveDirect, const struct RtkTime *rtkTime)
@@ -148,8 +198,24 @@
         PlayTTS("璇疯捣姝�");
     } else if (startCar == START_CAR_DOING) {
         moveDistance = DistanceOf(startPoint, car->basePoint);
+        DEBUG("璧锋琛岄┒璺濈 %f", moveDistance);
+
+        if (!startCarLeftTurnSignal && ReadCarStatus(TURN_SIGNAL_LAMP) == LEFT_TURN_LIGHT) {
+            startCarLeftTurnSignal = true;
+            Rtk2DriveTimer(startCarLeftTurnSignalTime, rtkTime);
+        }
+
+        if (!checkStartCarSignal && moveDirect == 1) {
+            checkStartCarSignal = true;
+            if (!startCarLeftTurnSignal) {
+                ReportTurnSignalError(13, rtkTime);
+            } else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10,
+                                   startCarLeftTurnSignalTime.hour, startCarLeftTurnSignalTime.min, startCarLeftTurnSignalTime.sec, startCarLeftTurnSignalTime.msec*10) < TURN_SIGNAL_LAMP_ADVANCE) {
+                ReportTurnSignalError(14, rtkTime);
+            }
+        }
+
         if (moveDistance > START_CAR_MOVE_DISTANCE) {
-            
             if (ReadCarStatus(HAND_BREAK) == BREAK_ACTIVE) {
                 DEBUG("Handbreak active move over 10m");
                 // 鎵嬪埞鎷夎捣鐘舵�佷笅锛岃椹朵簡10绫充互涓婏紝涓嶅悎鏍�
@@ -159,6 +225,9 @@
                 DEBUG("Handbreak active move over 1M");
                 AddExamFault(26, rtkTime);
             }
+
+            PlayTTS("瀹屾垚璧锋");
+            DEBUG("############# 瀹屾垚璧锋 ############");
             startCar = START_CAR_DONE;
         } else if (moveDistance >= START_CAR_CHECK_DOOR_DISTANCE) {
             if (!checkDoor) {
@@ -363,16 +432,16 @@
             if (!reportTurnSignalError) {
                 DEBUG("娌℃墦宸﹁浆鐏�");
                 // 娌℃墦宸﹁浆鐏紝涓嶅悎鏍�
-                AddExamFault(13, rtkTime);
                 reportTurnSignalError = true;
+                ReportTurnSignalError(13, rtkTime);
             }
         } else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10,
                                turnSignalChangeTime.hour, turnSignalChangeTime.min, turnSignalChangeTime.sec, turnSignalChangeTime.msec*10) < TURN_SIGNAL_LAMP_ADVANCE) {
             if (!reportTurnSignalError) {
                 DEBUG("杞悜鐏椂闂翠笉瓒�");
                 // 涓嶈冻3绉掞紝涓嶅悎鏍�
-                AddExamFault(14, rtkTime);
                 reportTurnSignalError = true;
+                ReportTurnSignalError(14, rtkTime);
             }
         }
     } else if (turnDirect == 'R') {
@@ -381,16 +450,16 @@
             if (!reportTurnSignalError) {
                 DEBUG("娌℃墦鍙宠浆鐏�");
                 // 娌℃墦鍙宠浆鐏紝涓嶅悎鏍�
-                AddExamFault(13, rtkTime);
                 reportTurnSignalError = true;
+                ReportTurnSignalError(13, rtkTime);
             }
         } else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10,
                                turnSignalChangeTime.hour, turnSignalChangeTime.min, turnSignalChangeTime.sec, turnSignalChangeTime.msec*10) < TURN_SIGNAL_LAMP_ADVANCE) {
             if (!reportTurnSignalError) {
                 DEBUG("杞悜鐏椂闂翠笉瓒�");
                 // 涓嶈冻3绉掞紝涓嶅悎鏍�
-                AddExamFault(14, rtkTime);
                 reportTurnSignalError = true;
+                ReportTurnSignalError(14, rtkTime);
             }
         }
     } else {
@@ -484,7 +553,7 @@
                     if (turnSignalStatusWhenCrashGreenLine != LEFT_TURN_LIGHT) {
                         DEBUG("鍙樿皟鏈墦鐏�!!");
                         // 娌℃墦鐏紝涓嶅悎鏍�
-                        AddExamFault(13, rtkTime);
+                        ReportTurnSignalError(13, rtkTime);
                     }
                 } else {
 //                    PlayTTS("鍙�2");
@@ -493,7 +562,7 @@
                     if (turnSignalStatusWhenCrashGreenLine != RIGHT_TURN_LIGHT) {
                         DEBUG("鍙樿皟鏈墦鐏�!!");
                         // 娌℃墦鐏紝涓嶅悎鏍�
-                        AddExamFault(13, rtkTime);
+                        ReportTurnSignalError(14, rtkTime);
                     }
                 }
             }
diff --git a/lib/src/main/cpp/test_items2/stop_car.cpp b/lib/src/main/cpp/test_items2/stop_car.cpp
index 6629623..4e93662 100644
--- a/lib/src/main/cpp/test_items2/stop_car.cpp
+++ b/lib/src/main/cpp/test_items2/stop_car.cpp
@@ -61,9 +61,9 @@
 
 void StopCarTTSDone(int id)
 {
-    DEBUG("StopCarTTSDone %d", id);
     // 绛夎闊虫挱鎶ュ畬姣曞悗璁℃椂
     if (id == examTtsSeq) {
+        DEBUG("StopCarTTSDone %d", id);
         ttsPlayEnd = 1;
     }
 }
@@ -88,14 +88,16 @@
                                 rtkTime->mss * 10,
                                 prevPointTime.hour, prevPointTime.min,
                                 prevPointTime.sec, prevPointTime.msec * 10);
-
-    moveDistance += (double)diff * (speed + prevSpeed) / 2;
-    prevSpeed = speed;
-    Rtk2DriveTimer(prevPointTime, rtkTime);
+    if (diff >= D_SEC(1)) {
+        moveDistance += (double)diff * (speed + prevSpeed) / 2.0 / 1000.0;
+        prevSpeed = speed;
+        Rtk2DriveTimer(prevPointTime, rtkTime);
+        DEBUG("鍋滆溅宸茶椹惰窛绂� %f", moveDistance);
+    }
 
     if (moveDistance > 150) {
         // 150绫冲唴鏈仠杞︼紝涓嶅悎鏍�
-        DEBUG("鍋滆溅璺濈瓒呮爣");
+        DEBUG("鍋滆溅璺濈瓒呮爣锛岄潬杈瑰仠杞︾粨鏉�");
         AddExamFault(33, rtkTime);
         return -1;
     }
@@ -103,7 +105,7 @@
     if (moveDirect != prevMoveDirect) {
         if (moveDirect == 0) {
             stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-            DEBUG("鍋滆溅浜� %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss);
+            DEBUG("####### 闈犺竟鍋滆溅锛屽仠杞︿簡 %d %d %d %d %d %d %d ######", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss);
         }
         prevMoveDirect = moveDirect;
     } else if (moveDirect == 0) {
@@ -189,6 +191,7 @@
             }
         }
     } else if (occurOpenDoor) {
+        DEBUG("寮�杞﹂棬锛岄潬杈瑰仠杞︾粨鏉�");
         return -1;
     }
 
@@ -196,6 +199,7 @@
         uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
 
         if (tp - openDoorTimepoint >= OPEN_DOOR_TIMEOUT + D_SEC(5)) {
+            DEBUG("寮�闂ㄦ椂闂村ぇ浜�20绉掞紝闈犺竟鍋滆溅缁撴潫");
             return -1;
         }
     }
diff --git a/lib/src/main/cpp/test_items2/through_something.cpp b/lib/src/main/cpp/test_items2/through_something.cpp
index 913333b..613a362 100644
--- a/lib/src/main/cpp/test_items2/through_something.cpp
+++ b/lib/src/main/cpp/test_items2/through_something.cpp
@@ -25,7 +25,7 @@
         return;
     DEBUG("杩涘叆璺�冮�氳繃something鍦板浘 index = %d id = %d item = %d", index, RoadMapList[index].id, RoadMapList[index].type);
     if (!RoadMapList[index].tts.empty()) {
-        DEBUG("鎾斁TTS");
+        DEBUG("鎾斁TTS %s", RoadMapList[index].tts.c_str());
         PlayTTS(RoadMapList[index].tts.c_str());
     } else {
         DEBUG("娌℃湁TTS");

--
Gitblit v1.8.0