From 00c07fb94c6927f3bb8ebfec383a33936f04447b Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期五, 22 五月 2020 19:01:18 +0800
Subject: [PATCH] 坐标
---
lib/src/main/cpp/test_items2/road_exam.cpp | 512 ++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 324 insertions(+), 188 deletions(-)
diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp
index a2205f9..d132808 100644
--- a/lib/src/main/cpp/test_items2/road_exam.cpp
+++ b/lib/src/main/cpp/test_items2/road_exam.cpp
@@ -40,6 +40,14 @@
static const int TURN_CHECK_INTERVAL = 500;
const double SLIDE_DISTANCE_THRESHOLD_RED = 0.3;
const double SLIDE_DISTANCE_THRESHOLD_YELLOW = 0.1;
+const double CHANGE_LANE_RANGE = 100.0;
+const double OVERTAKE_RANGE = 150.0;
+const double OVERTAKE_HOLD_RANGE = 30.0; // 鍦ㄨ秴杞﹂亾琛岄┒鐨勪竴娈佃窛绂�
+
+static const double LASTEST_BREAK_POINT = 30.0;
+static const double NEXT_ROAD_TIP = 100.0; // 鍒拌揪璺彛鍓嶆彁绀轰笅涓�涓�庝箞璧�
+static const double DISTANCE_STOP_CAR_TO_STOP_LINE = 5.0;
+static const double PASS_SCHOOL_MAX_SPEED = 30.0; // kmh
static const int FIND_POSITION = -2;
static const int INVALID_POSITION = -1;
@@ -75,13 +83,15 @@
static int startCar;
static int currExamMapIndex;
+static trigger_line_t *currRoadItem;
static int nextRoadId;
+static PointF roadItemStartPoint;
+static struct drive_timer roadItemStartTime;
+static bool overtake = false;
static bool checkDoor = false;
static bool handBreakActive = false;
static bool reportRPMOver = false;
-
-static int currCarOnRoadIndex;
static const uint32_t TURN_ERROR_COLD_TIME = D_SEC(10);
@@ -90,6 +100,8 @@
int road;
int separate;
int lane;
+ int direct; // 杞﹂亾鏂瑰悜闄愬埗
+ int type; // 瀹炵嚎锛岃櫄绾�
} CurrentLane;
static bool laneChanging;
@@ -103,7 +115,6 @@
static const uint32_t CRASH_DOTTED_LINE_TIMEOUT = D_SEC(10);
static const uint32_t TURN_SIGNAL_LAMP_ADVANCE = D_SEC(3);
-static const double NEXT_ROAD_TIP = 100.0; // 鍒拌揪璺彛鍓嶆彁绀轰笅涓�涓�庝箞璧�
static const int CRL_NONE = 0;
static const int CRL_SEP_DOTTED = 1;
@@ -118,11 +129,6 @@
static char isTurn(int currYaw, int prevYaw, int &ang);
static char CheckCarTurn(LIST_CAR_MODEL &CarModelList);
-static bool CrashRedLine(LIST_ROAD_MAP &RoadMapList, const car_model *car);
-static bool CrashRedArea(LIST_ROAD_MAP &RoadMapList, const car_model *car);
-static bool CrashGreenLine(LIST_ROAD_MAP &RoadMapList, const car_model *car, PointF &p1, PointF &p2);
-static int CrashTriggerLine(LIST_ROAD_MAP &RoadMapList, const car_model *car, LIST_CAR_MODEL &CarModelList);
-static int FindMapIndexById(int id, LIST_ROAD_MAP &RoadMapList);
static void TurnSignalError13ColdTimer(union sigval sig);
static void TurnSignalError14ColdTimer(union sigval sig);
@@ -132,6 +138,10 @@
static bool LaneIsSame(struct car_on_lane lane1, struct car_on_lane lane2);
static bool LaneIsValid(struct car_on_lane lane);
static void ArrivedRoadEnd(road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList);
+static trigger_line_t * EntryItem(int index, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList);
+static void ClearAll(road_exam_map &map);
+static void CheckBreakActive(road_exam_map &map, const car_model *car, LIST_CAR_MODEL &CarModelList,
+ double speed, int moveDirect, const struct RtkTime *rtkTime);
void InitRoadExam(road_exam_map &RoadMap)
{
@@ -141,6 +151,7 @@
occurCrashRedLine = false;
occurCrashGreenLine = false;
occurOverSpeed = false;
+
occurSecondBreak = false;
checkCrashGreenTimeout = 0;
carIntersectionOfGreenLine = 0;
@@ -161,6 +172,7 @@
currExamMapIndex = FIND_POSITION;
startCar = START_CAR_NOT_DO;
+ currRoadItem = NULL;
checkDoor = false;
handBreakActive = false;
@@ -170,12 +182,11 @@
turnError13Cold = turnError14Cold = true;
- currCarOnRoadIndex = FIND_POSITION;
-
CurrentLane.road = CurrentLane.separate = CurrentLane.lane = -1;
laneChanging = false;
- InitThroughSomething(RoadMap);
+ nextRoadId = -1;
+ ClearAll(RoadMap);
}
void TerminateRoadExam(void)
@@ -295,14 +306,12 @@
void TestRoadGeneral(road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime)
{
- // 璧锋妫�娴�
- TestRoadStartCar(car, speed, moveDirect, rtkTime);
-
// 瓒呴�熸娴�
if (moveDirect != 0 && speed > MAX_SPEED) {
if (!occurOverSpeed) {
occurOverSpeed = true;
// 瓒呴�燂紝涓嶅悎鏍�
+ DEBUG("瓒呴�� %f", speed);
AddExamFault(10, rtkTime);
}
} else {
@@ -470,7 +479,8 @@
}
// 妫�娴嬮�氳繃璺彛銆佷汉琛岄亾绛夊尯鍩熸椂锛岄噴鏀惧埞杞︽垨鍑忛��
- CheckBreakActive(RoadMap, car, CarModelList);
+ CheckBreakActive(RoadMap, car, CarModelList,
+ speed, moveDirect, rtkTime);
// 妫�娴嬬寮�姝よ矾娈碉紝鍏ㄨ溅闇�涓嶅湪鑼冨洿鍐�
if (currExamMapIndex >= 0) {
@@ -579,6 +589,11 @@
if (IntersectionOf(car->carXY[car->axial[AXIAL_FRONT]], &area) == GM_Containment) {
currExamMapIndex = i;
DEBUG("杩涘叆閬撹矾 id = %d", RoadMap.roads[i].id);
+ if (nextRoadId >= 0 && RoadMap.roads[i].id != nextRoadId) {
+ DEBUG("涓嶆寜瑙勭煩琛岄┒锛岃繘鍏ラ敊璇矾娈�");
+ AddExamFault(3, rtkTime);
+ }
+ nextRoadId = -1;
break;
}
@@ -608,16 +623,16 @@
if (crl == CRL_NONE) {
// DEBUG("浠�涔堥兘娌″帇");
} else if (crl == CRL_SEP_DOTTED) {
-// DEBUG("鍘嬪垎閬撹櫄绾�");
+ DEBUG("鍘嬪垎閬撹櫄绾�");
crashGreenLineNow = true;
} else if (crl == CRL_SEP_SOLID) {
-// DEBUG("鍘嬪垎閬撳疄绾�");
+ DEBUG("鍘嬪垎閬撳疄绾�");
crashRedLineNow = true;
} else if (crl == CRL_EDGE_DOTTED) {
-// DEBUG("鍘嬭竟娌胯櫄绾�");
+ DEBUG("鍘嬭竟娌胯櫄绾�");
crashGreenLineNow = true;
} else if (crl == CRL_EDGE_SOLID) {
-// DEBUG("鍘嬭竟娌垮疄绾�");
+ DEBUG("鍘嬭竟娌垮疄绾�");
crashRedLineNow = true;
}
@@ -700,9 +715,23 @@
} else {
// 鍙橀亾瀹屾垚
DEBUG("鍙橀亾瀹屾垚");
+
+ if (currRoadItem != NULL && currRoadItem->active == ROAD_ITEM_CHANGE_LANE) {
+ DEBUG("鍙樻洿杞﹂亾椤圭洰瀹屾垚");
+ currRoadItem = NULL;
+ } else if (currRoadItem != NULL && currRoadItem->active == ROAD_ITEM_OVERTAKE) {
+ if (CurrentLane.lane > lane.lane) {
+ DEBUG("瓒呰溅鍙橀亾瀹屾垚");
+
+ } else {
+ DEBUG("鍙抽亾瓒呰溅锛岄敊璇�");
+ AddExamFault(3, rtkTime);
+ currRoadItem = NULL;
+ }
+ }
+
CurrentLane = lane;
laneChanging = false;
-
// 璁板綍鏈鍙橀亾鏃堕棿鐐�
Rtk2DriveTimer(crashGreenCmpTime, rtkTime);
}
@@ -710,11 +739,20 @@
if (lane.road != CurrentLane.road || lane.separate != CurrentLane.separate) {
// 璺垨娈靛彉鏇达紝鎾ら攢鍙橀亾璺熻釜
- DEBUG("============== 璺垨娈靛彉鏇� CURR %d, %d NEW %d, %d", CurrentLane.road,
- CurrentLane.separate,
- lane.road, lane.separate);
+ DEBUG("============== 璺垨娈靛彉鏇� CURR %d, %d dir %d NEW %d, %d, dir %d", CurrentLane.road,
+ CurrentLane.separate, CurrentLane.direct,
+ lane.road, lane.separate, lane.direct);
+
CurrentLane = lane;
laneChanging = false;
+ }
+
+ if (CurrentLane.direct != 0 && !(CurrentLane.direct & RoadMap.roads[currExamMapIndex].active)) {
+ if (!RoadMap.roads[currExamMapIndex].errorLane) {
+ RoadMap.roads[currExamMapIndex].errorLane = true;
+ DEBUG("涓嶆寜瑙勫畾杞﹂亾鏍囩嚎鏂瑰悜琛岄┒ %d", CurrentLane.direct);
+ AddExamFault(9, rtkTime);
+ }
}
}
@@ -773,6 +811,50 @@
// 涓嶅啀鍘嬭櫄绾�
occurCrashGreenLine = false;
checkCrashGreenTimeout = 0;
+ }
+
+ TestRoadStartCar(car, speed, moveDirect, rtkTime);
+
+ if (startCar != START_CAR_DONE)
+ return;
+
+ // 妫�娴嬬敱瑙﹀彂绾挎帶鍒剁殑椤圭洰
+ if (currRoadItem != NULL) {
+ if (currRoadItem->active == ROAD_ITEM_CHANGE_LANE) {
+ if (DistanceOf(car->basePoint, roadItemStartPoint) > CHANGE_LANE_RANGE) {
+ DEBUG("鍙橀亾璺濈瓒呮爣");
+ AddExamFault(3, rtkTime);
+ currRoadItem = NULL;
+ }
+ } else if (currRoadItem->active == ROAD_ITEM_OVERTAKE) {
+ if (!overtake && DistanceOf(car->basePoint, roadItemStartPoint) > OVERTAKE_RANGE) {
+ DEBUG("瓒呰溅璺濈瓒呮爣");
+ AddExamFault(3, rtkTime);
+ currRoadItem = NULL;
+ } else if (overtake && DistanceOf(car->basePoint, roadItemStartPoint) > OVERTAKE_HOLD_RANGE) {
+ DEBUG("鍥炲師杞﹂亾");
+ PlayTTS("璇疯繑鍥炲師杞﹂亾");
+ currRoadItem = NULL;
+ }
+ } else if (currRoadItem->active == ROAD_ITEM_OPERATE_GEAR) {
+ ExecuteOperateGearExam(rtkTime);
+ }
+ } else if (currExamMapIndex >= 0) {
+ currRoadItem = EntryItem(currExamMapIndex, RoadMap, car, CarModelList);
+ if (currRoadItem != NULL) {
+ if (!currRoadItem->tts.empty())
+ PlayTTS(currRoadItem->tts.c_str());
+
+ // 鍒濆鏃堕棿鍜岃窛绂婚檺鍒�
+ roadItemStartPoint = car->basePoint;
+ Rtk2DriveTimer(roadItemStartTime, rtkTime);
+
+ if (currRoadItem->active == ROAD_ITEM_OVERTAKE) {
+ overtake = false;
+ } else if (currRoadItem->active == ROAD_ITEM_OPERATE_GEAR) {
+ StartOperateGearExam(rtkTime);
+ }
+ }
}
}
@@ -839,7 +921,7 @@
PointF p1, p2;
Line sep;
- map<int, int> orthogonal;
+ map<int, vector<int>> orthogonal;
// 涓�娈靛垎閬撶粍鍐咃紝鏈変竴鏉℃浜わ紝灏卞繀椤讳繚璇佸悓缁勭殑鍏ㄩ兘姝d氦锛屽惁鍒欑洿鎺ラ��鍑�
for (int j = 0; j < road.separate[i].lines.size(); ++j) { // 绾跨粍
@@ -853,15 +935,31 @@
MakeLine(&sep, &p1, &p2);
if (IntersectionOf(leftExtLine, sep) == GM_Intersection) {
- orthogonal.insert(pair<int, int>(j, 1));
+ vector<int> stor(4);
+
+ stor[0] = 1;
+ stor[1] = road.separate[i].lines[j][k].character;
+ stor[2] = road.separate[i].lines[j][k].left_lane_direct;
+ stor[3] = road.separate[i].lines[j][k].right_lane_direct;
+
+ orthogonal.insert(pair<int, vector<int>>(j, stor));
orthogonalInSegment = true;
intersection = true;
+
// DEBUG("鍒嗛亾绾� %d 宸︽浜�", j);
break;
} else if (IntersectionOf(rightExtLine, sep) == GM_Intersection) {
- orthogonal.insert(pair<int, int>(j, 2));
+ vector<int> stor(4);
+
+ stor[0] = 2;
+ stor[1] = road.separate[i].lines[j][k].character;
+ stor[2] = road.separate[i].lines[j][k].left_lane_direct;
+ stor[3] = road.separate[i].lines[j][k].right_lane_direct;
+
+ orthogonal.insert(pair<int, vector<int>>(j, stor));
orthogonalInSegment = true;
intersection = true;
+
// DEBUG("鍒嗛亾绾� %d 鍙虫浜�", j);
break;
}
@@ -875,16 +973,26 @@
if (orthogonal.size() == road.separate[i].lines.size()) {
// 寰楀埌褰撳墠鍦ㄧ鍑犱釜杞﹂亾
int x = 0;
+ int left_char = LINE_SOLID; // 閬撹矾宸﹁竟绾�
+ int right_direct = 0;
+
for (x = 0; x < orthogonal.size(); ++x) {
auto itx = orthogonal.find(x);
if (itx != orthogonal.end()) {
- if (itx->second != 1) {
+ if (itx->second[0] != 1) { // 鍦ㄨ溅杈嗗彸渚�
lane.road = road.id;
lane.separate = i;
lane.lane = itx->first;
-
+ if ((left_char == LINE_SOLID || left_char == LINE_HALF_SOLID_RIGHT) &&
+ (itx->second[1] == LINE_SOLID || itx->second[1] == LINE_HALF_SOLID_LEFT)) // 杞﹂亾宸﹀彸鍧囨槸瀹炵嚎
+ lane.direct = itx->second[2];
+ else
+ lane.direct = 0;
// DEBUG("璺� %d 娈� %d 杞﹂亾 %d", lane.road, lane.separate, lane.lane);
break;
+ } else {
+ right_direct = itx->second[3];
+ left_char = itx->second[2];
}
}
}
@@ -892,7 +1000,11 @@
lane.road = road.id;
lane.separate = i;
lane.lane = orthogonal.size();
-
+ // 鏈�鍚庤溅閬撶殑鍙充晶闄愬畾
+ if (left_char == LINE_SOLID || left_char == LINE_HALF_SOLID_RIGHT)
+ lane.direct = right_direct;
+ else
+ lane.direct = 0;
// DEBUG("璺� %d 娈� %d 杞﹂亾 %d", lane.road, lane.separate, lane.lane);
}
out = lane;
@@ -1026,6 +1138,7 @@
return false;
}
+#if 0
void TestRoadGeneral(LIST_ROAD_MAP &RoadMapList, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime)
{
// 璧锋妫�娴�
@@ -1383,6 +1496,7 @@
}
}
+
bool ExitSonArea(int index, LIST_ROAD_MAP &RoadMapList, const car_model *car)
{
bool ret = false;
@@ -1464,6 +1578,7 @@
return ret;
}
+#endif
void Rtk2DriveTimer(struct drive_timer &tm, const struct RtkTime *rtkTime)
{
@@ -1556,48 +1671,13 @@
return 0;
}
-/*****************************************************
- * CrashRedLine 鏁翠釜鑰冭瘯鍖哄煙鐨勯亾璺竟缂樼嚎锛屽疄绾跨瓑銆�
- * 鎸夎溅杞瑙﹁绠楋紝杞﹁韩涓嶈
- */
-static bool CrashRedLine(LIST_ROAD_MAP &RoadMapList, const car_model *car)
-{
- 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]]);
-
- for (int i = 0; i < RoadMapList.size(); ++i) {
- if (RoadMapList[i].type == GENERAL_MAP) {
-
- // 姣忔潯绾块兘妫�娴�
- for (int j = 0; j < RoadMapList[i].redLineNum; ++j) {
- Line red_line;
- int kp = 0;
-
- for (int k = 1; k < RoadMapList[i].redLine[j].num; ++k) {
- MakeLine(&red_line, &RoadMapList[i].redLine[j].point[kp], &RoadMapList[i].redLine[j].point[k]);
-
- if (IntersectionOf(red_line, frontAxle) == GM_Intersection ||
- IntersectionOf(red_line, rearAxle) == GM_Intersection) {
- return true;
- }
- kp = k;
- }
- }
- break;
- }
- }
- return false;
-}
-
/**********************************************************
* 鎸夋暣涓溅韬槸鍚﹁鐩栬绠�
* @param RoadMapList
* @param car
* @return
*/
-static bool CrashRedArea(LIST_ROAD_MAP &RoadMapList, const car_model *car)
+/*static bool CrashRedArea(LIST_ROAD_MAP &RoadMapList, const car_model *car)
{
bool ret = false;
@@ -1625,119 +1705,7 @@
free(carBody.point);
return ret;
-}
-
-/**************************************************
- * 杞﹁疆瑙︾閬撹矾铏氱嚎銆傛娴嬭椹舵椂闂磋秴闀匡紱鍙橀亾鎯呭喌锛�
- * @param RoadMapList
- * @param car
- */
-static bool CrashGreenLine(LIST_ROAD_MAP &RoadMapList, const car_model *car, PointF &p1, PointF &p2)
-{
- 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]]);
-
- for (int i = 0; i < RoadMapList.size(); ++i) {
- if (RoadMapList[i].type == GENERAL_MAP) {
-
- // 姣忔潯绾块兘妫�娴�
- for (int j = 0; j < RoadMapList[i].greenLineNum; ++j) {
- Line green_line;
- int kp = 0;
-
- for (int k = 1; k < RoadMapList[i].greenLine[j].num; ++k) {
- MakeLine(&green_line, &RoadMapList[i].greenLine[j].point[kp], &RoadMapList[i].greenLine[j].point[k]);
-
- if (IntersectionOf(green_line, frontAxle) == GM_Intersection ||
- IntersectionOf(green_line, rearAxle) == GM_Intersection) {
-
- p1 = RoadMapList[i].greenLine[j].point[kp];
- p2 = RoadMapList[i].greenLine[j].point[k];
-
- return true;
- }
- kp = k;
- }
- }
- break;
- }
- }
- return false;
-}
-
-/************************************************************
- * 妫�娴嬭溅杈嗘槸鍚﹁Е鍙戝瓙鑰冮」鍦板浘
- * @param RoadMapList
- * @param car
- * @param CarModelList
- * @return
- */
-static int CrashTriggerLine(LIST_ROAD_MAP &RoadMapList, const car_model *car, LIST_CAR_MODEL &CarModelList)
-{
- int map_idx = -1;
-
- if (CarModelList.size() < 5)
- return map_idx;
-
- Polygon trace;
-
- trace.num = 5;
- trace.point = (PointF *) malloc(sizeof(PointF) * trace.num);
-
- list<car_model *>::iterator iter = CarModelList.begin();
-
- int pn = 0;
- while (iter != CarModelList.end() && pn < trace.num) {
- trace.point[pn++] = ((car_model *)(*iter))->carXY[((car_model *)(*iter))->left_front_tire[TIRE_OUTSIDE]];
- ++iter;
- }
-
- for (int i = 0; i < RoadMapList.size(); ++i) {
- if (RoadMapList[i].type == GENERAL_MAP) {
-
- // 姣忔潯绾块兘妫�娴�
- for (int j = 0; j < RoadMapList[i].triggerLineNum; ++j) {
- Line trigger_line;
-
- int kp = 0;
-
- // 瑙﹀彂绾夸竴鑸簲璇ュ彧鏈夐灏�2鐐癸紙id, p1, p2锛�
- for (int k = 1; k < RoadMapList[i].triggerLine[j].line.num; ++k) {
- MakeLine(&trigger_line, &RoadMapList[i].triggerLine[j].line.point[kp], &RoadMapList[i].triggerLine[j].line.point[k]);
-
- int pp = 0;
- for (int p = 1; p < pn; ++p) {
- Line trace_line;
- MakeLine(&trace_line, &trace.point[pp], &trace.point[p]);
-
- if (IntersectionOf(trace_line, trigger_line) == GM_Intersection &&
- IntersectionOfLine(RoadMapList[i].triggerLine[j].line.point[kp],
- RoadMapList[i].triggerLine[j].line.point[k],
- car->carXY[car->left_front_tire[TIRE_OUTSIDE]]) == -1 &&
- DistanceOf(car->carXY[car->left_front_tire[TIRE_OUTSIDE]], trigger_line) > 0.1) {
- // 纰板埌瑙﹀彂绾�
- DEBUG("纰版挒瑙﹀彂绾� 寮曞彂鍦板浘 id = %d", RoadMapList[i].triggerLine[j].triggerMapId);
- map_idx = FindMapIndexById(RoadMapList[i].triggerLine[j].triggerMapId, RoadMapList);
- goto SEARCH_TRIGGER_LINE_END;
- }
-
- pp = p;
- }
-
- kp = k;
- }
- }
- break;
- }
- }
-
-SEARCH_TRIGGER_LINE_END:
- free(trace.point);
-
- return map_idx;
-}
+}*/
bool CrashTheLine(Line line, const car_model *car, LIST_CAR_MODEL &CarModelList)
{
@@ -1759,16 +1727,6 @@
return true;
}
return false;
-}
-
-static int FindMapIndexById(int id, LIST_ROAD_MAP &RoadMapList)
-{
- for (int i = 0; i < RoadMapList.size(); ++i) {
- if (RoadMapList[i].id == id) {
- return i;
- }
- }
- return -1;
}
/*********************************************************************
@@ -1822,6 +1780,12 @@
return px;
}
+/***************************************************
+ * 鎺ヨ繎璺彛鏃讹紝鎻愮ず涓嬩竴姝ユ�庝箞璧�
+ * @param road
+ * @param car
+ * @param CarModelList
+ */
static void ArrivedRoadEnd(road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList)
{
// 璁$畻杞﹀墠杩涜建杩瑰欢闀跨嚎
@@ -1836,6 +1800,7 @@
IntersectionOfLine(extPoint, road.stopLine) == -1) {
if (DistanceOf(extPoint, road.stopLine) > 1.0 && !road.arrivedTail) {
// 鎺ヨ繎璺彛鍚庯紝瑕佹鏌ヨ溅杈嗘槸鍚﹁繘鍏ラ敊璇溅閬�
+ DEBUG("鎺ヨ繎璺彛");
road.arrivedTail = true;
if (!road.tts.empty())
PlayTTS(road.tts.c_str());
@@ -1845,6 +1810,177 @@
}
}
+static trigger_line_t * EntryItem(int index, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList)
+{
+ for (int i = 0; i < RoadMap.triggerLines.size(); ++i) {
+ if (RoadMap.triggerLines[i].road == RoadMap.roads[index].id) {
+ Line triggerLine;
+
+ if (RoadMap.triggerLines[i].leftPoints.size() != RoadMap.triggerLines[i].points.size()) {
+ RoadMap.triggerLines[i].leftPoints.clear();
+
+ for (int j = 0; j < RoadMap.triggerLines[i].points.size(); ++j) {
+ RoadMap.triggerLines[i].leftPoints.push_back(GetSELine(RoadMap.roads[index].leftEdge, RoadMap.triggerLines[i].points[j]));
+ }
+ }
+
+ MakeLine(&triggerLine, &RoadMap.triggerLines[i].points[0], &RoadMap.triggerLines[i].leftPoints[0]);
+
+ if (CrashTheLine(triggerLine, car, CarModelList)) {
+ return &RoadMap.triggerLines[i];
+ }
+ }
+ }
+
+ return NULL;
+}
+
+/************************************************************************
+ * 寮�濮嬫柊鐨勮�冭瘯鍚庯紝娓呴櫎鍦板浘鎵�鏈夌殑鍒硅溅銆佸仠杞﹁褰�
+ * @param map
+ */
+static void ClearAll(road_exam_map &map)
+{
+ for (int i = 0; i < map.roads.size(); ++i) {
+ map.roads[i].activeStop = map.roads[i].activeBreak = false;
+ map.roads[i].arrivedTail = false;
+ map.roads[i].errorLane = false;
+ }
+ for (int i = 0; i < map.specialAreas.size(); i++) {
+ map.specialAreas[i].overSpeed = map.specialAreas[i].activeBreak = false;
+ }
+}
+
+static void CheckBreakActive(road_exam_map &map, const car_model *car, LIST_CAR_MODEL &CarModelList,
+ double speed, int moveDirect, const struct RtkTime *rtkTime)
+{
+ int BreakDone = ReadCarStatus(BREAK);
+
+ // 璁$畻杞﹀墠杩涜建杩瑰欢闀跨嚎
+ double yaw = YawOf(car->carXY[ car->axial[AXIAL_FRONT] ], car->carXY[ car->axial[AXIAL_REAR] ]);
+ PointF extPoint = PointExtend(car->carXY[ car->axial[AXIAL_FRONT] ], LASTEST_BREAK_POINT, yaw);
+
+ Line extLine;
+ MakeLine(&extLine, &car->carXY[ car->axial[AXIAL_FRONT] ], &extPoint);
+
+ // 璺彛鍒硅溅鐐�
+ for (int i = 0; i < map.roads.size(); ++i) {
+ // 杞﹀ご鍜岃矾鍙h窛绂讳笉瓒�30绫�
+ if (IntersectionOf(extLine, map.roads[i].stopLine) == GM_Intersection &&
+ IntersectionOfLine(car->carXY[ car->axial[AXIAL_FRONT] ], map.roads[i].stopLine) == 1 ) {
+ DEBUG("杩涘叆鍑忛�熷尯");
+ if (BreakDone == BREAK_ACTIVE) {
+ map.roads[i].activeBreak = true;
+ }
+ if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]],
+ map.roads[i].stopLine) < DISTANCE_STOP_CAR_TO_STOP_LINE && moveDirect == 0) {
+ map.roads[i].activeStop = true;
+ }
+ }
+ // 璺ㄧ嚎鍚庯紝妫�鏌ュ埞杞﹀姩浣�
+ if (CrashTheLine(map.roads[i].stopLine, car, CarModelList)) {
+ if (map.roads[i].stopFlag != 0 && !map.roads[i].activeStop) {
+ // 涓嶅仠杞︾灜鏈涳紝涓嶅悎鏍�
+ DEBUG("涓嶅仠杞︾灜鏈�");
+ if (map.roads[i].active == ROAD_ACTIVE_FORWARD) {
+ AddExamFault(42, rtkTime);
+ } else if (map.roads[i].active == ROAD_ACTIVE_TURN_LEFT) {
+ AddExamFault(44, rtkTime);
+ } else if (map.roads[i].active == ROAD_ACTIVE_TURN_RIGHT) {
+ AddExamFault(47, rtkTime);
+ }
+ }
+ if (!map.roads[i].activeBreak) {
+ // 涓嶆寜瑙勫畾鍑忛�燂紝涓嶅悎鏍�
+ DEBUG("涓嶆寜瑙勫畾鍑忛��");
+ if (map.roads[i].active == ROAD_ACTIVE_FORWARD) {
+ AddExamFault(41, rtkTime);
+ } else if (map.roads[i].active == ROAD_ACTIVE_TURN_LEFT) {
+ AddExamFault(43, rtkTime);
+ } else if (map.roads[i].active == ROAD_ACTIVE_TURN_RIGHT) {
+ AddExamFault(46, rtkTime);
+ }
+ }
+ }
+ }
+ // 浜鸿閬撱�佸叕浜ょ珯鍒硅溅鐐癸紱瀛︽牎闄愰�熷尯
+ for (int i = 0; i < map.specialAreas.size(); i++) {
+ if (map.specialAreas[i].type == GRID_AREA)
+ continue;
+
+ if (map.specialAreas[i].area.size() == 2 && map.specialAreas[i].leftPoints.size() != 2) {
+ // 璁$畻鐐瑰埌宸︿晶璺竟绾跨殑鍨傜偣
+ int road = 0;
+ for (road = 0; road < map.roads.size(); ++road) {
+ if (map.roads[road].id == map.specialAreas[i].road)
+ break;
+ }
+
+ PointF vPoint = GetSELine(map.roads[road].leftEdge, map.specialAreas[i].area[0]);
+ DEBUG("璁$畻鍨傜偣1 (%f, %f)", vPoint.X, vPoint.Y);
+
+ map.specialAreas[i].leftPoints.push_back(vPoint);
+
+ vPoint = GetSELine(map.roads[road].leftEdge, map.specialAreas[i].area[0]);
+ DEBUG("璁$畻鍨傜偣2 (%f, %f)", vPoint.X, vPoint.Y);
+ map.specialAreas[i].leftPoints.push_back(vPoint);
+ }
+
+ if (map.specialAreas[i].type == ZEBRA_CROSSING || map.specialAreas[i].type == BUS_STATION_AREA) {
+ Line startLine;
+
+ MakeLine(&startLine, &map.specialAreas[i].area[0], &map.specialAreas[i].leftPoints[0]);
+
+ // 杞﹀ご鍜屾枒椹嚎璺濈涓嶈冻30绫�
+ if (IntersectionOf(extLine, startLine) == GM_Intersection &&
+ IntersectionOfLine(car->carXY[ car->axial[AXIAL_FRONT] ], startLine) == 1 ) {
+ DEBUG("杩涘叆鍑忛�熷尯 %d", map.specialAreas[i].type);
+ if (BreakDone == BREAK_ACTIVE) {
+ map.specialAreas[i].activeBreak = true;
+ }
+ }
+
+ // 璺ㄧ嚎鍚庯紝妫�鏌ュ埞杞﹀姩浣�
+ if (CrashTheLine(startLine, car, CarModelList)) {
+ if (!map.specialAreas[i].activeBreak) {
+ // 涓嶆寜瑙勫畾鍑忛�燂紝涓嶅悎鏍�
+ DEBUG("涓嶆寜瑙勫畾鍑忛��");
+ if (map.specialAreas[i].type == ZEBRA_CROSSING) {
+ AddExamFault(48, rtkTime);
+ } else {
+ AddExamFault(50, rtkTime);
+ }
+ } else {
+ DEBUG("鎸夎瀹氬噺閫�");
+ }
+
+ }
+ } else if (map.specialAreas[i].type == SCHOOL_AREA) {
+ Polygon school;
+
+ school.num = 4;
+ school.point = (PointF *) malloc(school.num * sizeof(PointF));
+
+ school.point[0] = map.specialAreas[i].area[0];
+ school.point[1] = map.specialAreas[i].area[1];
+ school.point[2] = map.specialAreas[i].leftPoints[1];
+ school.point[3] = map.specialAreas[i].leftPoints[0];
+
+ if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &school) == GM_Containment) {
+ if (ConvertMs2KMh(speed) > PASS_SCHOOL_MAX_SPEED) {
+ if (!map.specialAreas[i].overSpeed) {
+ DEBUG("閫氳繃瀛︽牎鍖哄煙瓒呴��");
+ AddExamFault(49, rtkTime);
+ map.specialAreas[i].overSpeed = true;
+ }
+ }
+ }
+
+ free(school.point);
+ }
+ }
+}
+
#if 0
typedef struct {
--
Gitblit v1.8.0