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/stop_car.cpp |  251 ++++++++++++++++----------------------------------
 1 files changed, 81 insertions(+), 170 deletions(-)

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;
 }

--
Gitblit v1.8.0