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/driver_test.cpp |  567 ++++++++++++++++++++++++++++++--------------------------
 1 files changed, 303 insertions(+), 264 deletions(-)

diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp
index 1563f56..a85c306 100644
--- a/lib/src/main/cpp/driver_test.cpp
+++ b/lib/src/main/cpp/driver_test.cpp
@@ -15,6 +15,7 @@
 #include <numeric>
 #include <algorithm>
 #include <string>
+#include <tuple>
 
 #include "driver_test.h"
 #include "defs.h"
@@ -26,9 +27,9 @@
 #include "test_items/park_bottom.h"
 #include "test_items/park_edge.h"
 #include "test_items/error_list.h"
-#include "test_items/turn_a90.h"
+#include "test_items/right_corner.h"
 #include "test_items/driving_curve.h"
-#include "test_items/stop_and_start.h"
+#include "test_items/uphill.h"
 #include "master/comm_if.h"
 #include "utils/xconvert.h"
 #include "utils/num.h"
@@ -127,19 +128,13 @@
 static const char DEFAULT_CROSSING_TURN_BACK_TTS[] = "鍓嶆柟閫夋嫨鍚堥�傚湴鐐规帀澶�";
 static const char DEFAULT_CROSSING_TURN_UNKNOWN_TTS[] = "鍓嶆柟璺彛鍚粠鏁欑粌鎸囩ず";
 
-static bool ExamStart = false;
 static int ExamType;
 static bool reportSeatbeltEject;
 
 vector<ExamFault> ExamFaultList;
 static int examFaultIndex = 0;
 
-//static LIST_AREA_MAP AreaMapList;
-static area_map_t AreaMap;
-
 ilovers::semaphore sem(0);
-
-static road_exam_map RoadMap;
 
 static int exam_dummy_light;
 
@@ -152,8 +147,6 @@
 static bool engineRuning = false;
 const int ENGINE_MIN_ROTATE = 200;
 static bool engineStart = false;
-
-exam_param_t examParam;
 
 #define MOV_AVG_SIZE                1
 #define RTK_BUFFER_SIZE            100
@@ -177,19 +170,23 @@
 static void work_thread(void);
 static void UploadModeling(motion_t &motion, modeling_t &modeling);
 
+prime_t& GetPrime(void)
+{
+    return prime;
+}
+
 void DriverTestInit(void)
 {
-    ExamStart = false;
+    prime.examing = false;
+    prime.pMotion = &realtimeMotionStatus;
+    prime.pModeling = realtimeBodyModeling;
+    prime.pModel = &CarModel;
+
     SetExamParamDefault();
 
 //    CarModelList.clear();
 
 //    AreaMapList.clear();
-
-    RoadMap.roads.clear();
-    RoadMap.specialAreas.clear();
-    RoadMap.forbidLines.clear();
-    RoadMap.examScheme.clear();
 
     CarSensorInit();
 
@@ -201,97 +198,97 @@
 
 static void SetExamParamDefault(void)
 {
-    examParam.hold_start_key_limit_time = DEFAULT_START_KEY_HOLD_TIME;
-    examParam.curve_pause_criteria = DEFAULT_CURVE_PAUSE_TIME;
-    examParam.park_bottom_pause_criteria = DEFAULT_PARK_BOTTOM_PAUSE_TIME;
-    examParam.park_bottom_limit_time = DEFAULT_PARK_BOTTOM_FINISH_TIME;
-    examParam.park_edge_pause_criteria = DEFAULT_PART_EDGE_PAUSE_TIME;
-    examParam.park_edge_limit_time = DEFAULT_PARK_EDGE_FINISH_TIME;
-    examParam.turn_a90_pause_criteria = DEFAULT_TURN_A90_PAUSE_TIME;
+    prime.examParam.hold_start_key_limit_time = DEFAULT_START_KEY_HOLD_TIME;
+    prime.examParam.curve_pause_criteria = DEFAULT_CURVE_PAUSE_TIME;
+    prime.examParam.park_bottom_pause_criteria = DEFAULT_PARK_BOTTOM_PAUSE_TIME;
+    prime.examParam.park_bottom_limit_time = DEFAULT_PARK_BOTTOM_FINISH_TIME;
+    prime.examParam.park_edge_pause_criteria = DEFAULT_PART_EDGE_PAUSE_TIME;
+    prime.examParam.park_edge_limit_time = DEFAULT_PARK_EDGE_FINISH_TIME;
+    prime.examParam.turn_a90_pause_criteria = DEFAULT_TURN_A90_PAUSE_TIME;
 
-    examParam.ramp_stoppoint_red_distance = DEFAULT_RAMP_STOPPOINT_RED_DISTANCE;
-    examParam.ramp_edge_yellow_distance = DEFAULT_RAMP_EDGE_YELLOW_DISTANCE;
-    examParam.ramp_edge_red_distance = DEFAULT_RAMP_EDGE_RED_DISTANCE;
-    examParam.ramp_slide_yellow_distance = DEFAULT_RAMP_SLIDE_YELLOW_DISTANCE;
-    examParam.ramp_slide_red_distance = DEFAULT_RAMP_SLIDE_RED_DISTANCE;
-    examParam.ramp_start_car_limit_time = DEFAULT_RAMP_FINISH_TIME;
+    prime.examParam.ramp_stoppoint_red_distance = DEFAULT_RAMP_STOPPOINT_RED_DISTANCE;
+    prime.examParam.ramp_edge_yellow_distance = DEFAULT_RAMP_EDGE_YELLOW_DISTANCE;
+    prime.examParam.ramp_edge_red_distance = DEFAULT_RAMP_EDGE_RED_DISTANCE;
+    prime.examParam.ramp_slide_yellow_distance = DEFAULT_RAMP_SLIDE_YELLOW_DISTANCE;
+    prime.examParam.ramp_slide_red_distance = DEFAULT_RAMP_SLIDE_RED_DISTANCE;
+    prime.examParam.ramp_start_car_limit_time = DEFAULT_RAMP_FINISH_TIME;
 
-    examParam.road_slide_yellow_distance = DEFAULT_ROAD_SLIDE_YELLOW_DISTANCE;
-    examParam.road_slide_red_distance = DEFAULT_ROAD_SLIDE_RED_DISTANCE;
-    examParam.road_total_distance = DEFAULT_ROAD_MAX_DISTANCE;
-    examParam.road_max_speed = DEFAULT_ROAD_MAX_SPEED;
+    prime.examParam.road_slide_yellow_distance = DEFAULT_ROAD_SLIDE_YELLOW_DISTANCE;
+    prime.examParam.road_slide_red_distance = DEFAULT_ROAD_SLIDE_RED_DISTANCE;
+    prime.examParam.road_total_distance = DEFAULT_ROAD_MAX_DISTANCE;
+    prime.examParam.road_max_speed = DEFAULT_ROAD_MAX_SPEED;
 
-    examParam.gear_speed_table.resize(6);
-    for (int i = 0; i < examParam.gear_speed_table.size(); ++i) {
-        examParam.gear_speed_table[i].resize(2);
+    prime.examParam.gear_speed_table.resize(6);
+    for (int i = 0; i < prime.examParam.gear_speed_table.size(); ++i) {
+        prime.examParam.gear_speed_table[i].resize(2);
     }
-    examParam.gear_speed_table[0][0] = 0;
-    examParam.gear_speed_table[0][1] = 20;
-    examParam.gear_speed_table[1][0] = 5;
-    examParam.gear_speed_table[1][1] = 30;
-    examParam.gear_speed_table[2][0] = 15;
-    examParam.gear_speed_table[2][1] = 40;
-    examParam.gear_speed_table[3][0] = 25;
-    examParam.gear_speed_table[3][1] = 10000;
-    examParam.gear_speed_table[4][0] = 35;
-    examParam.gear_speed_table[4][1] = 10000;
-    examParam.gear_speed_table[5][0] = 45;
-    examParam.gear_speed_table[5][1] = 10000;
+    prime.examParam.gear_speed_table[0][0] = 0;
+    prime.examParam.gear_speed_table[0][1] = 20;
+    prime.examParam.gear_speed_table[1][0] = 5;
+    prime.examParam.gear_speed_table[1][1] = 30;
+    prime.examParam.gear_speed_table[2][0] = 15;
+    prime.examParam.gear_speed_table[2][1] = 40;
+    prime.examParam.gear_speed_table[3][0] = 25;
+    prime.examParam.gear_speed_table[3][1] = 10000;
+    prime.examParam.gear_speed_table[4][0] = 35;
+    prime.examParam.gear_speed_table[4][1] = 10000;
+    prime.examParam.gear_speed_table[5][0] = 45;
+    prime.examParam.gear_speed_table[5][1] = 10000;
 
-    examParam.gear_n_allow_time = DEFAULT_GEAR_N_TIME;
-    examParam.same_gear_min_time = DEFAULT_SAME_GEAR_HOLD_TIME;            // x绉掑唴锛屼笉鍏佽N->X->N->X缃悓涓�鎸′綅
-    examParam.gear_speed_error_cumulative_time = DEFAULT_GEAR_SPEED_ERROR_MAX_TIME;
-    examParam.road_pause_criteria = DEFAULT_ROAD_PAUSE_TIME;
-    examParam.continuous_change_lane_min_time = DEFAULT_CHANGE_LANE_MIN_TIME;
-    examParam.crash_dotted_line_cumulative_time = DEFAULT_CRASH_DOTTED_LINE_MAX_TIME;
-    examParam.turn_signal_min_advance = DEFAULT_TURN_SIGNAL_MIN_ADVANCE;
-    examParam.start_car_max_rpm = DEFAULT_START_CAR_MAX_RMP;
-    examParam.start_car_limit_distance = DEFAULT_START_CAR_DISTANCE;
-    examParam.open_door_drive_allow_distance = DEFAULT_START_CAR_OPEN_DOOR_DISTANCE;
+    prime.examParam.gear_n_allow_time = DEFAULT_GEAR_N_TIME;
+    prime.examParam.same_gear_min_time = DEFAULT_SAME_GEAR_HOLD_TIME;            // x绉掑唴锛屼笉鍏佽N->X->N->X缃悓涓�鎸′綅
+    prime.examParam.gear_speed_error_cumulative_time = DEFAULT_GEAR_SPEED_ERROR_MAX_TIME;
+    prime.examParam.road_pause_criteria = DEFAULT_ROAD_PAUSE_TIME;
+    prime.examParam.continuous_change_lane_min_time = DEFAULT_CHANGE_LANE_MIN_TIME;
+    prime.examParam.crash_dotted_line_cumulative_time = DEFAULT_CRASH_DOTTED_LINE_MAX_TIME;
+    prime.examParam.turn_signal_min_advance = DEFAULT_TURN_SIGNAL_MIN_ADVANCE;
+    prime.examParam.start_car_max_rpm = DEFAULT_START_CAR_MAX_RMP;
+    prime.examParam.start_car_limit_distance = DEFAULT_START_CAR_DISTANCE;
+    prime.examParam.open_door_drive_allow_distance = DEFAULT_START_CAR_OPEN_DOOR_DISTANCE;
 
-    examParam.prepare_tts = DEFAULT_PREPARE_TTS;
-    examParam.touch_leftfront_tts = DEFAULT_TOUCH_LEFT_FRONT;
-    examParam.touch_leftrear_tts = DEFAULT_TOUCH_LEFT_REAR;
-    examParam.touch_rightfront_tts = DEFAULT_TOUCH_RIGHT_FRONT;
-    examParam.touch_rightrear_tts = DEFAULT_TOUCH_RIGHT_REAR;
-    examParam.start_engine_tts = DEFAULT_START_ENGINE;
+    prime.examParam.prepare_tts = DEFAULT_PREPARE_TTS;
+    prime.examParam.touch_leftfront_tts = DEFAULT_TOUCH_LEFT_FRONT;
+    prime.examParam.touch_leftrear_tts = DEFAULT_TOUCH_LEFT_REAR;
+    prime.examParam.touch_rightfront_tts = DEFAULT_TOUCH_RIGHT_FRONT;
+    prime.examParam.touch_rightrear_tts = DEFAULT_TOUCH_RIGHT_REAR;
+    prime.examParam.start_engine_tts = DEFAULT_START_ENGINE;
 
-    examParam.start_car_begin_tts = DEFAULT_START_CAR_BEGIN_TTS;
-    examParam.start_car_end_tts = DEFAULT_START_CAR_END_TTS;
-    examParam.change_lane_limit_distance = CHANGE_LANE_MAX_DISTANCE;
-    examParam.change_lane_begin_tts = DEFAULT_CHANGE_LANE_BEGIN_TTS;
-    examParam.change_lane_end_tts = DEFAULT_CHANGE_LANE_END_TTS;
-    examParam.shift_limit_distance = DEFAULT_SHIFT_MAX_DISTANCE;
-    examParam.shift_hold_time = DEFAULT_SHIFT_HOLD_TIME;
-    examParam.shift_begin_tts = DEFAULT_SHIFT_BEGIN_TTS;
-    examParam.shift_end_tts = DEFAULT_SHIFT_END_TTS;
-    examParam.shift_up_tts = "";
-    examParam.shift_down_tts = "";
+    prime.examParam.start_car_begin_tts = DEFAULT_START_CAR_BEGIN_TTS;
+    prime.examParam.start_car_end_tts = DEFAULT_START_CAR_END_TTS;
+    prime.examParam.change_lane_limit_distance = CHANGE_LANE_MAX_DISTANCE;
+    prime.examParam.change_lane_begin_tts = DEFAULT_CHANGE_LANE_BEGIN_TTS;
+    prime.examParam.change_lane_end_tts = DEFAULT_CHANGE_LANE_END_TTS;
+    prime.examParam.shift_limit_distance = DEFAULT_SHIFT_MAX_DISTANCE;
+    prime.examParam.shift_hold_time = DEFAULT_SHIFT_HOLD_TIME;
+    prime.examParam.shift_begin_tts = DEFAULT_SHIFT_BEGIN_TTS;
+    prime.examParam.shift_end_tts = DEFAULT_SHIFT_END_TTS;
+    prime.examParam.shift_up_tts = "";
+    prime.examParam.shift_down_tts = "";
 
-    examParam.straight_begin_tts = DEFAULT_STRAIGHT_BEGIN_TTS;
-    examParam.straight_end_tts = DEFAULT_STRAIGHT_END_TTS;
-    examParam.straight_limit_distance = DEFAULT_STRAIGHT_MAX_DISTANCE;
-    examParam.straight_max_offset = DEFAULT_STRAIGHT_MAX_OFFSET;
+    prime.examParam.straight_begin_tts = DEFAULT_STRAIGHT_BEGIN_TTS;
+    prime.examParam.straight_end_tts = DEFAULT_STRAIGHT_END_TTS;
+    prime.examParam.straight_limit_distance = DEFAULT_STRAIGHT_MAX_DISTANCE;
+    prime.examParam.straight_max_offset = DEFAULT_STRAIGHT_MAX_OFFSET;
 
-    examParam.overtake_limit_distance = DEFAULT_OVERTAKE_MAX_DISTANCE;
-    examParam.overtake_begin_tts = DEFAULT_OVERTAKE_BEGIN_TTS;
-    examParam.overtake_end_tts = DEFAULT_OVERTAKE_END_TTS;
+    prime.examParam.overtake_limit_distance = DEFAULT_OVERTAKE_MAX_DISTANCE;
+    prime.examParam.overtake_begin_tts = DEFAULT_OVERTAKE_BEGIN_TTS;
+    prime.examParam.overtake_end_tts = DEFAULT_OVERTAKE_END_TTS;
 
-    examParam.stop_car_limit_distance = DEFAULT_STOP_CAR_MAX_DISTANCE;
-    examParam.stop_car_open_door_allow_time = DEFAULT_STOP_CAR_OPEN_DOOR_MAX_TIME;
-    examParam.stop_car_edge_red_distance = DEFAULT_STOP_CAR_EDGE_RED_DISTANCE;
-    examParam.stop_car_edge_yellow_distance = DEFAULT_STOP_CAR_EDGE_YELLOW_DISTANCE;
-    examParam.stop_car_begin_tts = DEFAULT_STOP_CAR_BEGIN_TTS;
-    examParam.stop_car_end_tts = DEFAULT_STOP_CAR_END_TTS;
-    examParam.crossing_stop_valid_distance = DEFAULT_CROSSING_STOP_VALID_DISTANCE;
-    examParam.cross_school_max_speed = DEFAULT_CROSS_SCHOOL_MAX_SPEED;
-    examParam.crossing_break_valid_distance = DEFAULT_CROSS_BREAK_VALID_DISTANCE;
+    prime.examParam.stop_car_limit_distance = DEFAULT_STOP_CAR_MAX_DISTANCE;
+    prime.examParam.stop_car_open_door_allow_time = DEFAULT_STOP_CAR_OPEN_DOOR_MAX_TIME;
+    prime.examParam.stop_car_edge_red_distance = DEFAULT_STOP_CAR_EDGE_RED_DISTANCE;
+    prime.examParam.stop_car_edge_yellow_distance = DEFAULT_STOP_CAR_EDGE_YELLOW_DISTANCE;
+    prime.examParam.stop_car_begin_tts = DEFAULT_STOP_CAR_BEGIN_TTS;
+    prime.examParam.stop_car_end_tts = DEFAULT_STOP_CAR_END_TTS;
+    prime.examParam.crossing_stop_valid_distance = DEFAULT_CROSSING_STOP_VALID_DISTANCE;
+    prime.examParam.cross_school_max_speed = DEFAULT_CROSS_SCHOOL_MAX_SPEED;
+    prime.examParam.crossing_break_valid_distance = DEFAULT_CROSS_BREAK_VALID_DISTANCE;
 
-    examParam.crossing_go_straight_tts = DEFAULT_CROSSING_GO_STRAIGHT_TTS;
-    examParam.crossing_turn_left_tts = DEFAULT_CROSSING_TURN_LEFT_TTS;
-    examParam.crossing_turn_right_tts = DEFAULT_CROSSING_TURN_RIGHT_TTS;
-    examParam.crossing_turn_back_tts = DEFAULT_CROSSING_TURN_BACK_TTS;
-    examParam.crossing_turn_unknown_tts = DEFAULT_CROSSING_TURN_UNKNOWN_TTS;
+    prime.examParam.crossing_go_straight_tts = DEFAULT_CROSSING_GO_STRAIGHT_TTS;
+    prime.examParam.crossing_turn_left_tts = DEFAULT_CROSSING_TURN_LEFT_TTS;
+    prime.examParam.crossing_turn_right_tts = DEFAULT_CROSSING_TURN_RIGHT_TTS;
+    prime.examParam.crossing_turn_back_tts = DEFAULT_CROSSING_TURN_BACK_TTS;
+    prime.examParam.crossing_turn_unknown_tts = DEFAULT_CROSSING_TURN_UNKNOWN_TTS;
 }
 
 static void ReadDriverExamPrimerTimeout(apptimer_var_t val)
@@ -308,134 +305,113 @@
 
 void ClearAreaMap(void)
 {
-    if (ExamStart)
-        return;
-
-//    for (int i = 0; i < AreaMapList.size(); ++i) {
-//        if (AreaMapList[i].map.point != NULL)
-//            free(AreaMapList[i].map.point);
-//        if (AreaMapList[i].map2.point != NULL)
-//            free(AreaMapList[i].map2.point);
-//    }
-//
-//    LIST_AREA_MAP().swap(AreaMapList);
-
-
-    vector<curve_map_t>().swap(AreaMap.curve_map);
-    vector<park_button_map_t>().swap(AreaMap.park_button_map);
-    vector<park_edge_map_t>().swap(AreaMap.park_edge_map);
-    vector<turn_a90_map_t>().swap(AreaMap.turn_a90_map);
-    vector<uphill_map_t>().swap(AreaMap.uphill_map);
-}
-
-void AddAreaMap(int id, int type, const double (*map)[2], int pointNum, const double (*map2)[2], int pointNum2)
-{
-    if (map == NULL || pointNum == 0 || ExamStart)
-        return;
-    DEBUG("鍔犲叆鍦板浘淇℃伅 id %d type %d pointNum %d point2Num %d", id, type, pointNum, pointNum2);
-
-//    struct area_exam_map newMap;
-//
-//    newMap.id = id;
-//    newMap.type = type;
-//    newMap.map.num = pointNum;
-//    newMap.map2.num = 0;
-//    newMap.map.point = NULL;
-//    newMap.map2.point = NULL;
-//
-//    if (pointNum > 0) {
-//        newMap.map.point = (PointF *) malloc(pointNum * sizeof(PointF));
-//        for (int i = 0; i < pointNum; ++i) {
-//            newMap.map.point[i].X = map[i][0];
-//            newMap.map.point[i].Y = map[i][1];
-//        }
-//    }
-//
-//    if (pointNum2 > 0 && map2 != NULL) {
-//        newMap.map2.num = pointNum2;
-//        newMap.map2.point = (PointF *) malloc(pointNum2 * sizeof(PointF));
-//        for (int i = 0; i < pointNum2; ++i) {
-//            newMap.map2.point[i].X = map2[i][0];
-//            newMap.map2.point[i].Y = map2[i][1];
-//        }
-//    }
-//
-//    AreaMapList.push_back(newMap);
+    if (!prime.examing) {
+        DEBUG("娓呴櫎鎵�鏈夊湴鍥�");
+        vector<curve_map_t>().swap(std::get<MAP_TYPE_CURVE>(prime.maps));
+        vector<park_button_map_t>().swap(std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps));
+        vector<park_edge_map_t>().swap(std::get<MAP_TYPE_PARK_EDGE>(prime.maps));
+        vector<turn_a90_map_t>().swap(std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps));
+        vector<uphill_map_t>().swap(std::get<MAP_TYPE_UPHILL>(prime.maps));
+    }
 }
 
 void AddCurveMap(curve_map_t &map)
 {
-    AreaMap.curve_map.push_back(map);
+    DEBUG("娣诲姞鏇茬嚎琛岄┒鍦板浘");
+    if (prime.examing) {
+        return;
+    }
+    for (auto m: std::get<MAP_TYPE_CURVE>(prime.maps)) {
+        if (m.id == map.id) {
+            return;
+        }
+    }
+
+    std::get<MAP_TYPE_CURVE>(prime.maps).push_back(map);
 }
 
+// 濡傛灉鏈噰闆嗚溅浣嶅彛铏氱嚎鍐呬晶锛屽垯闇�瑕佽绠楀嚭鏉�
 void AddParkButtonMap(park_button_map_t &map)
 {
-    AreaMap.park_button_map.push_back(map);
+    DEBUG("娣诲姞鍊掕溅鍏ュ簱鍦板浘");
+    if (prime.examing) {
+        return;
+    }
+
+    for (auto m: std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)) {
+        if (m.id == map.id) {
+            return;
+        }
+    }
+    if (map.points.size() == 8) {
+        PointF p8 = PointExtend(map.points[2], map.line_width, YawOf(map.points[2], map.points[3]));
+        PointF p9 = PointExtend(map.points[5], map.line_width, YawOf(map.points[5], map.points[4]));
+        map.points.push_back(p8);
+        map.points.push_back(p9);
+    }
+    std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps).push_back(map);
+    DEBUG("鍊掑簱鍦板浘鐐规暟锛�%d", map.points.size());
+    DEBUG("鍊掑簱鍦板浘鐐规暟 %d",std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps)[0].points.size());
 }
 
+// 濡傛灉鏈噰闆嗚溅浣嶅彛铏氱嚎鍐呬晶锛屽垯闇�瑕佽绠楀嚭鏉�
 void AddParkEdgeMap(park_edge_map_t &map)
 {
-    AreaMap.park_edge_map.push_back(map);
-}
-
-void CleanRoadMap(void)
-{
-    if (ExamStart) return;
-
-    DEBUG("娓呴櫎鏃х殑璺�冨湴鍥�");
-
-    vector<road_t>().swap(RoadMap.roads);
-    vector<special_area_t>().swap(RoadMap.specialAreas);
-    vector<forbid_line_t>().swap(RoadMap.forbidLines);
-//    vector<scheme_t>().swap(RoadMap.examScheme);
-}
-
-void SetRoadMap(road_exam_map &map, vector<scheme_t> &scheme)
-{
-    if (ExamStart) return;
-
-    RoadMap.roads.assign(map.roads.begin(), map.roads.end());
-    RoadMap.specialAreas.assign(map.specialAreas.begin(), map.specialAreas.end());
-//    RoadMap.triggerLines.assign(map.triggerLines.begin(), map.triggerLines.end());
-    RoadMap.forbidLines.assign(map.forbidLines.begin(), map.forbidLines.end());
-
-//    RoadMap.examScheme.assign(scheme.begin(), scheme.end());
-
-    DEBUG("寰楀埌鏂扮殑璺�冨湴鍥� 璺暟閲� %d 鐗规畩鍖哄煙鏁伴噺 %d 鍏朵粬绂佹绾挎暟閲� %d 椤圭洰鏁伴噺 %d", RoadMap.roads.size(), RoadMap.specialAreas.size(), RoadMap.forbidLines.size(), RoadMap.examScheme.size());
-
-    /*for (int i = 0; i < RoadMap.roads.size(); ++i) {
-        DEBUG("璺� id = %d", RoadMap.roads[i].id);
-        DEBUG("宸﹁竟绾挎鏁� %d", RoadMap.roads[i].leftEdge.size());
-        for (int j = 0; j < RoadMap.roads[i].leftEdge.size(); ++j) {
-            int n = RoadMap.roads[i].leftEdge[j].points.size();
-
-            DEBUG("\t褰撳墠宸﹁竟绾挎 绫诲瀷 %d 鐐规暟 %d", RoadMap.roads[i].leftEdge[j].character, n);
-            for (int k = 0; k < n; ++k) {
-                DEBUG("\t\t鐐瑰潗鏍� %d: %f, %f", k, RoadMap.roads[i].leftEdge[j].points[k].X, RoadMap.roads[i].leftEdge[j].points[k].Y);
-            }
+    DEBUG("娣诲姞渚ф柟鍋滆溅鍦板浘");
+    if (prime.examing) {
+        return;
+    }
+    for (auto m: std::get<MAP_TYPE_PARK_EDGE>(prime.maps)) {
+        if (m.id == map.id) {
+            return;
         }
-
-        DEBUG("鍙宠竟绾挎鏁� %d", RoadMap.roads[i].rightEdge.size());
-        for (int j = 0; j < RoadMap.roads[i].rightEdge.size(); ++j) {
-            int n = RoadMap.roads[i].rightEdge[j].points.size();
-
-            DEBUG("\t褰撳墠鍙宠竟绾挎 绫诲瀷 %d 鐐规暟 %d", RoadMap.roads[i].rightEdge[j].character, n);
-            for (int k = 0; k < n; ++k) {
-                DEBUG("\t\t鐐瑰潗鏍� %d: %f, %f", k, RoadMap.roads[i].rightEdge[j].points[k].X, RoadMap.roads[i].rightEdge[j].points[k].Y);
-            }
-        }
-    }*/
+    }
+    if (map.points.size() == 8) {
+        PointF p8 = PointExtend(map.points[2], map.line_width, YawOf(map.points[2], map.points[3]));
+        PointF p9 = PointExtend(map.points[5], map.line_width, YawOf(map.points[5], map.points[4]));
+        map.points.push_back(p8);
+        map.points.push_back(p9);
+    }
+    std::get<MAP_TYPE_PARK_EDGE>(prime.maps).push_back(map);
 }
 
-void SetRoadExamScheme(vector<scheme_t> &scheme)
+// 鍧¢亾璧锋鍦板浘瑕佹妸宸︿笅瑙掑拰宸︿笂瑙掕绠楀嚭鏉ワ紝鏂逛究鍦哄湴鐨勮繘鍏ュ拰閫�鍑哄垽鏂�
+void AddUphillMap(uphill_map_t &map)
 {
-    if (ExamStart) return;
+    DEBUG("娣诲姞涓婂潯璧锋鍦板浘");
+    if (prime.examing) {
+        return;
+    }
+    for (auto m: std::get<MAP_TYPE_UPHILL>(prime.maps)) {
+        if (m.id == map.id) {
+            return;
+        }
+    }
 
-    vector<scheme_t>().swap(RoadMap.examScheme);
+    if (map.points.size() != 10)
+        return;
 
-    RoadMap.examScheme.assign(scheme.begin(), scheme.end());
+    PointF bottom_left = Calc3Point(map.points[1], map.points[0], DistanceOf(map.points[1], map.points[2]), 'R');
+    PointF top_left = Calc3Point(map.points[8], map.points[9], DistanceOf(map.points[8], map.points[7]), 'L');
 
-    DEBUG("寰楀埌璺�冮」鐩柟妗� 椤圭洰鏁伴噺 %d", RoadMap.examScheme.size());
+    map.points.push_back(bottom_left);     // 浣滀负10鍙风偣
+    map.points.push_back(top_left);        // 浣滀负11鍙风偣
+
+    std::get<MAP_TYPE_UPHILL>(prime.maps).push_back(map);
+}
+
+void AddTurnA90Map(turn_a90_map_t &map)
+{
+    DEBUG("娣诲姞鐩磋杞集鍦板浘");
+    if (prime.examing) {
+        return;
+    }
+    for (auto m: std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps)) {
+        if (m.id == map.id) {
+            return;
+        }
+    }
+    std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps).push_back(map);
 }
 
 void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire,
@@ -444,7 +420,7 @@
 {
     DEBUG("鍔犲叆杞﹁締淇℃伅 pointNum %d", pointNum);
 
-    if (point == NULL || pointNum == 0 || ExamStart) return;
+    if (point == NULL || pointNum == 0 || prime.examing) return;
 
     vector<int>().swap(CarModel.body);
     vector<car_desc_t>().swap(CarModel.carDesc);
@@ -533,19 +509,19 @@
 
         TerminateAreaExam();
 
-        ExamStart = false;
+        prime.examing = false;
         MA_SendExamStatus(0, 0);
         return;
     }
 
 //    type = TEST_TYPE_ROAD_CALIBRATE;
 
-    /*if (AreaMapList.size() == 0 && type == TEST_TYPE_AREA) {
+    if (std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps).size() == 0 && type == TEST_TYPE_AREA) {
         DEBUG("娌℃湁鍦鸿�冨湴鍥�");
         err = true;
         MA_SendExamStatus(0, -1);
-    }*/
-    if (CarModel.carDesc.size() == 0) {
+    }
+    if (prime.pModel->carDesc.size() == 0) {
         DEBUG("娌℃湁杞︽ā");
         err = true;
         MA_SendExamStatus(0, -2);
@@ -555,40 +531,25 @@
 //        err = true;
 //        MA_SendExamStatus(0, -3);
     }
-    if (type != TEST_TYPE_AREA && RoadMap.roads.size() == 0) {
-        DEBUG("娌℃湁璺�冨湴鍥�");
-        err = true;
-        MA_SendExamStatus(0, -1);
-    }
-
-    if ((type == TEST_TYPE_ROAD_DUMMY_LIGHT || type == TEST_TYPE_ROAD_TRUE_LIGHT) && RoadMap.examScheme.size() == 0) {
-        DEBUG("娌℃湁璺�冪嚎璺柟妗�");
-        err = true;
-        MA_SendExamStatus(0, -3);
-    }
 
     if (!err) {
-        if (!ExamStart) {
+        if (!prime.examing) {
             DEBUG("鍚姩鑰冭瘯");
             ExamFaultList.clear();
             examFaultIndex = 0;
 
-            ExamStart = true;
+            prime.examing = true;
             ExamType = type;
             reportSeatbeltEject = false;
 
-            if (type == TEST_TYPE_ROAD_DUMMY_LIGHT) {
-                exam_dummy_light = 0;           //0
-                RoadMap.calibrate = 0;
-            }
-            if (type == TEST_TYPE_ROAD_TRUE_LIGHT) {
-                RoadMap.calibrate = 0;
-            }
             if (type == TEST_TYPE_AREA) {
+                DEBUG("鍊掑簱鍦板浘鏁扮洰锛�%d", std::get<MAP_TYPE_PARK_BUTTOM>(prime.maps).size());
+                DEBUG("渚ф柟鍦板浘鏁扮洰锛�%d", std::get<MAP_TYPE_PARK_EDGE>(prime.maps).size());
+                DEBUG("鏇茬嚎鍦板浘鏁扮洰锛�%d", std::get<MAP_TYPE_CURVE>(prime.maps).size());
+                DEBUG("鍧¢亾鍦板浘鏁扮洰锛�%d", std::get<MAP_TYPE_UPHILL>(prime.maps).size());
+                DEBUG("鐩磋鍦板浘鏁扮洰锛�%d", std::get<MAP_TYPE_RIGHT_CORNER>(prime.maps).size());
+
                 InitAreaExam();
-            }
-            if (type == TEST_TYPE_ROAD_CALIBRATE) {
-                RoadMap.calibrate = 1;
             }
         }
         MA_SendExamStatus(1, 0);
@@ -607,16 +568,23 @@
         realtimeMotionStatus = CalcMotionState(RtkInfoList);
         // 绱姞閲岀▼
         UpdataOdo(realtimeMotionStatus);
+        prime.odo = ReadOdo();
         // 璁$畻褰撳墠杞﹁締鐐瑰潗鏍囧��
-        prime.prev_modeling_index = prime.curr_modeling_index;
-        prime.curr_modeling_index = (prime.curr_modeling_index+1) % (sizeof (realtimeBodyModeling) / sizeof (realtimeBodyModeling[0]));
-        CalcBodyModeling(realtimeBodyModeling[prime.curr_modeling_index], CarModel, RtkInfoList.front());
-        // 鍚慤I涓婃姤杞﹁締鐐瑰潗鏍�
-        UploadModeling(realtimeMotionStatus, realtimeBodyModeling[prime.curr_modeling_index]);
-        // 瑙﹀彂鑰冭瘯椤圭洰
-        if (ExamStart) {
-            ExecuteExam(prime);
+        if (CarModel.carDesc.size() > 0) {
+            prime.prev_modeling_index = prime.curr_modeling_index;
+            DEBUG("缂撳瓨鍧愭爣 %d", prime.prev_modeling_index);
+            prime.curr_modeling_index = (prime.curr_modeling_index + 1) %
+                                        (sizeof(realtimeBodyModeling) /
+                                         sizeof(realtimeBodyModeling[0]));
+            DEBUG("褰撳墠鍧愭爣 %d", prime.curr_modeling_index);
+            CalcBodyModeling(realtimeBodyModeling[prime.curr_modeling_index], CarModel,
+                             RtkInfoList.front());
+            DEBUG("褰撳墠鍧愭爣 鐐规暟 %d", realtimeBodyModeling[prime.curr_modeling_index].points.size());
+            // 鍚慤I涓婃姤杞﹁締鐐瑰潗鏍�
+            UploadModeling(realtimeMotionStatus, realtimeBodyModeling[prime.curr_modeling_index]);
         }
+        // 瑙﹀彂鑰冭瘯椤圭洰
+        ExecuteExam(prime);
     }
 }
 
@@ -637,13 +605,14 @@
 
             // 鏌ユ壘1绉掑墠鐨勭偣,濡傛灉鎵句笉鍒板垯瑙嗕负鍋滆溅
     auto prev = s.begin();
+
     std::advance(prev, 1);
 
     for (; prev != s.end(); ++prev) {
-        if (prev->utc_time - curr->utc_time > 3000) {
+        if (curr->utc_time - prev->utc_time > 3000) {
             return motion;
         }
-        if (prev->utc_time - curr->utc_time >= 1000) {
+        if (curr->utc_time - prev->utc_time >= 1000) {
             break;
         }
     }
@@ -713,6 +682,70 @@
     return motion;
 }
 
+void UpdateSensor(int id, int value)
+{
+    switch (id) {
+        case OBD_SPEED:
+            prime.sensor.speed = value;
+            break;
+        case ENGINE_RPM:
+            prime.sensor.rpm = value;
+            break;
+        case GEAR:
+            prime.sensor.gear = value;
+            break;
+        case TURN_SIGNAL_LAMP:
+            prime.sensor.turn_signal_lamp = value;
+            break;
+        case DIPPED_BEAM_LAMP:
+            prime.sensor.dipped_beam_lamp = value;
+            break;
+        case FOG_LAMP:
+            prime.sensor.fog_lamp = value;
+            break;
+        case CLEARANCE_LAMP:
+            prime.sensor.clearance_lamp = value;
+            break;
+        case FLASH_BEAM_LAMP:
+            prime.sensor.flash_beam_lamp = value;
+            break;
+        case MAIN_BEAM_LAMP:
+            prime.sensor.main_beam_lamp = value;
+            break;
+        case SEATBELT:
+            prime.sensor.seatbelt = value;
+            break;
+        case ENGINE_START:
+            prime.sensor.engine_start = value;
+            break;
+        case BRAKE:
+            prime.sensor.brake = value;
+            break;
+        case HAND_BRAKE:
+            prime.sensor.hand_brake = value;
+            break;
+        case SECOND_BRAKE:
+            prime.sensor.second_brake = value;
+            break;
+        case DOOR:
+            prime.sensor.door = value;
+            break;
+        case SURROUND_CAR_1:
+            prime.sensor.surround_car_1 = value;
+            break;
+        case SURROUND_CAR_2:
+            prime.sensor.surround_car_2 = value;
+            break;
+        case SURROUND_CAR_3:
+            prime.sensor.surround_car_3 = value;
+            break;
+        case SURROUND_CAR_4:
+            prime.sensor.surround_car_4 = value;
+            break;
+        default:break;
+    }
+}
+
 void UpdateRTKInfo(const rtk_info_t *s)
 {
     RtkInfoList.push_front(*s);
@@ -769,18 +802,37 @@
     static double startCarMoveDistance;
     static move_status_t prevMove = STOP;
 
+    // 鏇存柊杞﹁締浼犳劅鍣ㄦ暟鎹�
+    DEBUG("GEAR = %d", ReadCarStatus(GEAR));
+    DEBUG("RPM = %d", ReadCarStatus(ENGINE_RPM));
+    DEBUG("TURN_SIGNAL_LAMP = %d", ReadCarStatus(TURN_SIGNAL_LAMP));
+    DEBUG("DIPPED_BEAM_LAMP = %d", ReadCarStatus(DIPPED_BEAM_LAMP));
+    DEBUG("FOG_LAMP = %d", ReadCarStatus(FOG_LAMP));
+    DEBUG("CLEARANCE_LAMP = %d", ReadCarStatus(CLEARANCE_LAMP));
+    DEBUG("FLASH_BEAM_LAMP = %d", ReadCarStatus(FLASH_BEAM_LAMP));
+    DEBUG("MAIN_BEAM_LAMP = %d", ReadCarStatus(MAIN_BEAM_LAMP));
+    DEBUG("SEATBELT = %d", ReadCarStatus(SEATBELT));
+    DEBUG("BRAKE = %d", ReadCarStatus(BRAKE));
+    DEBUG("HAND_BRAKE = %d", ReadCarStatus(HAND_BRAKE));
+    DEBUG("SECOND_BRAKE = %d", ReadCarStatus(SECOND_BRAKE));
+    DEBUG("DOOR = %d", ReadCarStatus(DOOR));
+
+    if (!prime.examing) {
+        return;
+    }
+
     if (prime.pMotion->move != STOP) {
-        if (ReadCarStatus(SEATBELT) == EJECT_SEATBELT && !reportSeatbeltEject) {
+        if (prime.sensor.seatbelt == EJECT && !reportSeatbeltEject) {
             DEBUG("涓嶇郴瀹夊叏甯�");
             reportSeatbeltEject = true;
             AddExamFault(ExamType == TEST_TYPE_AREA? 10101: 30101);
         }
         if (rec) {
-            if (!handBreakActive2 && ReadOdo() - startCarMoveDistance >= examParam.start_car_limit_distance) {
+            if (!handBreakActive2 && prime.odo - startCarMoveDistance >= prime.examParam.start_car_limit_distance) {
                 handBreakActive2 = true;
 
                 if (ExamType == TEST_TYPE_ROAD_DUMMY_LIGHT || ExamType == TEST_TYPE_ROAD_TRUE_LIGHT) {
-                    if (ReadCarStatus(HAND_BREAK) == BREAK_ACTIVE) {
+                    if (prime.sensor.hand_brake == ACTIVE) {
                         DEBUG("Handbreak active move over 10m");
                         // 鎵嬪埞鎷夎捣鐘舵�佷笅锛岃椹朵簡10绫充互涓婏紝涓嶅悎鏍�
                         AddExamFault(40205);
@@ -790,7 +842,7 @@
                         AddExamFault(40206);
                     }
                 }
-            } else if (!handBreakActive && ReadOdo() - startCarMoveDistance >= examParam.open_door_drive_allow_distance && ReadCarStatus(HAND_BREAK) == BREAK_ACTIVE) {
+            } else if (!handBreakActive && prime.odo - startCarMoveDistance >= prime.examParam.open_door_drive_allow_distance && prime.sensor.hand_brake == ACTIVE) {
                 handBreakActive = true;
 
                 if (ExamType == TEST_TYPE_AREA) {
@@ -802,7 +854,7 @@
     } else if (!rec || prevMove != STOP) {          // 璁板綍鍋滆溅鐐�
         rec = true;
         handBreakActive = handBreakActive2 = false;
-        startCarMoveDistance = ReadOdo();
+        startCarMoveDistance = prime.odo;
     }
 
     prevMove = prime.pMotion->move;
@@ -812,7 +864,7 @@
 
 static void EngineStartHold(apptimer_var_t val) {
     DEBUG("鐐圭伀瓒呮椂");
-    if (ReadCarStatus(ENGINE_START) == ENGINE_START_ACTIVE) {
+    if (ReadCarStatus(ENGINE_START) == ACTIVE) {
         // 涓嶅強鏃舵澗寮�鍚姩寮�鍏筹紝鎵�10鍒�
         if (ExamType == TEST_TYPE_AREA) {
             AddExamFault(10201);
@@ -826,16 +878,10 @@
 {
     struct ExamFault fault;
 
-    if (!ExamStart)
-        return;
-
     fault.sn = examFaultIndex++;
 
-    strcpy(fault.utc, StringUtil::FormatUTCTime(AppTimer_GetGmtTickCount()).c_str());
-
-//    if (ExamType != TEST_TYPE_AREA) {
-//        wrong += 1000;
-//    }
+    //strcpy(fault.utc, StringUtil::FormatUTCTime(AppTimer_GetGmtTickCount()).c_str());
+    strcpy(fault.utc, "20230413172712.20");
 
     fault.wrong_id = wrong;
 
@@ -921,10 +967,3 @@
 
     }
 }
-
-void SensorXChanged(uint16_t id, int value)
-{
-//    handlePrepare(id, value);
-//    handleLigthExam(id, value);
-}
-

--
Gitblit v1.8.0