| | |
| | | |
| | | static const int TURN_THRESHOLD = 10; |
| | | static const int TURN_CHECK_INTERVAL = D_SEC(1); |
| | | const double SLIDE_DISTANCE_THRESHOLD_RED = 0.3; |
| | | const double SLIDE_DISTANCE_THRESHOLD_YELLOW = 0.1; |
| | | |
| | | static bool occurCrashRedLine; |
| | | static bool occurCrashGreenLine; |
| | |
| | | static bool reportStopCarOnRedArea; |
| | | static PointF stopPoint; |
| | | |
| | | static bool slideLongDistance; |
| | | static bool slideNormalDistance; |
| | | static bool occurSlide; |
| | | |
| | | static struct drive_timer { |
| | | int hour; |
| | | int min; |
| | |
| | | static const uint32_t TURN_SIGNAL_LAMP_ADVANCE = D_SEC(3); |
| | | |
| | | static const double MAX_SPEED = 40.0 * 1000.0 / 3600.0; |
| | | static const int SPEED_SHIFT_TABLE[][2] = {{0, 20}, {5, 30}, {15, 40}, {25, 10000}, {35, 10000}}; |
| | | |
| | | static void Rtk2DirveTimer(struct drive_timer &tm, const struct RtkTime *rtkTime); |
| | | static char isTurn(int currYaw, int prevYaw); |
| | |
| | | prevMoveDirect = 0; |
| | | |
| | | reportStopCarOnRedArea = false; |
| | | occurSlide = false; |
| | | slideLongDistance = false; |
| | | slideNormalDistance = false; |
| | | } |
| | | |
| | | void TestRoadGeneral(LIST_ROAD_MAP &RoadMapList, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime) |
| | |
| | | occurOverSpeed = false; |
| | | } |
| | | |
| | | // 挡位匹配检测 |
| | | switch (ReadCarStatus(SHIFT)) { |
| | | case SHIFT_N: |
| | | if (moveDirect != 0) { |
| | | |
| | | } |
| | | break; |
| | | case SHIFT_1: |
| | | if (ConvertMs2KMs(speed) < SPEED_SHIFT_TABLE[0][0] || ConvertMs2KMs(speed) > SPEED_SHIFT_TABLE[0][1]) { |
| | | |
| | | } |
| | | break; |
| | | case SHIFT_2: |
| | | break; |
| | | case SHIFT_3: |
| | | break; |
| | | case SHIFT_4: |
| | | break; |
| | | case SHIFT_5: |
| | | break; |
| | | default:break; |
| | | } |
| | | |
| | | // 起步后滑 |
| | | if (moveDirect != prevMoveDirect) { |
| | | if (moveDirect == 0) { |
| | | stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10); |
| | | reportStopCarOnRedArea = false; |
| | | |
| | | DEBUG("停车了 %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss); |
| | | } else if (moveDirect == -1) { |
| | | |
| | | } else if (moveDirect == -1 && prevMoveDirect == 0) { |
| | | DEBUG("开始后滑"); |
| | | stopPoint = car->basePoint; |
| | | occurSlide = true; |
| | | } |
| | | prevMoveDirect = moveDirect; |
| | | } else if (moveDirect == 0) { |
| | |
| | | DEBUG("中途停车"); |
| | | reportStopCarOnRedArea = true; |
| | | } |
| | | } else if (moveDirect == -1) { |
| | | if (occurSlide) { |
| | | double slideDistance = DistanceOf(stopPoint, car->basePoint); |
| | | |
| | | stopPoint = car->basePoint; |
| | | if (slideDistance > SLIDE_DISTANCE_THRESHOLD_YELLOW) { |
| | | slideNormalDistance = true; |
| | | } |
| | | |
| | | if (slideDistance > SLIDE_DISTANCE_THRESHOLD_RED && !slideLongDistance) { |
| | | // 后滑超过30厘米, 不合格 |
| | | AddExamFault(5, rtkTime); |
| | | DEBUG("后滑超过30厘米"); |
| | | slideLongDistance = true; |
| | | } |
| | | } |
| | | } else { |
| | | if (slideNormalDistance) { |
| | | // 后滑,扣10分 |
| | | AddExamFault(18, rtkTime); |
| | | DEBUG("后滑超过10厘米, 但不超过30厘米"); |
| | | } |
| | | |
| | | slideNormalDistance = false; |
| | | slideLongDistance = false; |
| | | occurSlide = false; |
| | | } |
| | | |
| | | switch (ReadCarStatus(TURN_SIGNAL_LAMP)) { |