| | |
| | | #include "../jni_log.h" |
| | | #include "../driver_test.h" |
| | | #include "../utils/xconvert.h" |
| | | #include "../master/comm_if.h" |
| | | #include <vector> |
| | | #include <cstdlib> |
| | | |
| | |
| | | |
| | | const int PARK_TIMEOUT = D_SEC(210); |
| | | |
| | | static bool testing = false; |
| | | static bool testing = false, reverseCar = false; |
| | | static int mapIndex = 0; |
| | | |
| | | const uint32_t STOP_CAR_TIME = D_SEC(2); |
| | | static uint32_t stopTimepoint; |
| | |
| | | |
| | | static char CrossCtrlLine(const Polygon *map, const car_model *car, const car_model *prev_car); |
| | | static bool EnterParking(const Polygon *map, const car_model *car); |
| | | static bool CrashRedLine(const Polygon *map, const car_model *car); |
| | | static bool CrashRedLine(const Polygon *map, const car_model *car, int &who); |
| | | static bool ExitParkArea(const Polygon *map, const car_model *car); |
| | | |
| | | void StartParkBottom(int moveDirect, const struct RtkTime *rtkTime) |
| | | void StartParkBottom(int index, int moveDirect, const struct RtkTime *rtkTime) |
| | | { |
| | | DEBUG("StartParkBottom"); |
| | | testing = true; |
| | | reverseCar = false; |
| | | mapIndex = index; |
| | | memset(carray, 0, sizeof(carray)); |
| | | memset(darray, 0, sizeof(darray)); |
| | | memset(parkStatus, 0, sizeof(parkStatus)); |
| | |
| | | { |
| | | char crossCtrlLine = 0; |
| | | uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10); |
| | | int who = 0; |
| | | |
| | | if (ExitParkArea(map, car)) { |
| | | DEBUG("离开场地"); |
| | | // 离开场地 |
| | | testing = false; |
| | | if ((parkStatus[0] != 1 || parkStatus[1] != 1) && !reportParkFail) { |
| | | if ((parkStatus[0] != 1 || parkStatus[1] != 1) && !reportParkFail && reverseCar) { |
| | | // 倒库不入,不合格 |
| | | reportParkFail = true; |
| | | AddExamFault(8, rtkTime); |
| | |
| | | goto TEST_END; |
| | | } |
| | | |
| | | if (CrashRedLine(map, car)) { |
| | | |
| | | if (CrashRedLine(map, car, who)) { |
| | | if (!occurCrashRedLine) { |
| | | occurCrashRedLine = true; |
| | | // 车身出线,不合格 |
| | | AddExamFault(7, rtkTime); |
| | | DEBUG("车轮压线"); |
| | | if (who == 1) { |
| | | PlayTTS("压左库位线"); |
| | | } else if (who == 2) { |
| | | PlayTTS("压右库位线"); |
| | | } |
| | | } |
| | | } else { |
| | | occurCrashRedLine = false; |
| | |
| | | } |
| | | } else if (moveDirect == -1) { |
| | | // 切换为倒车 |
| | | if (!reverseCar) { |
| | | reverseCar = true; |
| | | MA_EnterMap(mapIndex, MAP_TYPE_PARK_BUTTOM, 1); |
| | | } |
| | | if (darray[parkCount] == 0) { |
| | | if (!crossCtrlLineSw) { |
| | | // 倒车前,前轮未驶过控制线 |
| | |
| | | DEBUG("倒车前,前轮未驶过控制线"); |
| | | } |
| | | darray[parkCount] = 1; |
| | | firstReverseTimepoint = tp; |
| | | firstReverseTimepoint = tp; // 首次倒车,才意味着此项目开始 |
| | | } |
| | | } else { |
| | | // 切换为前进 |
| | |
| | | } |
| | | |
| | | TEST_END: |
| | | if (!testing && reverseCar) { |
| | | MA_EnterMap(mapIndex, MAP_TYPE_PARK_BUTTOM, 0); |
| | | } |
| | | return testing ? 1 : 0; |
| | | } |
| | | |
| | |
| | | return succ; |
| | | } |
| | | |
| | | static bool CrashRedLine(const Polygon *map, const car_model *car) |
| | | static bool CrashRedLine(const Polygon *map, const car_model *car, int &who) |
| | | { |
| | | bool ret = false; |
| | | |
| | |
| | | for (int i = 0; i < sizeof(red_lines) / sizeof(red_lines[0]); ++i) { |
| | | MakeLine(&red_line, &(map->point[red_lines[i][0]]), &(map->point[red_lines[i][1]])); |
| | | if (IntersectionOf(red_line, &car_body) != GM_None) { |
| | | if (i == 2 || i == 1) { |
| | | who = 1; |
| | | } else if (i == 4 || i == 5) { |
| | | who = 2; |
| | | } |
| | | |
| | | ret = true; |
| | | break; |
| | | } |