From 27fc91fbe8f88b6885356e68828cfe1ce1db7601 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期三, 28 二月 2024 09:53:13 +0800
Subject: [PATCH] 坐标

---
 lib/src/main/cpp/test_items/area_exam.cpp |  463 ++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 353 insertions(+), 110 deletions(-)

diff --git a/lib/src/main/cpp/test_items/area_exam.cpp b/lib/src/main/cpp/test_items/area_exam.cpp
index bed7a7c..a005b7f 100644
--- a/lib/src/main/cpp/test_items/area_exam.cpp
+++ b/lib/src/main/cpp/test_items/area_exam.cpp
@@ -3,65 +3,158 @@
 //
 
 #include <cstdlib>
+#include <tuple>
+#include <map>
+
 #include "area_exam.h"
 #include "../test_common/car_sensor.h"
 #include "../driver_test.h"
 #include "../jni_log.h"
 #include "park_bottom.h"
-#include "stop_and_start.h"
+#include "uphill.h"
 #include "park_edge.h"
 #include "driving_curve.h"
-#include "turn_a90.h"
+#include "right_corner.h"
 #include "../utils/xconvert.h"
 #include "../common/apptimer.h"
 #include "../test_common/odo_graph.h"
 #include "../test_common/Geometry.h"
 #include "../common/observer.h"
+#include "../native-lib.h"
 
 #define DEBUG(fmt, args...)     LOGD("<area_exam> <%s>: " fmt, __func__, ##args)
 
-ilovers::Observer<std::function<void(move_status_t)>> CarMoveEvent;
+enum class ProximityStatus {
+    Near,
+    Bounce,
+    Far
+};
 
-static bool ProximityArea(Line &base_line, Line &line);
+ilovers::Observer<std::function<void(move_status_t, move_status_t, double)>> CarMoveEvent;
+ilovers::Observer<std::function<void(int, int, double)>> ShiftEvent;
+
+static void CheckProximity(prime_t  &prime, Line &base_line, Line &line, int this_id);
 static bool CrossingStartLine(Line &trace, Line &start_line);
 static void ProximityReminders(prime_t &prime);
 static void DetectCarMove(prime_t &prime);
+static void DetectShift(prime_t &prime);
+static void EnterMap(prime_t &prime);
+static void ExitMap(prime_t &prime);
 
 void AreaExam(prime_t &prime)
 {
-    switch (prime.curr_exam_map.type) {
-        case MAP_TYPE_PARK_BUTTOM:
-            break;
-        case MAP_TYPE_PARK_EDGE:
-            break;
-        case MAP_TYPE_TURN_90:
-            break;
-        case MAP_TYPE_UPHILL:
-            break;
-        case MAP_TYPE_CURVE:
-            break;
-        default:
-            if (EnterMap()) {
-
-            }
-            break;
+    if (prime.prev_modeling_index == -1 || prime.curr_modeling_index == -1) {
+        return;
     }
+    DEBUG("--------------> %d", __LINE__);
+    DetectShift(prime);
+    DEBUG("--------------> %d", __LINE__);
     DetectCarMove(prime);
+    DEBUG("--------------> %d", __LINE__);
+    ProximityReminders(prime);
+    DEBUG("--------------> %d", __LINE__);
+    EnterMap(prime);
+    DEBUG("--------------> %d", __LINE__);
+    TestDrivingCurve(prime);
+    DEBUG("--------------> %d", __LINE__);
+    TestParkBottom(prime);
+    DEBUG("--------------> %d", __LINE__);
+    TestParkEdge(prime);
+    DEBUG("--------------> %d", __LINE__);
+    TestUphill(prime);
+    DEBUG("--------------> %d", __LINE__);
+    TestRightCorner(prime);
+    DEBUG("--------------> %d", __LINE__);
+    ExitMap(prime);
+    DEBUG("--------------> %d", __LINE__);
 }
 
+// 妫�鏌ユ崲鎸★紝濡傚仠杞﹀叆搴撱�佸�掕溅寮�濮嬬瓑鍔ㄤ綔锛岄渶瑕佸湪鎸′綅鍙樻崲鏃舵娴嬶紝鍚屾椂闇�鑰冭檻椹鹃┒鍛樹竴娆℃崲鎸′笉杩涳紝鍋滃湪鍘熷湴鍐嶆鎿嶄綔鐨勬儏鍐�
+static void DetectShift(prime_t &prime)
+{
+    static int prevGear = prime.sensor.gear;
+    static double odo = prime.odo;          // 璁板綍杩欎釜鎸′綅涓嬭椹剁殑璺濈
+
+    if (prime.sensor.gear != prevGear) {
+        if (prime.odo - odo > 1) {
+
+        }
+        ShiftEvent.Notify(prime.sensor.gear, prevGear, prime.odo - odo);
+        prevGear = prime.sensor.gear;
+        odo = prime.odo;
+    }
+}
+
+static bool stopTimeout = false;
+
+static void StoppedTimeout(apptimer_var_t val) {
+    stopTimeout = true;
+}
+
+// 澶勭悊鍚勪釜椤圭洰鐨勮秴鏃跺仠杞︼紙鍋滀笅鏃跺拰鍐嶆鍚姩鏃讹紝鎸′綅鏄竴鑷寸殑锛�
 static void DetectCarMove(prime_t &prime)
 {
-    static move_status_t prevMove = STOP;
+    static double odo = prime.odo;
+    static int gearWhenStop = GEAR_N;
+    static move_status_t prevMove = prime.pMotion->move;
     if (prime.pMotion->move != prevMove) {
         // Notify
-        CarMoveEvent.Notify(prime.pMotion->move);
+        DEBUG("琛岄┒鐘舵�佹敼鍙� %d", prime.pMotion->move);
+        CarMoveEvent.Notify(prime.pMotion->move, prevMove, prime.odo - odo);
+
+        AppTimer_delete(StoppedTimeout);
+        if (prime.pMotion->move == STOP) {
+            gearWhenStop = prime.sensor.gear;
+            switch (prime.examing_area.type) {
+                case MAP_TYPE_PARK_BUTTOM:
+                    AppTimer_add(StoppedTimeout, prime.examParam.park_bottom_pause_criteria);
+                    break;
+                case MAP_TYPE_PARK_EDGE:
+                    AppTimer_add(StoppedTimeout, prime.examParam.park_edge_pause_criteria);
+                    break;
+                case MAP_TYPE_RIGHT_CORNER:
+                    AppTimer_add(StoppedTimeout, prime.examParam.turn_a90_pause_criteria);
+                    break;
+                case MAP_TYPE_CURVE:
+                    AppTimer_add(StoppedTimeout, prime.examParam.curve_pause_criteria);
+                    break;
+                case MAP_TYPE_UPHILL:
+                    break;
+                default:break;
+            }
+        } else {
+            if (stopTimeout && ((prime.sensor.gear == GEAR_R) == (gearWhenStop == GEAR_R))) {
+                // 鍋滆溅瓒呮椂
+                switch (prime.examing_area.type) {
+                    case MAP_TYPE_PARK_BUTTOM:
+                        // 鍋滆溅瓒�2绉掞紝姣忔鎵�5鍒�
+                        AddExamFault(20106);
+                        break;
+                    case MAP_TYPE_PARK_EDGE:
+                        AddExamFault(20406);
+                        break;
+                    case MAP_TYPE_RIGHT_CORNER:
+                        AddExamFault(20703);
+                        break;
+                    case MAP_TYPE_CURVE:
+                        // 鍋滆溅瓒�2绉掞紝涓嶅悎鏍�
+                        AddExamFault(20602);
+                        break;
+                    case MAP_TYPE_UPHILL:
+                        break;
+                    default:break;
+                }
+            }
+        }
+        stopTimeout = false;
         prevMove = prime.pMotion->move;
+        odo = prime.odo;
     }
 }
 
-void RegisterCarMoveObserver(void (*ptr)(move_status_t))
+int RegisterCarMoveObserver(std::function<void(move_status_t, move_status_t, double)> ob)
 {
-    CarMoveEvent.Connect(ptr);
+    return CarMoveEvent.Connect(ob);
 }
 
 void UnregisterCarMoveObserver(int handle)
@@ -69,163 +162,313 @@
     CarMoveEvent.Disconnect(handle);
 }
 
-void EnterMap(prime_t &prime)
+int RegisterShiftObserver(std::function<void(int, int, double)> ob)
 {
-    if (prime.curr_exam_map.type != 0) {
+    return ShiftEvent.Connect(ob);
+}
+
+void UnregisterShiftObserver(int handle)
+{
+    ShiftEvent.Disconnect(handle);
+}
+
+static void EnterMap(prime_t &prime)
+{
+    if (prime.examing_area.type != 0) {
         return;
     }
 
-    if (prime.prev_modeling_index == -1 || prime.curr_modeling_index == -1) {
-        return;
-    }
+    DEBUG("--------------> %d", __LINE__);
 
-    PointF &lp1 = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]];
-    PointF &lp2 = prime.pModeling[prime.prev_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]];
-    PointF &rp1 = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]];
-    PointF &rp2 = prime.pModeling[prime.prev_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]];
+    DEBUG("1. %d", prime.pModeling[prime.curr_modeling_index].points.size());
+    DEBUG("2. %d", prime.pModeling[prime.prev_modeling_index].points.size());
+
+    DEBUG("3. %d", prime.pModel->left_front_tire[TIRE_OUTSIDE]);
+    DEBUG("4. %d", prime.pModel->right_front_tire[TIRE_OUTSIDE]);
+
+
+    PointF lp1 = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]];
+    PointF lp2 = prime.pModeling[prime.prev_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]];
+    PointF rp1 = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]];
+    PointF rp2 = prime.pModeling[prime.prev_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]];
 
     Line left_trace, right_trace;
-
+    DEBUG("--------------> %d", __LINE__);
     MAKE_LINE(left_trace, lp1, lp2);
     MAKE_LINE(right_trace, rp1, rp2);
 
     Line start_line;
-    for (int i = 0; i < prime.pMap->park_button_map.size(); ++i) {
-        MAKE_LINE(start_line, prime.pMap->park_button_map[i].map[1], prime.pMap->park_button_map[i].map[0]);
+    DEBUG("鍊掑簱> %d", std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps).size());
+    for (int i = 0; i < std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps).size(); ++i) {
+        MAKE_LINE(start_line, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[i].points[1], std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[i].points[0]);
         if (CrossingStartLine(left_trace, start_line)) {
-            prime.curr_exam_map.type = MAP_TYPE_PARK_BUTTOM;
-            prime.curr_exam_map.map_idx = i;
+            prime.examing_area.type = MAP_TYPE_PARK_BUTTOM;
+            prime.examing_area.idx = i;
             StartParkBottom(prime);
             return;
         }
-        MAKE_LINE(start_line, prime.pMap->park_button_map[i].map[7], prime.pMap->park_button_map[i].map[6]);
+        MAKE_LINE(start_line, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[i].points[7], std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[i].points[6]);
         if (CrossingStartLine(left_trace, start_line)) {
-            prime.curr_exam_map.type = MAP_TYPE_PARK_BUTTOM;
-            prime.curr_exam_map.map_idx = i;
+            prime.examing_area.type = MAP_TYPE_PARK_BUTTOM;
+            prime.examing_area.idx = i;
             StartParkBottom(prime);
             return;
         }
     }
-
-    for (int i = 0; i < prime.pMap->park_edge_map.size(); ++i) {
-        MAKE_LINE(start_line, prime.pMap->park_edge_map[i].map[1], prime.pMap->park_edge_map[i].map[0]);
+    DEBUG("渚ф柟> %d", std::get<MAP_TYPE_PARK_EDGE>(prime.maps).size());
+    for (int i = 0; i < std::get<MAP_TYPE_PARK_EDGE>(prime.maps).size(); ++i) {
+        MAKE_LINE(start_line, std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[i].points[1], std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[i].points[0]);
         if (CrossingStartLine(left_trace, start_line)) {
-            prime.curr_exam_map.type = MAP_TYPE_PARK_EDGE;
-            prime.curr_exam_map.map_idx = i;
+            prime.examing_area.type = MAP_TYPE_PARK_EDGE;
+            prime.examing_area.idx = i;
+            StartParkEdge(prime);
             return;
         }
+    }
+    DEBUG("涓婂潯> %d", std::get<MAP_TYPE_UPHILL>(prime.maps).size());
+    for (int i = 0; i < std::get<MAP_TYPE_UPHILL>(prime.maps).size(); ++i) {
+        MAKE_LINE(start_line, std::get<MAP_TYPE_UPHILL>(prime.maps)[i].points[0], std::get<MAP_TYPE_UPHILL>(prime.maps)[i].points[10]);
+        if (CrossingStartLine(left_trace, start_line)) {
+            prime.examing_area.type = MAP_TYPE_UPHILL;
+            prime.examing_area.idx = i;
+            StartUphill(prime);
+            return;
+        }
+    }
+    DEBUG("鏇茬嚎> %d", std::get<MAP_TYPE_CURVE>(prime.maps).size());
+    for (int i = 0; i < std::get<MAP_TYPE_CURVE>(prime.maps).size(); ++i) {
+        MAKE_LINE(start_line, std::get<MAP_TYPE_CURVE>(prime.maps)[i].right_start_point, std::get<MAP_TYPE_CURVE>(prime.maps)[i].left_start_point);
+        if (CrossingStartLine(left_trace, start_line)) {
+            prime.examing_area.type = MAP_TYPE_CURVE;
+            prime.examing_area.idx = i;
+            StartDrivingCurve(prime);
+            return;
+        }
+    }
+    DEBUG("鐩磋> %d", std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps).size());
+    for (int i = 0; i < std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps).size(); ++i) {
+        MAKE_LINE(start_line, std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)[i].points[0], std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)[i].points[1]);
+        if (CrossingStartLine(left_trace, start_line)) {
+            prime.examing_area.type = MAP_TYPE_RIGHT_CORNER;
+            prime.examing_area.idx = i;
+            StartRightCorner(prime);
+            return;
+        }
+    }
+}
+
+/****************************************
+ * 閫�鍑哄満鍦帮細鏉′欢鏄溅澶村拰鍥涜疆閮戒笉鍦ㄥ満鍦颁腑
+ * 濡傛灉褰撳墠娴嬭瘯椤圭洰鏈畬鎴愶紝瑕佹姤涓嶅悎鏍�
+ * @param prime
+ */
+static void ExitMap(prime_t &prime)
+{
+    if (prime.examing_area.type == MAP_TYPE_NONE) {
+        return;
     }
 
-    for (int i = 0; i < prime.pMap->uphill_map.size(); ++i) {
-        PointF vPoint = Calc3Point(prime.pMap->uphill_map[i].map[8], prime.pMap->uphill_map[i].map[0], DistanceOf(prime.pMap->uphill_map[i].map[8], prime.pMap->uphill_map[i].map[7]), 'R');
-        MAKE_LINE(start_line, prime.pMap->uphill_map[i].map[0], vPoint);
-        if (CrossingStartLine(left_trace, start_line)) {
-            prime.curr_exam_map.type = MAP_TYPE_UPHILL;
-            prime.curr_exam_map.map_idx = i;
-            return;
+    if (prime.examing_area.type == MAP_TYPE_CURVE) {
+        // 杞︾殑鍚庤疆鏄惁瓒婅繃缁撴潫绾挎垨鏄溅杈嗕笉鍦�2涓ぇ鍦嗚寖鍥村唴
+        PointF lp1 = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]];
+        PointF lp2 = prime.pModeling[prime.prev_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]];
+        PointF rp1 = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]];
+        PointF rp2 = prime.pModeling[prime.prev_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]];
+
+        Line left_trace, right_trace;
+
+        MAKE_LINE(left_trace, lp1, lp2);
+        MAKE_LINE(right_trace, rp1, rp2);
+
+        Line end_line;
+        MAKE_LINE(end_line, std::get<MAP_TYPE_CURVE>(prime.maps)[prime.examing_area.idx].right_end_point, std::get<MAP_TYPE_CURVE>(prime.maps)[prime.examing_area.idx].left_end_point);
+        if (CrossingStartLine(left_trace, end_line)) {
+            // 绂诲紑鍖哄煙
+            StopDrivingCurve(prime);
         }
-    }
-    for (int i = 0; i < prime.pMap->curve_map.size(); ++i) {
-        MAKE_LINE(start_line, prime.pMap->curve_map[i].right_start_point, prime.pMap->curve_map[i].left_start_point);
-        if (CrossingStartLine(left_trace, start_line)) {
-            prime.curr_exam_map.type = MAP_TYPE_CURVE;
-            prime.curr_exam_map.map_idx = i;
-            return;
+
+        if (DistanceOf(prime.pModeling[prime.curr_modeling_index].base_point, std::get<MAP_TYPE_CURVE>(prime.maps)[prime.examing_area.idx].front_half_big_circle_centre) > std::get<MAP_TYPE_CURVE>(prime.maps)[prime.examing_area.idx].front_half_big_circle_radius
+            && DistanceOf(prime.pModeling[prime.curr_modeling_index].base_point, std::get<MAP_TYPE_CURVE>(prime.maps)[prime.examing_area.idx].back_half_big_circle_centre) > std::get<MAP_TYPE_CURVE>(prime.maps)[prime.examing_area.idx].back_half_big_circle_radius) {
+            // 绂诲紑鍖哄煙
+            StopDrivingCurve(prime);
         }
-    }
-    for (int i = 0; i < prime.pMap->turn_a90_map.size(); ++i) {
-        MAKE_LINE(start_line, prime.pMap->turn_a90_map[i].map[0], prime.pMap->turn_a90_map[i].map[1]);
-        if (CrossingStartLine(left_trace, start_line)) {
-            prime.curr_exam_map.type = MAP_TYPE_TURN_90;
-            prime.curr_exam_map.map_idx = i;
-            return;
+    } else {
+        MakePolygon area({});
+        DEBUG("------------> %d", __LINE__);
+        switch (prime.examing_area.type) {
+            case MAP_TYPE_PARK_BUTTOM:
+                area.AddPoints({std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[0],
+                                std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[1],
+                                std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[2],
+                                std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[3],
+                                std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[4],
+                                std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[5],
+                                std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[6],
+                                std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[prime.examing_area.idx].points[7]});
+                break;
+            case MAP_TYPE_PARK_EDGE:
+                area.AddPoints({std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[0],
+                                std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[1],
+                                std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[2],
+                                std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[3],
+                                std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[4],
+                                std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[5],
+                                std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[6],
+                                std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[prime.examing_area.idx].points[7]});
+                break;
+            case MAP_TYPE_UPHILL:
+                area.AddPoints({std::get<MAP_TYPE_UPHILL>(prime.maps)[prime.examing_area.idx].points[0],
+                                std::get<MAP_TYPE_UPHILL>(prime.maps)[prime.examing_area.idx].points[9],
+                                std::get<MAP_TYPE_UPHILL>(prime.maps)[prime.examing_area.idx].points[11],
+                                std::get<MAP_TYPE_UPHILL>(prime.maps)[prime.examing_area.idx].points[10]});
+                break;
+            case MAP_TYPE_RIGHT_CORNER:
+                area.AddPoints({std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)[prime.examing_area.idx].points[0],
+                                std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)[prime.examing_area.idx].points[1],
+                                std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)[prime.examing_area.idx].points[2],
+                                std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)[prime.examing_area.idx].points[3],
+                                std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)[prime.examing_area.idx].points[4],
+                                std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)[prime.examing_area.idx].points[5]});
+                break;
+            default:
+                break;
         }
+
+        DEBUG("------------> %d", __LINE__);
+        int num = 0;
+
+        if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_front_tire[TIRE_OUTSIDE]],
+                           area.GetPolygon()) == GM_None) {
+            num++;
+        }
+        if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_front_tire[TIRE_OUTSIDE]],
+                           area.GetPolygon()) == GM_None) {
+            num++;
+        }
+        if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->left_rear_tire[TIRE_OUTSIDE]],
+                           area.GetPolygon()) == GM_None) {
+            num++;
+        }
+        if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->right_rear_tire[TIRE_OUTSIDE]],
+                           area.GetPolygon()) == GM_None) {
+            num++;
+        }
+        if (IntersectionOf(prime.pModeling[prime.curr_modeling_index].points[prime.pModel->body[prime.pModel->axial[AXIAL_FRONT]]],
+                           area.GetPolygon()) == GM_None) {
+            num++;
+        }
+        DEBUG("------------> %d", __LINE__);
+        if (num == 5) {
+            // 绂诲紑鍖哄煙
+            StopDrivingCurve(prime);
+            StopParkBottom(prime);
+            StopRightCorner(prime);
+            StopUphill(prime);
+            StopParkEdge(prime);
+        }
+        DEBUG("------------> %d", __LINE__);
     }
 }
 
 // 杞﹁疆椹惰繃绾匡紝涓旇溅澶翠綅浜庡彸渚�
 static bool CrossingStartLine(Line &trace, Line &start_line)
 {
-    PointF head = {.X = trace.X1, .Y = trace.Y1};
+    PointF head = trace.p1;
 
     if (IntersectionOf(trace, start_line) == GM_Intersection
-        && IntersectionOfLine(head, start_line) == RELATION_RIGHT) {
+        && IntersectionOfLine(head, start_line) == REL_POS_RIGHT) {
         return true;
     }
     return false;
 }
 
-void FarawayMap(prime_t &prime)
-{
-    if (prime.arriving_map.type != 0) {
-        PointF &car_head = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->axial[AXIAL_FRONT]];
-        PointF car_head_trend = PointExtend(car_head, 7, prime.pModeling->yaw);
-        Line car_head_line;
-        MAKE_LINE(car_head_line, car_head, car_head_trend);
-
-
-    }
-}
-
 static void ProximityReminders(prime_t &prime)
 {
-    if (prime.curr_exam_map.type != MAP_TYPE_NONE && prime.arriving_map.type != MAP_TYPE_NONE) {
+    if (prime.examing_area.type != MAP_TYPE_NONE)
         return;
+
+    DEBUG("----------------> %d", __LINE__);
+
+    DEBUG("test %d",std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps).size());
+    DEBUG("test %d",std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[0].points.size());
+    DEBUG("test %f,%f",std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[0].points[1].X, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[0].points[1].Y);
+    {
+        Line test;
+
+        MAKE_LINE(test, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[0].points[1], std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[0].points[0]);
+
+        DEBUG("test %f,%f - %f,%f",test.p1.X, test.p1.Y, test.p2.X, test.p2.Y);
     }
 
-    PointF &car_head = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->axial[AXIAL_FRONT]];
-    PointF car_head_trend = PointExtend(car_head, 6, prime.pModeling->yaw);
+    DEBUG("----------------> %d", __LINE__);
+    PointF car_head = prime.pModeling[prime.curr_modeling_index].points[prime.pModel->axial[AXIAL_FRONT]];
+    PointF car_head_trend = PointExtend(car_head, 8, prime.pModeling->yaw);
+    DEBUG("----------------> %d", __LINE__);
+
     Line car_head_line;
     MAKE_LINE(car_head_line, car_head, car_head_trend);
-
+    DEBUG("----------------> %d", __LINE__);
     Line start_line;
-    for (int i = 0; i < prime.pMap->park_button_map.size(); ++i) {  // 宸﹀彸2鏉℃帶鍒剁嚎閮藉彲浣滀负鍏ュ彛
-        MAKE_LINE(start_line, prime.pMap->park_button_map[i].map[1], prime.pMap->park_button_map[i].map[0]);
-
-        MAKE_LINE(start_line, prime.pMap->park_button_map[i].map[7], prime.pMap->park_button_map[i].map[6]);
-
+    for (int i = 0; i < std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps).size(); ++i) {  // 宸﹀彸2鏉℃帶鍒剁嚎閮藉彲浣滀负鍏ュ彛
+        MAKE_LINE(start_line, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[i].points[1], std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[i].points[0]);
+        CheckProximity(prime, car_head_line, start_line, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[i].id);
+        MAKE_LINE(start_line, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[i].points[7], std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[i].points[6]);
+        CheckProximity(prime, car_head_line, start_line, std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[i].id);
     }
-    for (int i = 0; i < prime.pMap->park_edge_map.size(); ++i) {
-        MAKE_LINE(start_line, prime.pMap->park_edge_map[i].map[1], prime.pMap->park_edge_map[i].map[0]);
+    for (int i = 0; i < std::get<MAP_TYPE_PARK_EDGE>(prime.maps).size(); ++i) {
+        MAKE_LINE(start_line, std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[i].points[1], std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[i].points[0]);
+        CheckProximity(prime, car_head_line, start_line, std::get<MAP_TYPE_PARK_EDGE>(prime.maps)[i].id);
     }
 
-    for (int i = 0; i < prime.pMap->uphill_map.size(); ++i) {
-        PointF vPoint = Calc3Point(prime.pMap->uphill_map[i].map[8], prime.pMap->uphill_map[i].map[0], DistanceOf(prime.pMap->uphill_map[i].map[8], prime.pMap->uphill_map[i].map[7]), 'R');
-        MAKE_LINE(start_line, prime.pMap->uphill_map[i].map[0], vPoint);
+    for (int i = 0; i < std::get<MAP_TYPE_UPHILL>(prime.maps).size(); ++i) {
+        MAKE_LINE(start_line, std::get<MAP_TYPE_UPHILL>(prime.maps)[i].points[0], std::get<MAP_TYPE_UPHILL>(prime.maps)[i].points[10]);
+        CheckProximity(prime, car_head_line, start_line, std::get<MAP_TYPE_UPHILL>(prime.maps)[i].id);
     }
-    for (int i = 0; i < prime.pMap->curve_map.size(); ++i) {
-        MAKE_LINE(start_line, prime.pMap->curve_map[i].right_start_point, prime.pMap->curve_map[i].left_start_point);
+    for (int i = 0; i < std::get<MAP_TYPE_CURVE>(prime.maps).size(); ++i) {
+        MAKE_LINE(start_line, std::get<MAP_TYPE_CURVE>(prime.maps)[i].right_start_point, std::get<MAP_TYPE_CURVE>(prime.maps)[i].left_start_point);
+        CheckProximity(prime, car_head_line, start_line, std::get<MAP_TYPE_CURVE>(prime.maps)[i].id);
     }
-    for (int i = 0; i < prime.pMap->turn_a90_map.size(); ++i) {
-        MAKE_LINE(start_line, prime.pMap->turn_a90_map[i].map[0], prime.pMap->turn_a90_map[i].map[1]);
+    for (int i = 0; i < std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps).size(); ++i) {
+        MAKE_LINE(start_line, std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)[i].points[0], std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)[i].points[1]);
+        CheckProximity(prime, car_head_line, start_line, std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)[i].id);
     }
 }
 
 // 鍒ゆ柇鏄惁鎺ヨ繎鍦哄湴鐨勮捣濮嬬嚎
 // 杞﹀ご瓒嬪娍绾挎槸鍚﹀拰鍏ュ彛绾跨浉浜�
-// 鍜屽叆鍙g嚎鐨勫す瑙�
-static bool ProximityArea(Line &base_line, Line &line)
+static void CheckProximity(prime_t  &prime, Line &base_line, Line &line, int this_id)
 {
-    PointF head = {.X = line.X1, .Y = line.Y1};
+    ProximityStatus status;
 
-    if (IntersectionOf(base_line, line) == GM_Intersection
-        && DistanceOf(head, base_line) > 1) {
-        double angle = AngleOfTowLine(base_line, line);
-        if (angle >= 240 && angle <= 300) {
-            return true;
+    if (CrossingStartLine(base_line, line)) {
+        PointF p1 = base_line.p1;
+        PointF p2 = base_line.p2;
+
+        // 澧炲姞璺濈锛岀敤浜庢秷闄ゆ祴閲忚宸甫鏉ョ殑涓嶇ǔ瀹�
+        if (DistanceOf(p1, line) > 0.5 && DistanceOf(p2, line) > 0.5) {
+            status = ProximityStatus::Near;
+        } else {
+            status = ProximityStatus::Bounce;
         }
+    } else {
+        status = ProximityStatus::Far;
     }
 
-    return false;
+    if (status == ProximityStatus::Near && prime.arriving_map != this_id) {
+        prime.arriving_map = this_id;
+        // 鎶ヨ闊虫彁绀�
+        PlayTTS("鍗冲皢鑰冭瘯", nullptr);
+    } else if (status == ProximityStatus::Far && prime.arriving_map == this_id) {
+        prime.arriving_map = -1;
+    }
 }
 
 void TerminateAreaExam(void)
 {
-    CurrExamMapIndex = -1;
+
 }
 
 void InitAreaExam(void)
 {
-    CurrExamMapIndex = -1;
     ResetOdo();
 }

--
Gitblit v1.8.0