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