| | |
| | | } MapList[MAP_LIST_SIZE]; |
| | | |
| | | static int MapNum = 0; |
| | | static int CurrExamMapId = -1; |
| | | static int CurrExamMapIndex = -1; |
| | | static int CurrExamStatus = 0; // 1 测试完成 0 测试中 -1 测试错误退出 |
| | | |
| | | static car_model *CarModel = NULL; |
| | |
| | | static bool FrontTireEnterArea(const Polygon *car, const Polygon *map); |
| | | static int EnterMap(const car_model *car, const struct map_list *mapList, int mapNum); |
| | | static bool ExitMap(const car_model *car, int mapId, const struct map_list *mapList, int mapNum); |
| | | static int GetMapType(int id, const struct map_list *mapList, int mapNum); |
| | | static int GetMapId(int index, const struct map_list *mapList, int mapNum); |
| | | static int GetMapType(int index, const struct map_list *mapList, int mapNum); |
| | | |
| | | void DriverTestInit(void) |
| | | { |
| | |
| | | CarModelPrev = NULL; |
| | | } |
| | | |
| | | // 仅分配carXY, body和carDesc均没有 |
| | | CarModelPrev = (car_model *)malloc(sizeof(car_model)); |
| | | CarModelPrev->body = NULL; |
| | | CarModelPrev->carDesc = NULL; |
| | |
| | | RtkBuffer[index].mm, RtkBuffer[index].ss, RtkBuffer[index].dss); |
| | | |
| | | brief.qf = RtkBuffer[index].qf; |
| | | brief.map_id = 863;//CurrExamMapId; |
| | | brief.map_id = 863;//GetMapId(CurrExamMapIndex, MapList, MapNum); |
| | | brief.move = move; |
| | | brief.speed = speed * 3.6; |
| | | brief.heading = RtkBuffer[index].heading; |
| | |
| | | free(brief.point); |
| | | |
| | | if (TestStart) { |
| | | if (CurrExamMapId < 0) { |
| | | CurrExamMapId = EnterMap(CarModel, MapList, MapNum); |
| | | int mtype = GetMapType(CurrExamMapId, MapList, MapNum); |
| | | if (CurrExamMapIndex < 0) { |
| | | CurrExamMapIndex = EnterMap(CarModel, MapList, MapNum); |
| | | int mtype = GetMapType(CurrExamMapIndex, MapList, MapNum); |
| | | |
| | | DEBUG("CurrExamMapId %d mtype %d", CurrExamMapId, mtype); |
| | | DEBUG("CurrExamMapIndex %d mtype %d", GetMapId(CurrExamMapIndex, MapList, MapNum), mtype); |
| | | |
| | | switch (mtype) { |
| | | case MAP_TYPE_PARK_BUTTOM: |
| | | DEBUG("进入倒车入库场地"); |
| | | MA_SendDebugInfo("进入倒车入库场地 %d", CurrExamMapId); |
| | | MA_SendDebugInfo("进入倒车入库场地 %d", GetMapId(CurrExamMapIndex, MapList, MapNum)); |
| | | |
| | | StartParkBottom(); |
| | | CurrExamStatus = 0; |
| | |
| | | rtkTime.ss = RtkBuffer[index].ss; |
| | | rtkTime.mss = RtkBuffer[index].dss; |
| | | |
| | | if (CurrExamMapId >= 0) { |
| | | if (CurrExamMapIndex >= 0) { |
| | | if (CurrExamStatus == 0) { |
| | | int mtype = GetMapType(CurrExamMapId, MapList, MapNum); |
| | | int mtype = GetMapType(CurrExamMapIndex, MapList, MapNum); |
| | | switch (mtype) { |
| | | case MAP_TYPE_PARK_BUTTOM: |
| | | CurrExamStatus = TestParkBottom(ErrorList, &MapList[CurrExamMapId].map, |
| | | CurrExamStatus = TestParkBottom(ErrorList, &MapList[CurrExamMapIndex].map, |
| | | CarModel, CarModelPrev, speed, move, &rtkTime); |
| | | break; |
| | | case MAP_TYPE_STOP_START: |
| | |
| | | } |
| | | } |
| | | if (CurrExamStatus != 0) { |
| | | if (ExitMap(CarModel, CurrExamMapId, MapList, MapNum)) { |
| | | DEBUG("退出场地 %d", CurrExamMapId); |
| | | MA_SendDebugInfo("退出场地 %d", CurrExamMapId); |
| | | CurrExamMapId = -1; |
| | | if (ExitMap(CarModel, CurrExamMapIndex, MapList, MapNum)) { |
| | | DEBUG("退出场地 %d", GetMapId(CurrExamMapIndex, MapList, MapNum)); |
| | | MA_SendDebugInfo("退出场地 %d", GetMapId(CurrExamMapIndex, MapList, MapNum)); |
| | | CurrExamMapIndex = -1; |
| | | } |
| | | } |
| | | } |
| | |
| | | */ |
| | | static uint32_t CalcTimeDiff(const rtk_info *a, const rtk_info *b) |
| | | { |
| | | return ABS(TimeMakeComposite(2000 + a->YY, a->MM, a->DD, a->hh, a->mm, a->ss) * 1000 + a->dss*10 - |
| | | (TimeMakeComposite(2000 + b->YY, b->MM, b->DD, b->hh, b->mm, b->ss) * 1000 + b->dss*10)); |
| | | return ABS((long)(TimeMakeComposite(2000 + a->YY, a->MM, a->DD, a->hh, a->mm, a->ss) * 1000 + a->dss*10) - |
| | | (long)(TimeMakeComposite(2000 + b->YY, b->MM, b->DD, b->hh, b->mm, b->ss) * 1000 + b->dss*10)); |
| | | } |
| | | |
| | | static bool UpdateCarCoord(double &spd, int &mov, int &idx) |
| | |
| | | |
| | | if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine1) > 0.1 && |
| | | DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine2) > 0.1) |
| | | return mapList[i].id; |
| | | return i; |
| | | } |
| | | } |
| | | } |
| | | return -1; |
| | | } |
| | | |
| | | static bool ExitMap(const car_model *car, int mapId, const struct map_list *mapList, int mapNum) |
| | | static bool ExitMap(const car_model *car, int index, const struct map_list *mapList, int mapNum) |
| | | { |
| | | // 车的最后点是否进入地图 |
| | | for (int i = 0; i < mapNum && car != NULL; ++i) { |
| | | if (mapList[i].id == mapId) { |
| | | if (mapList[i].type == MAP_TYPE_PARK_BUTTOM) { |
| | | if (IntersectionOf(car->carXY[ car->axial[AXIAL_REAR] ], &mapList[i].map) == GM_None) { |
| | | Line enterLine1, enterLine2; |
| | | if (index < 0 || mapList == NULL || mapNum == 0) return true; |
| | | |
| | | MakeLine(&enterLine1, &(mapList[i].map.point[0]), &(mapList[i].map.point[1])); |
| | | MakeLine(&enterLine2, &(mapList[i].map.point[6]), &(mapList[i].map.point[7])); |
| | | if (mapList[index].type == MAP_TYPE_PARK_BUTTOM) { |
| | | if (IntersectionOf(car->carXY[car->axial[AXIAL_REAR]], &mapList[index].map) == GM_None) { |
| | | Line enterLine1, enterLine2; |
| | | |
| | | if (DistanceOf(car->carXY[car->axial[AXIAL_REAR]], enterLine1) > 0.1 && |
| | | DistanceOf(car->carXY[car->axial[AXIAL_REAR]], enterLine2) > 0.1) |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | MakeLine(&enterLine1, &(mapList[index].map.point[0]), &(mapList[index].map.point[1])); |
| | | MakeLine(&enterLine2, &(mapList[index].map.point[6]), &(mapList[index].map.point[7])); |
| | | |
| | | if (DistanceOf(car->carXY[car->axial[AXIAL_REAR]], enterLine1) > 0.1 && |
| | | DistanceOf(car->carXY[car->axial[AXIAL_REAR]], enterLine2) > 0.1) |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | static int GetMapType(int id, const struct map_list *mapList, int mapNum) |
| | | static int GetMapId(int index, const struct map_list *mapList, int mapNum) |
| | | { |
| | | for (int i = 0; i < mapNum && id >= 0; ++i) { |
| | | if (mapList[i].id == id) return mapList[i].type; |
| | | } |
| | | return -1; |
| | | if (index < 0 || mapList == NULL || mapNum == 0) |
| | | return -1; |
| | | |
| | | return mapList[index].id; |
| | | } |
| | | |
| | | static int GetMapType(int index, const struct map_list *mapList, int mapNum) |
| | | { |
| | | if (index < 0 || mapList == NULL || mapNum == 0) |
| | | return -1; |
| | | |
| | | return mapList[index].type; |
| | | } |
| | | |
| | | void AddExamFault(int wrong, const struct RtkTime *rtkTime) |