| | |
| | | const int PARK_TIMEOUT = 90; |
| | | const uint32_t STOP_CAR_TIME = D_SEC(2); |
| | | |
| | | static bool reportExamTimeout; |
| | | static uint64_t stopTimepoint = 0; |
| | | static bool occurCrashRedLine1, occurCrashRedLine2; |
| | | static int prevMoveStatus, storeMoveStatusBeforeStop; |
| | |
| | | static bool CrashRedLine2(const Polygon *map, const car_model *car); |
| | | static bool EnterParking(const Polygon *map, const car_model *car); |
| | | static bool ExitParkArea(const Polygon *map, const car_model *car); |
| | | static bool ExitParkArea2(const Polygon *map, const car_model *car); |
| | | |
| | | void StartParkEdge(int moveStatus, const struct RtkTime *rtkTime) |
| | | { |
| | | occurCrashRedLine1 = occurCrashRedLine2 = false; // 这个科目规定特殊点,发生一次扣10分,而不直接淘汰 |
| | | reportExamTimeout = false; |
| | | |
| | | prevMoveStatus = moveStatus; |
| | | parkSuccess = false; |
| | |
| | | occurCrashRedLine2 = false; |
| | | } |
| | | |
| | | if (ExitParkArea(map, car)) { |
| | | if (ExitParkArea(map, car) || ExitParkArea2(map, car)) { |
| | | if (!parkSuccess || !occurMoveBack) { |
| | | // 直接驶离测试区,认为移库不入 |
| | | AddExamFault(21, rtkTime); |
| | | DEBUG("直接驶离测试区,移库不入"); |
| | | status = -1; |
| | | } else { |
| | | status = 1; |
| | | } |
| | | status = 1; |
| | | } |
| | | |
| | | if (occurMoveBack) { |
| | | uint32_t tp = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss); |
| | | |
| | | if (tp - moveBackTimePoint >= PARK_TIMEOUT) { |
| | | if (!reportExamTimeout && tp - moveBackTimePoint >= PARK_TIMEOUT) { |
| | | // 超时90秒,不合格 |
| | | AddExamFault(22, rtkTime); |
| | | reportExamTimeout = true; |
| | | DEBUG("移库90秒超时"); |
| | | status = -1; |
| | | } |
| | | } |
| | | |
| | |
| | | // 停止后,车身出线,不合格 |
| | | AddExamFault(21, rtkTime); |
| | | DEBUG("移库不入"); |
| | | status = -1; |
| | | } |
| | | |
| | | // 在这里检查转向灯状态 |
| | |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | static bool ExitParkArea2(const Polygon *map, const car_model *car) |
| | | { |
| | | // 全车都需不在地图中 |
| | | bool ret = false; |
| | | |
| | | Polygon carBody; |
| | | |
| | | carBody.num = car->bodyNum; |
| | | carBody.point = (PointF *)malloc(carBody.num * sizeof(PointF)); |
| | | for (int i = 0; i < carBody.num; ++i) { |
| | | carBody.point[i] = car->carXY[car->body[i]]; |
| | | } |
| | | |
| | | if (IntersectionOf(&carBody, map) == GM_None) { |
| | | ret = true; |
| | | } |
| | | |
| | | free(carBody.point); |
| | | |
| | | return ret; |
| | | } |