From 4bd08f0355b6b2cf3c027202d5ad301b4e182953 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期五, 31 三月 2023 17:16:22 +0800
Subject: [PATCH] 科目二修改

---
 lib/src/main/cpp/test_items/stop_and_start.cpp |  314 ++++++++++++++++++++++++----------------------------
 1 files changed, 146 insertions(+), 168 deletions(-)

diff --git a/lib/src/main/cpp/test_items/stop_and_start.cpp b/lib/src/main/cpp/test_items/stop_and_start.cpp
index 7639775..0037350 100644
--- a/lib/src/main/cpp/test_items/stop_and_start.cpp
+++ b/lib/src/main/cpp/test_items/stop_and_start.cpp
@@ -2,6 +2,21 @@
 // Created by YY on 2019/10/31.
 //
 
+//                         |9
+//                         |
+//                         |
+//                         |
+//                         |
+//       7-----------------|8
+//       6_________________|5
+//       3_________________|4
+//                         |
+//       2-----------------|1
+//                         |
+//                         |
+//                         |
+//                         |0
+
 #include <cstdlib>
 #include <vector>
 #include <cmath>
@@ -21,7 +36,7 @@
 using namespace std;
 
 
-const uint32_t STOP_CAR_TIME = D_SEC(1);
+
 
 const double EPSILON = 1e-3;
 
@@ -29,62 +44,66 @@
 
 static PointF stopPoint;
 
-static int mapIndex = 0;
-static int prevMoveDirect;
-static uint32_t stopTimepoint = 0;
-static bool stopCar = false;
-static uint32_t stopCarTime;
+static bool check1 = false;
+
+static bool stopConfirm;
+static bool restartComplete = false;
 static bool occurCrashRedLine = false;
-static bool slideLongDistance = false;
+
 static bool slideNormalDistance = false;
 static bool reportSlideFault = false;
-static bool reportStartTimeout = false;
 static bool handBreakActive = false;
-static bool CrashRedLine(const Polygon *map, const car_model *car);
-static double DistanceOfHead2Stopline(const Polygon *map, const car_model *car);
-static double DistanceOfTire2Edge(const Polygon *map, const car_model *car);
-static bool ExitTestArea(const Polygon *map, const car_model *car);
 
-void StartSAS(int index, const Polygon *map, const car_model *car, int moveDirect, const struct RtkTime *rtkTime)
+static bool CrashRedLine(prime_t &prime);
+static double DistanceOfHead2Stopline(prime_t &prime);
+static double DistanceOfTire2Edge(prime_t &prime);
+static bool ExitTestArea(prime_t &prime);
+
+void StartSAS(prime_t &prime)
 {
-    double yawEdge = YawOf(map->point[8], map->point[0]);
-
-    if (moveDirect < 0 || DeltaYaw(car->yaw, yawEdge) >= 90.0) {
-        testing = false;
-        return;
-    }
-
     DEBUG("杩涘叆鍧¤捣椤圭洰");
 
     testing = true;
-    mapIndex = index;
-    prevMoveDirect = moveDirect;
-
-    if (moveDirect == 0) {
-        stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-    }
-
+    stopConfirm = false;
+    restartComplete = false;
     occurCrashRedLine = false;
-    stopCar = false;
-    slideLongDistance = false;
+    check1 = false;
     slideNormalDistance = false;
     reportSlideFault = false;
-    reportStartTimeout = false;
     handBreakActive = false;
 
-    MA_EnterMap(mapIndex, MAP_TYPE_STOP_START, 1);
+    MA_EnterMap(prime.curr_exam_map.map_idx, MAP_TYPE_UPHILL, 1);
 }
 
-int TestSAS(const Polygon *map, const car_model *car, const car_model *carPrev, double speed, int moveDirect, const struct RtkTime *rtkTime)
+static void StoppingTimeout(apptimer_var_t val) {
+    // 璧锋鏃堕棿瓒呰繃30绉掞紝涓嶅悎鏍�
+    AddExamFault(20303);
+    DEBUG("璧锋鏃堕棿瓒呰繃30绉�");
+}
+
+static void StopConfirm(apptimer_var_t val) {
+    stopConfirm = true;
+}
+
+void MotionChange(move_status_t mv)
+{
+    AppTimer_delete(StopConfirm);
+
+    if (mv == STOP) {
+        AppTimer_add(StopConfirm, D_SEC(1));
+    } else {
+
+    }
+}
+
+int TestSAS(prime_t &prime)
 {
     static double distanceToStopLine = 0, distanceToEdge = 0;
-    if (!testing)
-        return 0;
 
-    if (CrashRedLine(map, car)) {
+    if (CrashRedLine(prime)) {
         // 杞﹁疆鍘嬬嚎锛屼笉鍚堟牸
         if (!occurCrashRedLine) {
-            AddExamFault(10116, rtkTime);
+            AddExamFault(10116);
             DEBUG("杞﹁疆鍘嬬嚎");
         }
         occurCrashRedLine = true;
@@ -92,158 +111,125 @@
         occurCrashRedLine = false;
     }
 
-    if (ExitTestArea(map, car)) {
-        // 椹剁娴嬭瘯鍖�
-        if (!stopCar) {
-            // 涓嶅仠杞︾洿鎺ョ寮�
-            AddExamFault(10103, rtkTime);
-        }
-        testing = false;
-    }
+    // 妫�娴嬪埌鍋滆溅
+    if (prime.pMotion->move == STOP && stopConfirm) {
+        if (!check1) {
+            check1 = true;
+            // 瀛樺偍鍋滄鐐�
+            stopPoint = prime.pModeling->base_point;
+            // 寮�濮嬪仠杞﹁鏃�
+            AppTimer_delete(StoppingTimeout);
+            AppTimer_add(StoppingTimeout, examParam.ramp_start_car_limit_time);
 
-    if (prevMoveDirect != moveDirect) {
-        if (moveDirect == 0) {
-            stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-        } else if (stopCar && !handBreakActive) {
-            // 妫�鏌ユ槸鍚︽媺浣忔墜鍒�
-            handBreakActive = true;
-            AddExamFault(20306, rtkTime);
-            DEBUG("娌℃媺鎵嬪埞");
-        }
-        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 && !stopCar) {
-            // 杩欓噷鍒ゆ柇鍋滆溅鐘舵��
-            stopCar = true;
-            stopCarTime = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
-
-            stopPoint = car->carXY[car->body[0]];
-
-            distanceToStopLine = DistanceOfHead2Stopline(map, car);
-            distanceToEdge = DistanceOfTire2Edge(map, car);
+            // 妫�鏌ヨ溅澶村拰鍋滆溅甯︾殑璺濈
+            distanceToStopLine = DistanceOfHead2Stopline(prime);
+            distanceToEdge = DistanceOfTire2Edge(prime);
 
             DEBUG("DIS1 = %f  DIS2 = %f", distanceToStopLine, distanceToEdge);
 
             if (distanceToStopLine > examParam.ramp_stoppoint_red_distance) {
                 // 璺濈鍋滄绾垮墠鍚庤秴鍑�50鍘樼背
-                AddExamFault(20301, rtkTime);
+                AddExamFault(20301);
                 DEBUG("璺濈鍋滄绾垮墠鍚庤秴鍑�50鍘樼背锛屼笉鍚堟牸");
             } else if (fabs(distanceToStopLine) > EPSILON) {
                 // 鍓嶄繚闄╂病鏈変綅浜庡仠姝㈠甫鍐咃紝浣嗘病鏈夎秴鍑�50鍘樼背锛屾墸10鍒�
-                AddExamFault(20304, rtkTime);
+                AddExamFault(20304);
                 DEBUG("鍓嶄繚闄╂病鏈変綅浜庡仠姝㈠甫鍐咃紝浣嗘病鏈夎秴鍑�50鍘樼背");
             }
 
             if (distanceToEdge > examParam.ramp_edge_red_distance) {
                 // 璺濈杈圭嚎瓒呭嚭50鍘樼背,涓嶅悎鏍�
-                AddExamFault(20302, rtkTime);
+                AddExamFault(20302);
                 DEBUG("璺濈杈圭嚎瓒呭嚭50鍘樼背");
             } else if (distanceToEdge > examParam.ramp_edge_yellow_distance) {
                 // 璺濈杈圭嚎瓒呭嚭30鍘樼背锛屾墸10鍒�
-                AddExamFault(20305, rtkTime);
+                AddExamFault(20305);
                 DEBUG("璺濈杈圭嚎瓒呭嚭30鍘樼背");
             }
         }
 
-        if (stopCar && !handBreakActive && ReadCarStatus(HAND_BREAK) == BREAK_ACTIVE) {
+        // 鍋滆溅鍚庯紝妫�鏌ユ墜鍒规媺璧锋儏鍐�
+        if (!handBreakActive && ReadCarStatus(HAND_BREAK) == BREAK_ACTIVE) {
             handBreakActive = true;
         }
     }
 
-    if (!stopCar) {
-        // 璺濈妫�娴�
-            vector<double> dtox;
-            vector<Line> line_set;
-            Line distance_line;
+    if (prime.pMotion->move != STOP && stopConfirm) {
+        // 杞﹁締浠庡仠姝㈢姸鎬佸啀娆$Щ鍔�
+        double juli = DistanceOf(prime.pModeling->base_point, stopPoint);
 
-            MakeLine(&distance_line, &map->point[0], &map->point[8]);
-            line_set.push_back(distance_line);
-            DistanceOfTire2X(dtox, car, line_set);
-            MA_SendDistance(dtox[0], dtox[1]);
-    } else {
-        MA_SendDistance(distanceToStopLine, distanceToEdge);
-    }
-
-    // 鍒ゆ柇璧锋鍚庢粦鐘舵��
-    if (stopCar) {
-        if (IntersectionOfLine(map->point[4], stopPoint, car->carXY[car->axial[AXIAL_FRONT]]) == 1) {
-            // 鍙戠敓鍚庢粦
-            double slideDistance = DistanceOf(stopPoint, car->carXY[car->axial[AXIAL_FRONT]]);
-
-            if (slideDistance > examParam.ramp_slide_yellow_distance) {
+        if (juli > examParam.ramp_slide_yellow_distance) {
+            double deg = YawOf(stopPoint, prime.pModeling->base_point);
+            deg = fabs(prime.pModeling->yaw - deg);
+            if (deg > 180) {
+                deg = 360 - deg;
+            }
+            if (deg < 90) {
+                // 杞﹁締涓婂潯
+                if (!restartComplete) {
+                    restartComplete = true;
+                    AppTimer_delete(StoppingTimeout);
+                    if (slideNormalDistance && !reportSlideFault) {
+                        // 鍚庢粦瓒呰繃10鍘樼背锛屼絾娌¤秴杩�30鍘樼背
+                        DEBUG("鍚庢粦瓒呰繃10鍘樼背锛屼絾娌¤秴杩�30鍘樼背");
+                        reportSlideFault = true;
+                        AddExamFault(10204);
+                    }
+                    if (!handBreakActive) {
+                        // 妫�鏌ユ槸鍚︽媺浣忔墜鍒�
+                        DEBUG("娌℃媺鎵嬪埞");
+                        handBreakActive = true;
+                        AddExamFault(20306);
+                    }
+                }
+            } else {
+                // 杞﹁締鍚庢粦
                 slideNormalDistance = true;
-            }
-
-            if (slideDistance > examParam.ramp_slide_red_distance && !slideLongDistance && !reportSlideFault) {
-                // 鍚庢粦瓒呰繃30鍘樼背, 涓嶅悎鏍�
-                AddExamFault(10106, rtkTime);
-                DEBUG("鍚庢粦瓒呰繃30鍘樼背");
-                slideLongDistance = true;
-                reportSlideFault = true;
-            }
-        }
-
-
-        if (!reportStartTimeout && (IntersectionOfLine(map->point[4], stopPoint, car->carXY[car->axial[AXIAL_FRONT]]) != -1 ||
-                DistanceOf(stopPoint, car->carXY[car->axial[AXIAL_FRONT]]) < 0.1)) {
-            if (TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10) - stopCarTime > examParam.ramp_start_car_limit_time) {
-                // 璧锋鏃堕棿瓒呰繃30绉掞紝涓嶅悎鏍�
-                AddExamFault(20303, rtkTime);
-                DEBUG("璧锋鏃堕棿瓒呰繃30绉�");
-                reportStartTimeout = true;
-            }
-        }
-
-        if (IntersectionOfLine(map->point[5], map->point[6], car->carXY[car->axial[AXIAL_REAR]]) == -1) {
-            // 杞﹀熬椹惰繃鍋滄鏉�
-            if (slideNormalDistance && !slideLongDistance && !reportSlideFault) {
-                reportSlideFault = true;
-                // 鍚庢粦瓒呰繃10鍘樼背锛屼絾娌¤秴杩�30鍘樼背
-                AddExamFault(10204, rtkTime);
-                DEBUG("鍚庢粦瓒呰繃10鍘樼背锛屼絾娌¤秴杩�30鍘樼背");
+                if (juli > examParam.ramp_slide_red_distance && !reportSlideFault) {
+                    // 鍚庢粦瓒呰繃30鍘樼背, 涓嶅悎鏍�
+                    DEBUG("鍚庢粦瓒呰繃30鍘樼背");
+                    reportSlideFault = true;
+                    AddExamFault(10106);
+                }
             }
         }
     }
 
-    if (!testing) {
-        MA_EnterMap(mapIndex, MAP_TYPE_STOP_START, 0);
+    if (ExitTestArea(prime)) {
+        // 椹剁娴嬭瘯鍖�
+        if (!stopConfirm) {
+            // 涓嶅仠杞︾洿鎺ョ寮�
+            AddExamFault(10103);
+        }
+        MA_EnterMap(prime.curr_exam_map.map_idx, MAP_TYPE_UPHILL, 0);
     }
 
     return testing ? 1 : 0;
 }
 
 // 杞﹁疆鏄惁鍘嬭竟绾�
-static bool CrashRedLine(const Polygon *map, const car_model *car)
+static bool CrashRedLine(prime_t &prime)
 {
     bool ret = false;
 
-    Line red_line;
-    int red_lines[2][2];
-    int red_line_num = 0;
+    int red_lines[][2] = {{0, 1}, {1, 4}, {4, 5}, {5, 8}, {8, 9}};
 
-    if (map->num == 10) {
-        red_lines[0][0] = 0;
-        red_lines[0][1] = 8;
-        red_lines[1][0] = 8;
-        red_lines[1][1] = 9;
-        red_line_num = 2;
-    } else {
-        red_lines[0][0] = 0;
-        red_lines[0][1] = 8;
-        red_line_num = 1;
-    }
 
     Line frontAxle, rearAxle;
 
-    MakeLine(&frontAxle, &car->carXY[car->left_front_tire[TIRE_OUTSIDE]], &car->carXY[car->right_front_tire[TIRE_OUTSIDE]]);
-    MakeLine(&rearAxle, &car->carXY[car->left_rear_tire[TIRE_OUTSIDE]], &car->carXY[car->right_rear_tire[TIRE_OUTSIDE]]);
+    // 浠呯湅杞﹁疆澶栦晶
+    MAKE_LINE(frontAxle, prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]],
+              prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]]);
+    MAKE_LINE(rearAxle, prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_rear_tire[TIRE_OUTSIDE]],
+              prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_rear_tire[TIRE_OUTSIDE]]);
 
-    for (int i = 0; i < red_line_num; ++i) {
-        MakeLine(&red_line, &map->point[red_lines[i][0]], &map->point[red_lines[i][1]]);
+    for (int i = 0; i < sizeof(red_lines) / sizeof(red_lines[0]); ++i) {
+        Line red_line;
+        MAKE_LINE(red_line, prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[red_lines[i][0]],
+                  prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[red_lines[i][1]]);
+
         if (IntersectionOf(red_line, frontAxle) == GM_Intersection ||
-                IntersectionOf(red_line, rearAxle) == GM_Intersection) {
+            IntersectionOf(red_line, rearAxle) == GM_Intersection) {
             ret = true;
             break;
         }
@@ -252,28 +238,21 @@
     return ret;
 }
 
-static double DistanceOfHead2Stopline(const Polygon *map, const car_model *car)
+static double DistanceOfHead2Stopline(prime_t &prime)
 {
     double dis = 0.0;
 
-    int rel1 = IntersectionOfLine(map->point[4], map->point[3], car->carXY[car->body[0]]);
-    int rel2 = IntersectionOfLine(map->point[5], map->point[6], car->carXY[car->body[0]]);
+    Line upper_edge, lower_edge;
 
-    DEBUG("%d %d %f, %f", car->body[0], car->axial[AXIAL_FRONT], car->carXY[car->body[0]].X, car->carXY[car->body[0]].Y);
-    DEBUG("rel1 %d rel2 %d", rel1, rel2);
+    MAKE_LINE(upper_edge, prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[5],
+              prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[6]);
+    MAKE_LINE(lower_edge, prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[4],
+              prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[3]);
 
-    if (rel1 == 1) {
-        Line line1;
-
-        MakeLine(&line1, &map->point[4], &map->point[3]);
-
-        dis = DistanceOf(car->carXY[car->body[0]], line1);
-    } else if (rel2 == -1) {
-        Line line2;
-
-        MakeLine(&line2, &map->point[5], &map->point[6]);
-
-        dis = DistanceOf(car->carXY[car->body[0]], line2);
+    if (IntersectionOfLine(prime.pModeling->points[prime.pModel->axial[AXIAL_FRONT]], upper_edge) == REL_POS_RIGHT) {
+        dis = DistanceOf(prime.pModeling->points[prime.pModel->axial[AXIAL_FRONT]], upper_edge);
+    } else if (IntersectionOfLine(prime.pModeling->points[prime.pModel->axial[AXIAL_FRONT]], lower_edge) == REL_POS_LEFT) {
+        dis = DistanceOf(prime.pModeling->points[prime.pModel->axial[AXIAL_FRONT]], lower_edge);
     }
 
     DEBUG("DistanceOfHead2Stopline dis %f", dis);
@@ -281,28 +260,27 @@
     return dis;
 }
 
-static double DistanceOfTire2Edge(const Polygon *map, const car_model *car)
+static double DistanceOfTire2Edge(prime_t &prime)
 {
     Line edge;
 
-    MakeLine(&edge,  &map->point[0], &map->point[8]);
+    MAKE_LINE(edge, prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[0],
+              prime.pMap->uphill_map[prime.curr_exam_map.map_idx].map[8]);
 
-    double l1 = DistanceOf(car->carXY[car->right_front_tire[TIRE_OUTSIDE]], edge);
+    double l1 = DistanceOf(prime.pModeling->points[prime.pModel->right_front_tire[TIRE_OUTSIDE]], edge);
 
-    double l2 = DistanceOf(car->carXY[car->right_rear_tire[TIRE_OUTSIDE]], edge);
-
-//    return (l1+l2)/2.0;
+    double l2 = DistanceOf(prime.pModeling->points[prime.pModel->right_rear_tire[TIRE_OUTSIDE]], edge);
 
     return MAX(l1, l2);     // 鍙栨渶杩滅殑
 }
 
 // 鏁翠釜杞﹁締閮借椹剁璇ユ祴璇曞尯鍩�
-static bool ExitTestArea(const Polygon *map, const car_model *car)
+static bool ExitTestArea(prime_t &prime)
 {
     // 鍏ㄨ溅閮介渶涓嶅湪鍦板浘涓�
     bool ret = false;
 
-    Polygon carBody, map2;
+    /*Polygon carBody, map2;
     PointF vPoint = Calc3Point(map->point[8], map->point[0], DistanceOf(map->point[8], map->point[7]), 'R');
     PointF vPoint2;
 
@@ -329,6 +307,6 @@
     }
 
     free(carBody.point);
-    free(map2.point);
+    free(map2.point);*/
     return ret;
 }

--
Gitblit v1.8.0