From 8a09b209f1c546a2fa15329e8f69b4a4f89557c9 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期五, 21 八月 2020 18:59:19 +0800
Subject: [PATCH] 自适应触发和个子项修改。

---
 lib/src/main/cpp/test_items2/drive_straight.cpp |  173 ++---------
 lib/src/main/cpp/test_items2/drive_straight.h   |    7 
 lib/src/main/cpp/test_items2/stop_car.h         |    7 
 lib/src/main/cpp/test_items2/overtake.h         |   12 
 lib/src/main/cpp/test_items2/overtake.cpp       |   70 +++++
 lib/src/main/cpp/test_items2/road_exam.cpp      |  215 +++++----------
 lib/src/main/cpp/test_items2/change_lane.h      |   12 
 lib/src/main/cpp/test_items2/stop_car.cpp       |  251 +++++------------
 lib/src/main/cpp/CMakeLists.txt                 |    2 
 lib/src/main/cpp/test_common/car_sensor.cpp     |    4 
 lib/src/main/cpp/test_items2/change_lane.cpp    |   50 +++
 lib/src/main/cpp/test_items2/operate_gear.cpp   |   11 
 12 files changed, 352 insertions(+), 462 deletions(-)

diff --git a/lib/src/main/cpp/CMakeLists.txt b/lib/src/main/cpp/CMakeLists.txt
index 7391283..ccc572d 100644
--- a/lib/src/main/cpp/CMakeLists.txt
+++ b/lib/src/main/cpp/CMakeLists.txt
@@ -47,6 +47,8 @@
         test_items2/operate_gear.cpp
         test_items2/smart_item.cpp
         test_items2/car_start.cpp
+        test_items2/overtake.cpp
+        test_items2/change_lane.cpp
 
         rtk_module/rtk.cpp
         rtk_module/virtual_rtk.cpp
diff --git a/lib/src/main/cpp/test_common/car_sensor.cpp b/lib/src/main/cpp/test_common/car_sensor.cpp
index 8e35440..7eaeef8 100644
--- a/lib/src/main/cpp/test_common/car_sensor.cpp
+++ b/lib/src/main/cpp/test_common/car_sensor.cpp
@@ -377,9 +377,9 @@
         }
         case SENSOR_DOOR: {
             if (value == 0) {
-                WriteCarStatus(DOOR, DOOR_OPEN);
-            } else {
                 WriteCarStatus(DOOR, DOOR_CLOSE);
+            } else {
+                WriteCarStatus(DOOR, DOOR_OPEN);
             }
             break;
         }
diff --git a/lib/src/main/cpp/test_items2/change_lane.cpp b/lib/src/main/cpp/test_items2/change_lane.cpp
new file mode 100644
index 0000000..fde4995
--- /dev/null
+++ b/lib/src/main/cpp/test_items2/change_lane.cpp
@@ -0,0 +1,50 @@
+//
+// Created by YY on 2020/8/21.
+//
+
+#include "change_lane.h"
+#include "../test_common/odo_graph.h"
+#include "../native-lib.h"
+#include "../jni_log.h"
+#include "../driver_test.h"
+
+#define DEBUG(fmt, args...)     LOGD("<change_lane> <%s>: " fmt, __func__, ##args)
+
+static double maxMoveDistance;
+static int originalLane;
+static bool start;
+
+static void TtsBack(int seq)
+{
+    maxMoveDistance = ReadOdo();
+    start = true;
+}
+
+void StartChaneLaneExam(int ori_lane)
+{
+    DEBUG("鍙樻洿杞﹂亾");
+
+    start = false;
+    originalLane = ori_lane;
+    PlayTTS("鍓嶆柟璇峰彉鏇磋溅閬�", TtsBack);
+}
+
+bool TestChangeLane(int currLane, const struct RtkTime *rtkTime)
+{
+    if (!start)
+        return true;
+    if (originalLane != currLane) {
+        DEBUG("瀹屾垚鍙橀亾");
+        PlayTTS("瀹屾垚鍙橀亾", NULL);
+        return false;
+    }
+
+    if (ReadOdo() - maxMoveDistance > 100) {
+        // 瓒呰溅鏈畬鎴�
+        DEBUG("瓒呰溅鍥哄畾璺濈鍐呮湭瀹屾垚");
+        AddExamFault(3, rtkTime);
+        return false;
+    }
+
+    return true;
+}
diff --git a/lib/src/main/cpp/test_items2/change_lane.h b/lib/src/main/cpp/test_items2/change_lane.h
new file mode 100644
index 0000000..efa7d95
--- /dev/null
+++ b/lib/src/main/cpp/test_items2/change_lane.h
@@ -0,0 +1,12 @@
+//
+// Created by YY on 2020/8/21.
+//
+
+#ifndef MYAPPLICATION2_CHANGE_LANE_H
+#define MYAPPLICATION2_CHANGE_LANE_H
+
+void StartChaneLaneExam(int ori_lane);
+
+bool TestChangeLane(int currLane, const struct RtkTime *rtkTime);
+
+#endif //MYAPPLICATION2_CHANGE_LANE_H
diff --git a/lib/src/main/cpp/test_items2/drive_straight.cpp b/lib/src/main/cpp/test_items2/drive_straight.cpp
index 3f26008..8c69204 100644
--- a/lib/src/main/cpp/test_items2/drive_straight.cpp
+++ b/lib/src/main/cpp/test_items2/drive_straight.cpp
@@ -9,6 +9,7 @@
 #include "road_exam.h"
 #include "../master/comm_if.h"
 #include "../common/apptimer.h"
+#include "../test_common/odo_graph.h"
 #include <cmath>
 
 #define DEBUG(fmt, args...)     LOGD("<drive_straight> <%s>: " fmt, __func__, ##args)
@@ -16,148 +17,56 @@
 static const double CHECK_STAGE_DISTANCE = 100.0;
 static const double MAX_OFFSET_DISTANCE = 0.3;
 
-static int ttsPlayEnd;
-static bool crossStartLine;
-static bool reportOffsetOver;
-static double edgeDistance;
-static double distanceToStartSum;
-static int examTtsSeq;
+static int setup;
+static double beginOdo;
+static int yaw_stat;
 
-static double CalcDistance2Edge(road_t &road,  const car_model *car);
-static void PlayTTSTimeout(union sigval sig);
+static void TtsBack(int seq)
+{
+    setup = 1;
+}
 
-void StartDriveStraightExam(std::string tts) {
+void StartDriveStraightExam(void) {
     DEBUG("寮�濮嬬洿绾胯椹�");
-
-    ttsPlayEnd = 0;
-    if (!tts.empty()) {
-        examTtsSeq = PlayTTS(tts.c_str(), NULL);
-    } else {
-        examTtsSeq = PlayTTS("璇蜂繚鎸佺洿绾胯椹�", NULL);
-    }
-
-    distanceToStartSum = 0;
-    reportOffsetOver = false;
-
-    AppTimer_delete(PlayTTSTimeout);
-    AppTimer_add(PlayTTSTimeout, D_SEC(5));
+    setup = 0;
+    yaw_stat = 0;
+    PlayTTS("璇蜂繚鎸佺洿绾胯椹�", TtsBack);
 }
 
-int ExecuteDriveStraightExam(road_t &road,  const car_model *car,
-                             const trigger_line_t *item, const struct RtkTime *rtkTime) {
-    static PointF startPoint;
+bool TestDriveStraight(const car_model *car, const struct RtkTime *rtkTime) {
+    static double yaw;
+    static Line baseLine;
 
-    double dis2roadEdge = 0;
+    if (setup == 1) {
+        // 鍋忚埅瑙掑钩鍧囧��
+        if (yaw_stat == 0) {
+            yaw = car->yaw;
+        } else {
+            yaw += car->yaw;
+        }
+        yaw_stat++;
+        if (yaw_stat == 5) {
+            yaw = fmod(yaw, 360) / 5;
 
-    if (ttsPlayEnd == 1) {
-        ttsPlayEnd = 2;
-        startPoint = car->basePoint;
-        edgeDistance = CalcDistance2Edge(road, car);           // 鍩哄噯杈硅窛
-
-        DEBUG("褰撳墠鍩哄噯璺竟闂磋窛 %f", edgeDistance);
+            PointF extPoint = PointExtend(car->basePoint, 100, yaw);
+            MakeLine(&baseLine, &car->basePoint, &extPoint);
+            beginOdo = ReadOdo();
+            setup = 2;
+        }
+    } else if (setup == 2) {
+        if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], baseLine) > MAX_OFFSET_DISTANCE) {
+            DEBUG("鐩寸嚎鍋忕Щ澶т簬30鍘樼背");
+            // 鍋忕Щ澶т簬30鍘樼背锛屼笉鍚堟牸
+            AddExamFault(30, rtkTime);
+            return false;
+        }
     }
 
-    if (ttsPlayEnd != 2)
-        return 1;
-
-    double distanceToStart = DistanceOf(car->basePoint, startPoint);
-    dis2roadEdge = CalcDistance2Edge(road, car);
-
-    DEBUG("璺竟闂磋窛 %f --- %f", dis2roadEdge, edgeDistance);
-
-    if (!reportOffsetOver && fabs(dis2roadEdge - edgeDistance) > MAX_OFFSET_DISTANCE) {
-        DEBUG("鐩寸嚎鍋忕Щ澶т簬30鍘樼背");
-        // 鍋忕Щ澶т簬30鍘樼背锛屼笉鍚堟牸
-        AddExamFault(30, rtkTime);
-        reportOffsetOver = true;
-
-        //////////////////////////////////////////////
-//        startPoint = car->basePoint;
-//        edgeDistance = dis2roadEdge;
-//        reportOffsetOver = false;
-    }
-
-    if (distanceToStart > CHECK_STAGE_DISTANCE) {
-        DEBUG("澶嶄綅杈硅窛鍋忕Щ閲�");
-        startPoint = car->basePoint;
-        edgeDistance = dis2roadEdge;
-        reportOffsetOver = false;
-        distanceToStartSum += distanceToStart;
-        distanceToStart = 0;
-    }
-
-    if (distanceToStart + distanceToStartSum > 105) {
-        DEBUG("绂诲紑鐩寸嚎琛岄┒鍖哄煙");
+    if (setup == 2 && ReadOdo() - beginOdo > CHECK_STAGE_DISTANCE) {
+        DEBUG("鐩寸嚎琛岄┒缁撴潫");
         PlayTTS("鐩寸嚎琛岄┒缁撴潫", NULL);
-        return -1;
-    }
-    return 1;
-}
-
-void DriveStraightTTSDone(int id)
-{
-    // 绛夎闊虫挱鎶ュ畬姣曞悗璁℃椂
-    if (id == examTtsSeq) {
-        DEBUG("StopCarTTSDone %d", id);
-        ttsPlayEnd = 1;
-        AppTimer_delete(PlayTTSTimeout);
-    }
-}
-
-void TerminateDriveStraightExam(void)
-{
-    AppTimer_delete(PlayTTSTimeout);
-}
-
-static void PlayTTSTimeout(union sigval sig)
-{
-    AppTimer_delete(PlayTTSTimeout);
-
-    ttsPlayEnd = 1;
-}
-
-static double CalcDistance2Edge(road_t &road,  const car_model *car)
-{
-    PointF vp;
-    bool get_vp = false;
-    double distance = 0;
-
-    // 妫�娴嬮亾璺竟缂樼嚎
-    for (int i = 0; i < road.leftEdge.size(); ++i) {
-        PointF p1, p2;
-        Line edge;
-
-        p1 = road.leftEdge[i].points[0];
-        for (int j = 1; j < road.leftEdge[i].points.size(); ++j) {
-            p2 = road.leftEdge[i].points[j];
-            MakeLine(&edge, &p1, &p2);
-
-            if (VerticalPointOnLine(car->basePoint, edge, vp)) {
-                get_vp = true;
-                goto FIND_VP_END;
-            }
-
-            p1 = p2;
-        }
+        return false;
     }
 
-FIND_VP_END:
-    if (get_vp) {
-        DEBUG("寰楀埌鍨傜偣 %d: %f, %f -- %f, %f", road.id, car->basePoint.X, car->basePoint.Y, vp.X, vp.Y);
-        distance = DistanceOf(car->basePoint, vp);
-    } else {
-        // 娌℃湁鎵惧埌鍖归厤绾跨锛屾寜鏈�灏忚窛绂婚《鐐硅绠�
-        DEBUG("鏃犲瀭鐐�");
-        distance = 100;
-        for (int i = 0; i < road.leftEdge.size(); ++i) {
-            for (int j = 0; j < road.leftEdge[i].points.size(); ++j) {
-                double x;
-                if (distance > (x = DistanceOf(car->basePoint, road.leftEdge[i].points[j]))) {
-                    distance = x;
-                }
-            }
-        }
-    }
-
-    return distance;
+    return true;
 }
diff --git a/lib/src/main/cpp/test_items2/drive_straight.h b/lib/src/main/cpp/test_items2/drive_straight.h
index 1187221..cda3f2a 100644
--- a/lib/src/main/cpp/test_items2/drive_straight.h
+++ b/lib/src/main/cpp/test_items2/drive_straight.h
@@ -7,10 +7,7 @@
 
 #include "../driver_test.h"
 
-void StartDriveStraightExam(std::string tts);
-int ExecuteDriveStraightExam(road_t &road,  const car_model *car,
-                             const trigger_line_t *item, const struct RtkTime *rtkTime);
-void DriveStraightTTSDone(int id);
-void TerminateDriveStraightExam(void);
+void StartDriveStraightExam(void);
+bool TestDriveStraight(const car_model *car, const struct RtkTime *rtkTime);
 
 #endif //MYAPPLICATION2_DRIVE_STRAIGHT_H
diff --git a/lib/src/main/cpp/test_items2/operate_gear.cpp b/lib/src/main/cpp/test_items2/operate_gear.cpp
index 564cbee..5a81d6b 100644
--- a/lib/src/main/cpp/test_items2/operate_gear.cpp
+++ b/lib/src/main/cpp/test_items2/operate_gear.cpp
@@ -19,7 +19,6 @@
 static int setup;
 
 static double maxMoveDistance;
-static double gearMoveDistance;
 
 static void TtsBack(int seq)
 {
@@ -37,6 +36,8 @@
 
 bool TestOperateGear(const struct RtkTime *rtkTime)
 {
+    static struct RtkTime shiftTime;
+
     car_sensor_value_t sensor = ReadCarSensorValue(GEAR);
 
     if (sensor.name != GEAR)
@@ -92,11 +93,11 @@
             return false;
         } else {
             // 鍦ㄦ鎸′綅琛岄┒涓�瀹氳窛绂伙紝鍐嶆墽琛屼笅涓�涓�
-            gearMoveDistance = ReadOdo();
+            shiftTime = *rtkTime;
             setup = 3;
         }
     } else if (setup == 3) {
-        if (ReadOdo() - gearMoveDistance > 10) {
+        if (TimeGetDiff(&shiftTime, rtkTime) >= D_SEC(5)) {
             setup = 4;
             char buff[128];
             expectGear += 0 - upDownShift;
@@ -113,11 +114,11 @@
             return false;
         } else {
             // 鍦ㄦ鎸′綅琛岄┒涓�瀹氳窛绂伙紝鍐嶆墽琛屼笅涓�涓�
-            gearMoveDistance = ReadOdo();
+            shiftTime = *rtkTime;
             setup = 5;
         }
     } else if (setup == 5) {
-        if (ReadOdo() - gearMoveDistance > 10) {
+        if (TimeGetDiff(&shiftTime, rtkTime) >= D_SEC(5)) {
             PlayTTS("鍔犲噺鎸′綅鎿嶄綔缁撴潫", NULL);
             return false;
         }
diff --git a/lib/src/main/cpp/test_items2/overtake.cpp b/lib/src/main/cpp/test_items2/overtake.cpp
new file mode 100644
index 0000000..ad97bce
--- /dev/null
+++ b/lib/src/main/cpp/test_items2/overtake.cpp
@@ -0,0 +1,70 @@
+//
+// Created by YY on 2020/8/21.
+//
+
+#include "overtake.h"
+#include "../native-lib.h"
+#include "../jni_log.h"
+#include "../test_common/odo_graph.h"
+#include "../driver_test.h"
+
+#define DEBUG(fmt, args...)     LOGD("<overtake> <%s>: " fmt, __func__, ##args)
+
+static double maxMoveDistance;
+static int setup;
+static int originalLane;
+
+static void TtsBack(int seq)
+{
+    maxMoveDistance = ReadOdo();
+    setup = 1;
+}
+
+void StartOvertakeExam(int ori_lane)
+{
+    DEBUG("瓒呰秺鍓嶆柟杞﹁締");
+
+    PlayTTS("璇疯秴瓒婂墠鏂硅溅杈�", TtsBack);
+
+    setup = 0;
+    originalLane = ori_lane;
+}
+
+bool TestOvertake(int currLane, const struct RtkTime *rtkTime)
+{
+    if (setup == 0) {
+        return true;
+    }
+    if (setup == 1) {
+        if (originalLane == currLane) {
+
+        } else if (currLane + 1 == originalLane) {
+            setup = 2;
+            originalLane = currLane;
+        } else {
+            DEBUG("鍙充晶瓒呰溅");
+            AddExamFault(3, rtkTime);
+            return false;
+        }
+    } else if (setup == 2) {
+        if (originalLane == currLane) {
+
+        } else if (currLane == originalLane + 1) {
+            PlayTTS("瀹屾垚瓒呰溅", NULL);
+            return false;
+        } else {
+            DEBUG("瓒呰溅杩濊鍙橀亾");
+            AddExamFault(3, rtkTime);
+            return false;
+        }
+    }
+
+    if (ReadOdo() - maxMoveDistance > 150) {
+        // 瓒呰溅鏈畬鎴�
+        DEBUG("瓒呰溅鍥哄畾璺濈鍐呮湭瀹屾垚");
+        AddExamFault(3, rtkTime);
+        return false;
+    }
+
+    return true;
+}
diff --git a/lib/src/main/cpp/test_items2/overtake.h b/lib/src/main/cpp/test_items2/overtake.h
new file mode 100644
index 0000000..4ac10f9
--- /dev/null
+++ b/lib/src/main/cpp/test_items2/overtake.h
@@ -0,0 +1,12 @@
+//
+// Created by YY on 2020/8/21.
+//
+
+#ifndef MYAPPLICATION2_OVERTAKE_H
+#define MYAPPLICATION2_OVERTAKE_H
+
+void StartOvertakeExam(int ori_lane);
+
+bool TestOvertake(int currLane, const struct RtkTime *rtkTime);
+
+#endif //MYAPPLICATION2_OVERTAKE_H
diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp
index 3f2955a..e4e8c9a 100644
--- a/lib/src/main/cpp/test_items2/road_exam.cpp
+++ b/lib/src/main/cpp/test_items2/road_exam.cpp
@@ -17,6 +17,8 @@
 #include "operate_gear.h"
 #include "../test_common/odo_graph.h"
 #include "car_start.h"
+#include "overtake.h"
+#include "change_lane.h"
 
 #include <cmath>
 #include <vector>
@@ -30,19 +32,6 @@
 
 using namespace std;
 
-#define TURN_CHECK_CNT          6
-
-enum {
-    START_CAR_NOT_DO,
-    START_CAR_DOING,
-    START_CAR_DONE
-};
-
-enum {
-    STOP_CAR_NOT_DO,
-    STOP_CAR_DOING,
-    STOP_CAR_DONE
-};
 
 enum {
     CROSSING_NOT_HINT,
@@ -79,25 +68,15 @@
 
 static const int CROSSING_TURN_THRESHOLD = 45;
 static const int TURN_THRESHOLD = 3;
-static const int TURN_CHECK_INTERVAL = 500;
+
 const double SLIDE_DISTANCE_THRESHOLD_RED = 0.3;
 const double SLIDE_DISTANCE_THRESHOLD_YELLOW = 0.1;
-const double CHANGE_LANE_RANGE = 100.0;
-const double OVERTAKE_RANGE = 150.0;
-const int OVERTAKE_HOLD_TIME = D_SEC(3);                // 鍦ㄨ秴杞﹂亾琛岄┒鐨勪竴娈垫椂闂�
+
 const double EXAM_RANGE = 3000.0;                       // 鑷冲皯椹鹃┒璺濈
 
-static const double NEXT_ROAD_TIP = 100.0;                  // 鍒拌揪璺彛鍓嶆彁绀轰笅涓�涓�庝箞璧�
-
-
-static bool occurCrashRedLine;
-static bool occurCrashGreenLine;
 static bool occurOverSpeed;
 static bool occurSecondBreak;
 
-static char carIntersectionOfGreenLine;
-static int currTurnSignalStatus;
-static int turnSignalStatusWhenCrashGreenLine;
 
 static int prevMoveDirect;
 static uint32_t stopTimepoint = 0;
@@ -114,19 +93,11 @@
 
 static struct drive_timer gearErrorTimePoint;
 static struct drive_timer gearNSlideTimePoint;
-static struct drive_timer startCarLeftTurnSignalTime;
-static struct drive_timer overTakeCmpTime;
 
 static int gearErrorTime;
 static int gearNSlideTime;
 
-static int stopCar;
 static int currExamMapIndex;
-static trigger_line_t *currRoadItem;
-static PointF roadItemStartPoint;
-static struct drive_timer roadItemStartTime;
-static bool overtake = false;
-static bool checkTurn = false;
 
 static lane_t Lane;
 static change_lane_t ChangeLane;
@@ -170,16 +141,12 @@
 static const uint32_t CRASH_DOTTED_LINE_TIMEOUT = D_SEC(10);
 static const uint32_t TURN_SIGNAL_LAMP_ADVANCE = D_SEC(3);
 
-static const int CRL_NONE = 0;
-static const int CRL_SEP_DOTTED = 1;
-static const int CRL_SEP_SOLID = 2;
-static const int CRL_EDGE_DOTTED = 3;
-static const int CRL_EDGE_SOLID = 4;
 
-static const double MAX_SPEED = 60.0 * 1000.0 / 3600.0;
+static const double MAX_SPEED = 60.0 * 1000.0 / 3600.0;         // 瓒呴�熺‘璁�
+static const double DEC_MAX_SPEED = 55.0 * 1000.0 / 3600.0;     // 瓒呴�熷彇娑�
 static const int SPEED_GEAR_TABLE[][2] = {{0, 20}, {5, 30}, {15, 40}, {25, 10000}, {35, 10000}};
 
-static void ItemExam(road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime, double straight, double road_end);
+static void ItemExam(road_exam_map &RoadMap, int roadIndex, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime, double straight, double road_end);
 static int isTurn(int currYaw, int prevYaw, int thres);
 static void ResetTurnDetect(const car_model *car);
 static void DetectTurn(const car_model *car, int moveDirect, const struct RtkTime *rtkTime);
@@ -187,8 +154,6 @@
 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);
-
-static bool AllCmp(road_exam_map &map);
 
 static int CalcRoadIndex(int currRoadIndex, road_exam_map &RoadMap, const car_model *car);
 
@@ -198,15 +163,10 @@
 {
     DEBUG("Start road_exam");
 
-    occurCrashRedLine = false;
-    occurCrashGreenLine = false;
     occurOverSpeed = false;
 
     occurSecondBreak = false;
 
-    carIntersectionOfGreenLine = 0;
-
-    currTurnSignalStatus = OFF_LIGHT;
     prevMoveDirect = 0;
 
     reportStopCarOnRedArea = false;
@@ -220,14 +180,9 @@
 
     currExamMapIndex = -1;
 
-    stopCar = STOP_CAR_NOT_DO;
-
-    currRoadItem = NULL;
-
     Lane.road = Lane.sep = Lane.no = -1;
     Lane.guide = 0;
 
-    checkTurn = false;
 
     CrashLineType = -1;
     turnCnt = -1;
@@ -934,7 +889,7 @@
                         DEBUG("鍙樿皟鏈墦鐏�!!");
                         // 娌℃墦鐏紝涓嶅悎鏍�
                         AddExamFault(13, rtkTime);
-                    } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) >= D_SEC(3)) {
+                    } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) >= TURN_SIGNAL_LAMP_ADVANCE) {
                         DEBUG("杞悜鐏椂闂翠笉瓒�");
                         // 涓嶈冻3绉掞紝涓嶅悎鏍�
                         AddExamFault(14, rtkTime);
@@ -944,7 +899,7 @@
                         DEBUG("鍙樿皟鏈墦鐏�!!");
                         // 娌℃墦鐏紝涓嶅悎鏍�
                         AddExamFault(13, rtkTime);
-                    } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) >= D_SEC(3)) {
+                    } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) >= TURN_SIGNAL_LAMP_ADVANCE) {
                         DEBUG("杞悜鐏椂闂翠笉瓒�");
                         // 涓嶈冻3绉掞紝涓嶅悎鏍�
                         AddExamFault(14, rtkTime);
@@ -1206,9 +1161,6 @@
     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)
 {
     double BigStraightRoadFree = 0, RoadCrossingFree = 0;
@@ -1218,14 +1170,14 @@
     UpdataOdo(speed, moveDirect, rtkTime);
 
     // 瓒呴�熸娴�
-    if (moveDirect != 0 && speed > MAX_SPEED) {
+    if (speed > MAX_SPEED) {
         if (!occurOverSpeed) {
             occurOverSpeed = true;
             // 瓒呴�燂紝涓嶅悎鏍�
-            DEBUG("瓒呴�� %f", speed);
+            DEBUG("瓒呴�� %f", ConvertMs2KMh(speed));
             AddExamFault(10, rtkTime);
         }
-    } else {
+    } else if (speed < DEC_MAX_SPEED ) {
         occurOverSpeed = false;
     }
 
@@ -1433,7 +1385,7 @@
 
         RoadCrossingFree = freeSepDis;
 
-        DEBUG("鐩撮亾鍓╀綑璺濈 %f, 杞﹂亾鍓╀綑璺濈 %f", BigStraightRoadFree, RoadCrossingFree);
+//        DEBUG("绱琛岄┒璺濈 %f, 鐩撮亾鍓╀綑璺濈 %f, 杞﹂亾鍓╀綑璺濈 %f", ReadOdo(), BigStraightRoadFree, RoadCrossingFree);
     }
 
     // 妫�娴嬪帇绾跨姸鎬�
@@ -1441,75 +1393,14 @@
     // 棰濆鐨勮浆鍚戞娴�
     DetectTurn(car, moveDirect, rtkTime);
 
-    ItemExam(RoadMap, car, CarModelList, speed, moveDirect, rtkTime, BigStraightRoadFree, RoadCrossingFree);
-
-    if (ReadOdo() > EXAM_RANGE && currRoadItem == NULL && AllCmp(RoadMap) && stopCar == STOP_CAR_NOT_DO) {
-        // 鍦ㄥ悎閫傛潯浠朵笅鍋滆溅缁撴潫鑰冭瘯
-        StartStopCarExam("璇烽潬杈瑰仠杞�");
-        stopCar = STOP_CAR_DOING;
-    } else if (stopCar == STOP_CAR_DOING) {
-        if (ExecuteStopCarExam(RoadMap.roads[currExamMapIndex], car, CarModelList, speed, moveDirect, rtkTime) < 0)
-            stopCar = STOP_CAR_DONE;
-    }
-
-    // 鎵ц鏌愪釜椤圭洰
-    /*if (currRoadItem != NULL) {
-        if (currRoadItem->active == ROAD_ITEM_CHANGE_LANE) {
-            if (DistanceOf(car->basePoint, roadItemStartPoint) > CHANGE_LANE_RANGE) {
-                DEBUG("鍙橀亾璺濈瓒呮爣");
-                AddExamFault(3, rtkTime);
-                currRoadItem = NULL;
-            }
-        } else if (currRoadItem->active == ROAD_ITEM_OVERTAKE) {
-            if (!overtake && DistanceOf(car->basePoint, roadItemStartPoint) > OVERTAKE_RANGE) {
-                DEBUG("瓒呰溅璺濈瓒呮爣");
-                AddExamFault(3, rtkTime);
-                currRoadItem = NULL;
-            } else if (overtake && TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss,
-                                               rtkTime->mss * 10,
-                                               overTakeCmpTime.hour, overTakeCmpTime.min,
-                                               overTakeCmpTime.sec, overTakeCmpTime.msec * 10) > OVERTAKE_HOLD_TIME) {
-                DEBUG("鍥炲師杞﹂亾");
-                PlayTTS("璇疯繑鍥炲師杞﹂亾");
-                currRoadItem = NULL;
-            }
-        } else if (currRoadItem->active == ROAD_ITEM_OPERATE_GEAR) {
-            if (ExecuteOperateGearExam(rtkTime) < 0) {
-                currRoadItem = NULL;
-            }
-        } else if (currRoadItem->active == ROAD_ITEM_STRAIGHT) {
-            if (ExecuteDriveStraightExam(RoadMap.roads[currExamMapIndex], car, currRoadItem, rtkTime) < 0) {
-                currRoadItem = NULL;
-            }
-        }
-    } // 妫�娴嬬敱瑙﹀彂绾挎帶鍒剁殑椤圭洰
-    else if (currExamMapIndex >= 0) {
-        trigger_line_t *new_item = EntryItem(currExamMapIndex, RoadMap, car, CarModelList);
-
-        if (new_item != NULL && !new_item->cmp) {
-            currRoadItem = new_item;
-            if (!currRoadItem->tts.empty())
-                PlayTTS(currRoadItem->tts.c_str());
-
-            // 鍒濆鏃堕棿鍜岃窛绂婚檺鍒�
-            roadItemStartPoint = car->basePoint;
-            Rtk2DriveTimer(roadItemStartTime, rtkTime);
-
-            if (currRoadItem->active == ROAD_ITEM_OVERTAKE) {
-                overtake = false;
-            } else if (currRoadItem->active == ROAD_ITEM_OPERATE_GEAR) {
-                StartOperateGearExam(rtkTime);
-            } else if (currRoadItem->active == ROAD_ITEM_STRAIGHT) {
-                StartDriveStraightExam(currRoadItem->tts);
-            }
-        }
-    }*/
+    ItemExam(RoadMap, currExamMapIndex, car, CarModelList, speed, moveDirect, rtkTime, BigStraightRoadFree, RoadCrossingFree);
 }
 
-static void ItemExam(road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime, double straight, double road_end)
+static void ItemExam(road_exam_map &RoadMap, int roadIndex, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime, double straight, double road_end)
 {
     static double freeRunDistance;
     static double totalRunDistance;
+    static double freeRunExceptDistance = 50.0;
 
     if (RoadExamStatus == ROAD_EXAM_READY_NEXT) {
         if (RoadExamItem[ROAD_EXAM_ITEM_CAR_START] == ROAD_EXAM_ITEM_NOT_EXEC) {
@@ -1517,28 +1408,59 @@
             totalRunDistance = ReadOdo();
             RoadExamStatus = ROAD_EXAM_ITEM_CAR_START;
         } else {
-            if (RoadExamItem[ROAD_EXAM_ITEM_STRAIGHT] == ROAD_EXAM_ITEM_NOT_EXEC) {
-                if (straight > 170 && road_end > 170) {
+            bool not_complete = false;
 
+            if (RoadExamItem[ROAD_EXAM_ITEM_STRAIGHT] == ROAD_EXAM_ITEM_NOT_EXEC) {
+                not_complete = true;
+                if (straight > 170 && road_end > 170) {
+                    StartDriveStraightExam();
+                    RoadExamStatus = ROAD_EXAM_ITEM_STRAIGHT;
+                    return;
                 }
             }
             if (RoadExamItem[ROAD_EXAM_ITEM_OP_GEAR] == ROAD_EXAM_ITEM_NOT_EXEC) {
-                if (straight > 150 && road_end > 150) {
+                not_complete = true;
+                if (road_end > 170) {
                     StartOperateGearExam();
                     RoadExamStatus = ROAD_EXAM_ITEM_OP_GEAR;
+                    return;
                 }
             }
             if (RoadExamItem[ROAD_EXAM_ITEM_CHANGE_LANE] == ROAD_EXAM_ITEM_NOT_EXEC) {
-
+                not_complete = true;
+                if (road_end > 150 && Lane.total > 1) {
+                    StartChaneLaneExam(Lane.no);
+                    RoadExamStatus = ROAD_EXAM_ITEM_CHANGE_LANE;
+                    return;
+                }
             }
             if (RoadExamItem[ROAD_EXAM_ITEM_OVER_TAKE] == ROAD_EXAM_ITEM_NOT_EXEC) {
-
+                not_complete = true;
+                if (road_end > 200 && Lane.total > 1) {
+                    if (Lane.no == 0) {
+                        // 宸插湪鏈�宸﹁溅閬擄紝鍏堝彉鏇磋溅閬擄紵
+                        StartChaneLaneExam(Lane.no);
+                        RoadExamStatus = ROAD_EXAM_ITEM_CHANGE_LANE;
+                    } else {
+                        StartOvertakeExam(Lane.no);
+                        RoadExamStatus = ROAD_EXAM_ITEM_OVER_TAKE;
+                    }
+                    return;
+                }
             }
 
+            if (!not_complete) {
+                if (road_end > 200 && ReadOdo() > EXAM_RANGE) {
+                    RoadExamStatus = ROAD_EXAM_ITEM_CAR_STOP;
+                    StartStopCarExam();
+                    return;
+                }
+            }
         }
     } else if (RoadExamStatus == ROAD_EXAM_FREE_RUN) {
-        if (ReadOdo() - freeRunDistance > 300) {
+        if (ReadOdo() - freeRunDistance > freeRunExceptDistance) {
             RoadExamStatus = ROAD_EXAM_READY_NEXT;
+
         }
     } else {
         bool testing = false;
@@ -1550,17 +1472,33 @@
             case ROAD_EXAM_ITEM_OP_GEAR:
                 testing = TestOperateGear(rtkTime);
                 break;
+            case ROAD_EXAM_ITEM_CHANGE_LANE:
+                testing = TestChangeLane(Lane.no, rtkTime);
+                break;
+            case ROAD_EXAM_ITEM_OVER_TAKE:
+                testing = TestOvertake(Lane.no, rtkTime);
+                break;
+            case ROAD_EXAM_ITEM_STRAIGHT:
+                testing = TestDriveStraight(car, rtkTime);
+                break;
+            case ROAD_EXAM_ITEM_CAR_STOP:
+                testing = TestStopCar(RoadMap, roadIndex, car, moveDirect, rtkTime);
+                break;
             default:break;
         }
 
         if (!testing) {
             RoadExamItem[RoadExamStatus] = ROAD_EXAM_ITEM_EXECED;
+            if (RoadExamStatus == ROAD_EXAM_ITEM_CAR_START) {
+                freeRunExceptDistance = 60.0;
+            } else {
+                freeRunExceptDistance = 200.0;
+            }
 
             RoadExamStatus = ROAD_EXAM_FREE_RUN;
             freeRunDistance = ReadOdo();
         }
     }
-
 }
 
 void Rtk2DriveTimer(struct drive_timer &tm, const struct RtkTime *rtkTime)
@@ -1666,7 +1604,7 @@
                             DEBUG("鍙樿皟鏈墦鐏�!!");
                             // 娌℃墦鐏紝涓嶅悎鏍�
                             AddExamFault(13, rtkTime);
-                        } else if (TimeGetDiff(&beginTurnTime, &lamp.time) >= D_SEC(3)) {
+                        } else if (TimeGetDiff(&beginTurnTime, &lamp.time) >= TURN_SIGNAL_LAMP_ADVANCE) {
                             DEBUG("杞悜鐏椂闂翠笉瓒�");
                             // 涓嶈冻3绉掞紝涓嶅悎鏍�
                             AddExamFault(14, rtkTime);
@@ -1676,7 +1614,7 @@
                             DEBUG("鍙樿皟鏈墦鐏�!!");
                             // 娌℃墦鐏紝涓嶅悎鏍�
                             AddExamFault(13, rtkTime);
-                        } else if (TimeGetDiff(&beginTurnTime, &lamp.time) >= D_SEC(3)) {
+                        } else if (TimeGetDiff(&beginTurnTime, &lamp.time) >= TURN_SIGNAL_LAMP_ADVANCE) {
                             DEBUG("杞悜鐏椂闂翠笉瓒�");
                             // 涓嶈冻3绉掞紝涓嶅悎鏍�
                             AddExamFault(14, rtkTime);
@@ -1790,15 +1728,6 @@
     }
 
     return NULL;
-}
-
-static bool AllCmp(road_exam_map &map)
-{
-    for (int i = 0; i < map.triggerLines.size(); ++i) {
-        if (!map.triggerLines[i].cmp)
-            return false;
-    }
-    return true;
 }
 
 static double AnalysisRoad(road_exam_map &RoadMap, int roadIndex, lane_t lane, const car_model *car)
diff --git a/lib/src/main/cpp/test_items2/stop_car.cpp b/lib/src/main/cpp/test_items2/stop_car.cpp
index 6526861..2ec36c9 100644
--- a/lib/src/main/cpp/test_items2/stop_car.cpp
+++ b/lib/src/main/cpp/test_items2/stop_car.cpp
@@ -11,221 +11,132 @@
 #include "../common/apptimer.h"
 #include "../test_common/car_sensor.h"
 #include "../defs.h"
+#include "../test_common/odo_graph.h"
 
 #define DEBUG(fmt, args...)     LOGD("<stop_car> <%s>: " fmt, __func__, ##args)
 
-static bool inactiveBreakHandbreakTogether, notCloseEngine, inactiveHandBreakAfterOpenDoor, occurOpenDoor, doorNotClose, checkRoadDistance;
-static int examTtsSeq = 0;
-static int ttsPlayEnd;
-static double moveDistance;
-static double prevSpeed;
-static struct drive_timer prevPointTime;
-static int prevMoveDirect;
-static uint32_t stopTimepoint = 0;
-static uint32_t openDoorTimepoint;
+static bool BreakHandbreakReleaseSametime, OpenDoor;
 
-const int ENGINE_MIN_ROTATE = 200;
+static const int ENGINE_MIN_ROTATE = 200;
+static const double MAX_STOP_DISTANCE = 150;
 
 static const uint32_t STOP_CAR_TIME = D_SEC(2);
 static const uint32_t OPEN_DOOR_TIMEOUT = D_SEC(15);
 static const double DISTANCE_TO_ROAD_EDGE_1 = 0.5;
 static const double DISTANCE_TO_ROAD_EDGE_2 = 0.3;
 
-static void PlayTTSTimeout(union sigval sig);
+static double beginOdo;
+static int setup;
 
-void StartStopCarExam(std::string tts) {
+static void TtsBack(int seq)
+{
+    setup = 1;
+}
+
+void StartStopCarExam(void) {
     DEBUG("闈犺竟鍋滆溅");
-    ttsPlayEnd = 0;
-    moveDistance = 0;
-    prevMoveDirect = 0;
-    inactiveBreakHandbreakTogether = false;
-    notCloseEngine = false;
-    inactiveHandBreakAfterOpenDoor = false;
-    occurOpenDoor = false;
-    doorNotClose = false;
-    checkRoadDistance = false;
-
-    if (!tts.empty()) {
-        examTtsSeq = PlayTTS(tts.c_str(), NULL);
-    } else {
-        examTtsSeq = PlayTTS("璇烽潬杈瑰仠杞�", NULL);
-    }
-
-    AppTimer_delete(PlayTTSTimeout);
-    AppTimer_add(PlayTTSTimeout, D_SEC(8));
+    BreakHandbreakReleaseSametime = false;
+    setup = 0;
+    OpenDoor = false;
+    PlayTTS("璇烽潬杈瑰仠杞�", TtsBack);
 }
 
-void StopCarTTSDone(int id)
-{
-    // 绛夎闊虫挱鎶ュ畬姣曞悗璁℃椂
-    if (id == examTtsSeq) {
-        DEBUG("StopCarTTSDone %d", id);
-        ttsPlayEnd = 1;
-    }
-}
+bool TestStopCar(road_exam_map &RoadMap, int roadIndex, const car_model *car, int moveDirect, const struct RtkTime *rtkTime) {
+    struct RtkTime time;
 
-void TerminateStopCarExam(void)
-{
-    AppTimer_delete(PlayTTSTimeout);
-}
+    if (setup == 0)
+        return true;
 
-int ExecuteStopCarExam(road_t &road, const car_model *car,
-                             LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime) {
-    if (ttsPlayEnd == 1) {
-        ttsPlayEnd = 2;
-        prevSpeed = speed;
-        Rtk2DriveTimer(prevPointTime, rtkTime);
-    }
-
-    if (ttsPlayEnd != 2)
-        return 1;
-
-    uint32_t diff = TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss,
-                                rtkTime->mss * 10,
-                                prevPointTime.hour, prevPointTime.min,
-                                prevPointTime.sec, prevPointTime.msec * 10);
-    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绫冲唴鏈仠杞︼紝涓嶅悎鏍�
+    if (roadIndex < 0) {
         DEBUG("鍋滆溅璺濈瓒呮爣锛岄潬杈瑰仠杞︾粨鏉�");
         AddExamFault(33, rtkTime);
-        return -1;
+        return false;
     }
 
-    if (moveDirect != prevMoveDirect) {
+    if (setup == 1) {
+        beginOdo = ReadOdo();
+        setup = 2;
+    } else if (setup == 2) {
         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);
+            time = *rtkTime;
+            setup = 3;
         }
-        prevMoveDirect = moveDirect;
-    } else if (moveDirect == 0) {
-        uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-
-        if (tp - stopTimepoint >= STOP_CAR_TIME && !checkRoadDistance) {
+    } else if (setup == 3) {
+        if (moveDirect != 0) {
+            setup = 2;
+        } else if (TimeGetDiff(rtkTime, &time) >= D_SEC(2)) {
             // 鍋滆溅瓒�2绉掞紝寮�濮嬪垽鏂�
             DEBUG("妫�娴嬪拰璺竟鐨勮窛绂�");
-            PointF pc, vp;
-            bool get_vp = false;
-            double dis2roadEdge = 0;
 
-            checkRoadDistance = true;
-            // 鍓嶅悗杞殑涓偣
-            pc.X = (car->carXY[car->right_front_tire[TIRE_OUTSIDE]].X + car->carXY[car->right_rear_tire[TIRE_OUTSIDE]].X) / 2;
-            pc.Y = (car->carXY[car->right_front_tire[TIRE_OUTSIDE]].Y + car->carXY[car->right_rear_tire[TIRE_OUTSIDE]].Y) / 2;
+            PointF p1 = CalcProjectionWithRoadEdge(RoadMap.roads[roadIndex].rightEdge, car->carXY[ car->right_front_tire[TIRE_OUTSIDE] ]);
+            PointF p2 = CalcProjectionWithRoadEdge(RoadMap.roads[roadIndex].rightEdge, car->carXY[ car->right_rear_tire[TIRE_OUTSIDE] ]);
 
-            // 妫�娴嬮亾璺竟缂樼嚎
-            for (int i = 0; i < road.rightEdge.size(); ++i) {
-                PointF p1, p2;
-                Line edge;
-
-                p1 = road.rightEdge[i].points[0];
-                for (int j = 1; j < road.rightEdge[i].points.size(); ++j) {
-                    p2 = road.rightEdge[i].points[j];
-                    MakeLine(&edge, &p1, &p2);
-
-
-                    if (VerticalPointOnLine(pc, edge, vp)) {
-                        get_vp = true;
-                        goto FIND_VP_END;
-                    }
-
-                    p1 = p2;
-                }
-            }
-
-FIND_VP_END:
-            if (get_vp) {
-                dis2roadEdge = DistanceOf(pc, vp);
-            } else {
-                // 娌℃湁鎵惧埌鍖归厤绾跨锛屾寜鏈�灏忚窛绂婚《鐐硅绠�
-                dis2roadEdge = 100;
-                for (int i = 0; i < road.rightEdge.size(); ++i) {
-                    for (int j = 0; j < road.rightEdge[i].points.size(); ++j) {
-                        double dis;
-                        if (dis2roadEdge > (dis = DistanceOf(pc, road.rightEdge[i].points[j]))) {
-                            dis2roadEdge = dis;
-                        }
-                    }
-                }
-            }
-
-            DEBUG("鍋滆溅璺濊矾杈硅窛绂� %f", dis2roadEdge);
-
-            if (dis2roadEdge > DISTANCE_TO_ROAD_EDGE_1) {
+            if (DistanceOf(p1, car->carXY[ car->right_front_tire[TIRE_OUTSIDE] ]) > DISTANCE_TO_ROAD_EDGE_1 ||
+                    DistanceOf(p2, car->carXY[ car->right_rear_tire[TIRE_OUTSIDE] ]) > DISTANCE_TO_ROAD_EDGE_1) {
                 DEBUG("鍋滆溅瓒呭嚭璺竟0.5绫�");
                 // 鍋滆溅璺濈瓒呰繃50鍘樼背锛屼笉鍚堟牸
                 AddExamFault(36, rtkTime);
-            } else if (dis2roadEdge > DISTANCE_TO_ROAD_EDGE_2) {
+                return false;
+            } else if (DistanceOf(p1, car->carXY[ car->right_front_tire[TIRE_OUTSIDE] ]) > DISTANCE_TO_ROAD_EDGE_2 ||
+                       DistanceOf(p2, car->carXY[ car->right_rear_tire[TIRE_OUTSIDE] ]) > DISTANCE_TO_ROAD_EDGE_2) {
                 DEBUG("鍋滆溅瓒呭嚭璺竟0.3绫�");
                 // 鍋滆溅璺濈瓒呰繃30鍘樼背锛屾墸10鍒�
                 AddExamFault(37, rtkTime);
+                return false;
             }
+
+            setup = 4;
         }
-    }
+    } else if (setup == 4) {
+        car_sensor_value_t brk = ReadCarSensorValue(BREAK);
+        car_sensor_value_t hbrk = ReadCarSensorValue(HAND_BREAK);
+        car_sensor_value_t door = ReadCarSensorValue(DOOR);
+        car_sensor_value_t rpm = ReadCarSensorValue(ENGINE_RPM);
 
-    if (!inactiveBreakHandbreakTogether && ReadCarStatus(BREAK) == BREAK_INACTIVE && ReadCarStatus(HAND_BREAK) == BREAK_INACTIVE) {
-        // 鎷夋墜鍒瑰墠锛屾澗鑴氬埞锛屾墸10鍒�
-        DEBUG("鎷夋墜鍒瑰墠锛屾澗鑴氬埞");
-        AddExamFault(39, rtkTime);
-        inactiveBreakHandbreakTogether = true;
-    }
+        if (!BreakHandbreakReleaseSametime && brk.value == BREAK_INACTIVE && hbrk.value == BREAK_INACTIVE) {
+            // 鎷夋墜鍒瑰墠锛屾澗鑴氬埞锛屾墸10鍒�
+            DEBUG("鎷夋墜鍒瑰墠锛屾澗鑴氬埞");
+            AddExamFault(39, rtkTime);
+            BreakHandbreakReleaseSametime = true;
+        }
 
-    if (!notCloseEngine && ReadCarStatus(ENGINE_RPM) < ENGINE_MIN_ROTATE && ReadCarStatus(DOOR) == DOOR_OPEN) {
-        // 涓嬭溅鍓嶏紝涓嶇唲鐏紝鎵�5鍒�
-        DEBUG("涓嬭溅鍓嶏紝涓嶇唲鐏�");
-        AddExamFault(40, rtkTime);
+        if (door.value == DOOR_OPEN) {
+            if (!OpenDoor) {
+                if (rpm.value < ENGINE_MIN_ROTATE) {
+                    // 涓嬭溅鍓嶏紝涓嶇唲鐏紝鎵�5鍒�
+                    DEBUG("涓嬭溅鍓嶏紝涓嶇唲鐏�");
+                    AddExamFault(40, rtkTime);
+                }
+                if (hbrk.value == BREAK_INACTIVE) {
+                    // 寮�闂ㄥ墠锛屾湭鎷夋墜鍒癸紝 鎵�10鍒�
+                    DEBUG("寮�闂ㄥ墠锛屾湭鎷夋墜鍒�");
+                    AddExamFault(38, rtkTime);
+                }
+                time = *rtkTime;
+                OpenDoor = true;
+            }
 
-        notCloseEngine = true;
-    }
-
-    if (!inactiveHandBreakAfterOpenDoor && ReadCarStatus(DOOR) == DOOR_OPEN && ReadCarStatus(HAND_BREAK) == BREAK_INACTIVE) {
-        // 寮�闂ㄥ墠锛屾湭鎷夋墜鍒癸紝 鎵�10鍒�
-        DEBUG("寮�闂ㄥ墠锛屾湭鎷夋墜鍒�");
-        AddExamFault(38, rtkTime);
-
-        inactiveHandBreakAfterOpenDoor = true;
-    }
-
-    if (ReadCarStatus(DOOR) == DOOR_OPEN) {
-        if (!occurOpenDoor) {
-            occurOpenDoor = true;
-            openDoorTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-        } else {
-            uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-
-            if (!doorNotClose && tp - openDoorTimepoint >= OPEN_DOOR_TIMEOUT) {
+            if (TimeGetDiff(rtkTime, &time) > OPEN_DOOR_TIMEOUT) {
                 // 寮�闂ㄦ椂闂磋秴杩�15绉掞紝涓嶅悎鏍�
                 DEBUG("寮�闂ㄦ椂闂磋秴杩�15绉�");
                 AddExamFault(35, rtkTime);
-                doorNotClose = true;
+                return false;
             }
         }
-    } else if (occurOpenDoor) {
-        DEBUG("寮�杞﹂棬锛岄潬杈瑰仠杞︾粨鏉�");
-        return -1;
-    }
 
-    if (occurOpenDoor) {
-        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;
+        if (OpenDoor && door.value == DOOR_CLOSE) {
+            DEBUG("瀹屾垚鍋滆溅");
+            PlayTTS("闈犺竟鍋滆溅缁撴潫", NULL);
+            return false;
         }
     }
 
-    return 1;
-}
+    if (ReadOdo() - beginOdo > MAX_STOP_DISTANCE) {
+        // 150绫冲唴鏈仠杞︼紝涓嶅悎鏍�
+        DEBUG("鍋滆溅璺濈瓒呮爣锛岄潬杈瑰仠杞︾粨鏉�");
+        AddExamFault(33, rtkTime);
+        return false;
+    }
 
-static void PlayTTSTimeout(union sigval sig)
-{
-    AppTimer_delete(PlayTTSTimeout);
-
-    ttsPlayEnd = 1;
+    return true;
 }
diff --git a/lib/src/main/cpp/test_items2/stop_car.h b/lib/src/main/cpp/test_items2/stop_car.h
index 4519ef0..89619d7 100644
--- a/lib/src/main/cpp/test_items2/stop_car.h
+++ b/lib/src/main/cpp/test_items2/stop_car.h
@@ -7,10 +7,7 @@
 
 #include "../driver_test.h"
 
-void StartStopCarExam(std::string tts);
-int ExecuteStopCarExam(road_t &road, const car_model *car,
-                       LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime);
-void TerminateStopCarExam(void);
-void StopCarTTSDone(int id);
+void StartStopCarExam(void);
+bool TestStopCar(road_exam_map &RoadMap, int roadIndex, const car_model *car, int moveDirect, const struct RtkTime *rtkTime);
 
 #endif //MYAPPLICATION2_STOP_CAR_H

--
Gitblit v1.8.0