| | |
| | | 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; // 在超车道行驶的一段距离 |
| | | const int OVERTAKE_HOLD_TIME = D_SEC(11); // 在超车道行驶的一段时间 |
| | | const double EXAM_RANGE = 3000.0; // 至少驾驶距离 |
| | | |
| | | static const double LASTEST_BREAK_POINT = 30.0; |
| | |
| | | static struct drive_timer gearErrorTimePoint; |
| | | static struct drive_timer gearNSlideTimePoint; |
| | | static struct drive_timer startCarLeftTurnSignalTime; |
| | | static struct drive_timer overTakeCmpTime; |
| | | |
| | | static int gearErrorTime; |
| | | static int gearNSlideTime; |
| | |
| | | static PointF roadItemStartPoint; |
| | | static struct drive_timer roadItemStartTime; |
| | | static bool overtake = false; |
| | | |
| | | static bool checkTurn = false; |
| | | static bool checkDoor = false; |
| | | static bool handBreakActive = false; |
| | | static bool reportRPMOver = false; |
| | |
| | | static const uint32_t GEAR_N_SLIDE_TIMEOUT = D_SEC(5); |
| | | static const uint32_t GEAR_ERROR_TIMEOUT = D_SEC(15); |
| | | static const uint32_t STOP_CAR_TIME = D_SEC(2); |
| | | static const uint32_t CHANGE_ROAD_MIN_INTERVAL = D_SEC(10); |
| | | static const uint32_t CHANGE_LANE_MIN_INTERVAL = D_SEC(10); |
| | | static const uint32_t CRASH_DOTTED_LINE_TIMEOUT = D_SEC(10); |
| | | static const uint32_t TURN_SIGNAL_LAMP_ADVANCE = D_SEC(3); |
| | | |
| | |
| | | laneChanging = false; |
| | | |
| | | nextRoadId = -1; |
| | | checkTurn = false; |
| | | ClearAll(RoadMap); |
| | | |
| | | odoGraph = 0.0; |
| | |
| | | free(area.point); |
| | | } |
| | | if (currExamMapIndex == FIND_POSITION) { |
| | | DEBUG("搜索道路"); |
| | | for (int i = 0; i < RoadMap.roads.size(); ++i) { |
| | | Polygon area; |
| | | int n = 0; |
| | |
| | | AddExamFault(3, rtkTime); |
| | | } |
| | | nextRoadId = -1; |
| | | checkTurn = false; |
| | | break; |
| | | } |
| | | |
| | | free(area.point); |
| | | } |
| | | if (currExamMapIndex < 0) { |
| | | currExamMapIndex = INVALID_POSITION; |
| | | currExamMapIndex = FIND_POSITION;//INVALID_POSITION; |
| | | DEBUG("搜寻未果"); |
| | | } |
| | | } else if (currExamMapIndex == INVALID_POSITION) { |
| | |
| | | crashGreenCmpTime.sec, |
| | | crashGreenCmpTime.msec * 10); |
| | | |
| | | if (diff < CHANGE_ROAD_MIN_INTERVAL) { |
| | | if (diff < CHANGE_LANE_MIN_INTERVAL) { |
| | | DEBUG("===================== 连续变道 ============!!"); |
| | | // 连续变道,不合格 |
| | | AddExamFault(15, rtkTime); |
| | |
| | | } else if (currRoadItem != NULL && currRoadItem->active == ROAD_ITEM_OVERTAKE) { |
| | | if (CurrentLane.lane > lane.lane) { |
| | | DEBUG("超车变道完成"); |
| | | |
| | | overtake = true; |
| | | Rtk2DriveTimer(overTakeCmpTime, rtkTime); |
| | | } else { |
| | | DEBUG("右道超车,错误"); |
| | | AddExamFault(3, rtkTime); |
| | |
| | | if (CrashTheLine(RoadMap.roads[currExamMapIndex].stopLine, car, CarModelList)) { |
| | | DEBUG("下一个目标路 id = %d", RoadMap.roads[currExamMapIndex].targetRoad); |
| | | nextRoadId = RoadMap.roads[currExamMapIndex].targetRoad; |
| | | checkTurn = true; |
| | | } |
| | | |
| | | if (checkTurn) { |
| | | // 检查是否持续转向 |
| | | char turnDirect = CheckCarTurn(CarModelList); |
| | | if (turnDirect == 'L') { |
| | | // PlayTTS("左1"); |
| | | if (currTurnSignalStatus != LEFT_TURN_LIGHT) { |
| | | if (!reportTurnSignalError) { |
| | | DEBUG("没打左转灯"); |
| | | // 没打左转灯,不合格 |
| | | reportTurnSignalError = true; |
| | | ReportTurnSignalError(13, rtkTime); |
| | | } |
| | | } else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10, |
| | | turnSignalChangeTime.hour, turnSignalChangeTime.min, turnSignalChangeTime.sec, turnSignalChangeTime.msec*10) < TURN_SIGNAL_LAMP_ADVANCE) { |
| | | if (!reportTurnSignalError) { |
| | | DEBUG("转向灯时间不足"); |
| | | // 不足3秒,不合格 |
| | | reportTurnSignalError = true; |
| | | ReportTurnSignalError(14, rtkTime); |
| | | } |
| | | } |
| | | } else if (turnDirect == 'R') { |
| | | // PlayTTS("右1"); |
| | | if (currTurnSignalStatus != RIGHT_TURN_LIGHT) { |
| | | if (!reportTurnSignalError) { |
| | | DEBUG("没打右转灯"); |
| | | // 没打右转灯,不合格 |
| | | reportTurnSignalError = true; |
| | | ReportTurnSignalError(13, rtkTime); |
| | | } |
| | | } else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10, |
| | | turnSignalChangeTime.hour, turnSignalChangeTime.min, turnSignalChangeTime.sec, turnSignalChangeTime.msec*10) < TURN_SIGNAL_LAMP_ADVANCE) { |
| | | if (!reportTurnSignalError) { |
| | | DEBUG("转向灯时间不足"); |
| | | // 不足3秒,不合格 |
| | | reportTurnSignalError = true; |
| | | ReportTurnSignalError(14, rtkTime); |
| | | } |
| | | } |
| | | } else { |
| | | reportTurnSignalError = false; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | DEBUG("超车距离超标"); |
| | | AddExamFault(3, rtkTime); |
| | | currRoadItem = NULL; |
| | | } else if (overtake && DistanceOf(car->basePoint, roadItemStartPoint) > OVERTAKE_HOLD_RANGE) { |
| | | } else if (overtake && TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, |
| | | rtkTime->mss * 10, |
| | | overTakeCmpTime.hour, overTakeCmpTime.min, |
| | | overTakeCmpTime.sec, overTakeCmpTime.msec * 10) > OVERTAKE_HOLD_TIME) { |
| | | DEBUG("回原车道"); |
| | | PlayTTS("请返回原车道"); |
| | | currRoadItem = NULL; |
| | |
| | | crashGreenCmpTime.hour, crashGreenCmpTime.min, |
| | | crashGreenCmpTime.sec, crashGreenCmpTime.msec * 10); |
| | | |
| | | if (diff < CHANGE_ROAD_MIN_INTERVAL) { |
| | | if (diff < CHANGE_LANE_MIN_INTERVAL) { |
| | | DEBUG("===================== 连续变道 ============!!"); |
| | | // 连续变道,不合格 |
| | | AddExamFault(15, rtkTime); |