| | |
| | | #include "test_common/car_sensor.h" |
| | | #include "test_items2/road_exam.h" |
| | | #include "test_items/area_exam.h" |
| | | #include "test_items2/prepare.h" |
| | | |
| | | #define DEBUG(fmt, args...) LOGD("<driver_test> <%s>: " fmt, __func__, ##args) |
| | | |
| | |
| | | static const int DEFAULT_START_CAR_MAX_RMP = 2500; |
| | | static const int DEFAULT_START_CAR_DISTANCE = 10; |
| | | static const double DEFAULT_START_CAR_OPEN_DOOR_DISTANCE = 1.0; |
| | | static const char DEFAULT_PREPARE_TTS[] = "请开始上车准备"; |
| | | static const char DEFAULT_TOUCH_LEFT_FRONT[] = "学员通过左前方"; |
| | | static const char DEFAULT_TOUCH_LEFT_REAR[] = "学员通过左后方"; |
| | | static const char DEFAULT_TOUCH_RIGHT_FRONT[] = "学员通过右前方"; |
| | | static const char DEFAULT_TOUCH_RIGHT_REAR[] = "学员通过右后方"; |
| | | static const char DEFAULT_START_ENGINE[] = "请启动发动机"; |
| | | static const char DEFAULT_START_CAR_BEGIN_TTS[] = "请起步,继续完成考试"; |
| | | static const char DEFAULT_START_CAR_END_TTS[] = "起步完成"; |
| | | static const int CHANGE_LANE_MAX_DISTANCE = 100; |
| | |
| | | examParam.start_car_max_rpm = DEFAULT_START_CAR_MAX_RMP; |
| | | examParam.start_car_limit_distance = DEFAULT_START_CAR_DISTANCE; |
| | | examParam.open_door_drive_allow_distance = DEFAULT_START_CAR_OPEN_DOOR_DISTANCE; |
| | | |
| | | examParam.prepare_tts = DEFAULT_PREPARE_TTS; |
| | | examParam.touch_leftfront_tts = DEFAULT_TOUCH_LEFT_FRONT; |
| | | examParam.touch_leftrear_tts = DEFAULT_TOUCH_LEFT_REAR; |
| | | examParam.touch_rightfront_tts = DEFAULT_TOUCH_RIGHT_FRONT; |
| | | examParam.touch_rightrear_tts = DEFAULT_TOUCH_RIGHT_REAR; |
| | | examParam.start_engine_tts = DEFAULT_START_ENGINE; |
| | | |
| | | examParam.start_car_begin_tts = DEFAULT_START_CAR_BEGIN_TTS; |
| | | examParam.start_car_end_tts = DEFAULT_START_CAR_END_TTS; |
| | | examParam.change_lane_limit_distance = CHANGE_LANE_MAX_DISTANCE; |
| | |
| | | |
| | | RoadMap.examScheme.assign(scheme.begin(), scheme.end()); |
| | | |
| | | DEBUG("得到新的路考地图 项目数量 %d", RoadMap.examScheme.size()); |
| | | DEBUG("得到路考项目方案 项目数量 %d", RoadMap.examScheme.size()); |
| | | } |
| | | |
| | | void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire, |
| | |
| | | { |
| | | DEBUG("获取模拟路考灯光测试项目 N = %d %d", n, ExamStart); |
| | | |
| | | static const int cov[] = {0, |
| | | (DIPPED_BEAM_LAMP<<8)+DIPPED_BEAM_LIGHT, |
| | | (MAIN_BEAM_LAMP<<8)+MAIN_BEAM_LIGHT, |
| | | (CLEARANCE_LAMP<<8)+CLEARANCE_LIGHT, |
| | | (FOG_LAMP<<8)+FOG_LIGHT, |
| | | (TURN_SIGNAL_LAMP<<8)+LEFT_TURN_LIGHT, |
| | | (TURN_SIGNAL_LAMP<<8)+RIGHT_TURN_LIGHT, |
| | | (TURN_SIGNAL_LAMP<<8)+HAZARD_LIGHTS, |
| | | (FLASH_BEAM_LAMP<<8)+FLASH_BEAM_LIGHT}; |
| | | |
| | | if (ExamStart) return; |
| | | |
| | | if (DummyLightContent != NULL) { |
| | | free(DummyLightContent); |
| | | delete []DummyLightContent; |
| | | DummyLightContent = NULL; |
| | | DummyLightContentSize = 0; |
| | | } |
| | | |
| | | DummyLightContent = (struct dummy_light_exam *)malloc(n * sizeof(struct dummy_light_exam)); |
| | | DummyLightContent = new struct dummy_light_exam[n]; |
| | | DummyLightContentSize = n; |
| | | |
| | | for (int i = 0; i < n; i++) { |
| | | DummyLightContent[i] = cfg[i]; |
| | | DummyLightContent[i].item = cfg[i].item; |
| | | DummyLightContent[i].tts = cfg[i].tts; |
| | | DummyLightContent[i].wrongCode = cfg[i].wrongCode; |
| | | // Sensor Name<<8 + Sensor Status |
| | | for (int j = 0; j < cfg[i].process.size(); ++j) { |
| | | DummyLightContent[i].process[j] = cov[cfg[i].process[j]]; |
| | | } |
| | | for (int j = 0; j < cfg[i].solution.size(); ++j) { |
| | | DummyLightContent[i].solution[j] = cov[cfg[i].solution[j]]; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | static void PrintObdInfo(struct RtkTime *rtkTime, double speed) { |
| | | static struct RtkTime cTime = *rtkTime; |
| | | |
| | |
| | | engineRuning = false; |
| | | if (ExamType == TEST_TYPE_AREA) { |
| | | // 熄火1次,扣10分 |
| | | AddExamFault(5, rtkTime); |
| | | AddExamFault(10210, rtkTime); |
| | | } else { |
| | | AddExamFault(20, rtkTime); |
| | | AddExamFault(30208, rtkTime); |
| | | } |
| | | } |
| | | } else { |
| | |
| | | if (ReadCarStatus(GEAR) != GEAR_N) { |
| | | // 不是空挡点火,不合格 |
| | | if (ExamType == TEST_TYPE_AREA) |
| | | AddExamFault(3, rtkTime); |
| | | AddExamFault(10105, rtkTime); |
| | | else |
| | | AddExamFault(4, rtkTime); |
| | | AddExamFault(30105, rtkTime); |
| | | } |
| | | AppTimer_delete(EngineStartHold); |
| | | AppTimer_add(EngineStartHold, examParam.hold_start_key_limit_time); |
| | |
| | | |
| | | // 不及时松开启动开关,扣10分 |
| | | if (ExamType == TEST_TYPE_AREA) |
| | | AddExamFault(4, rtkTime); |
| | | AddExamFault(10201, rtkTime); |
| | | } |
| | | |
| | | if (ExamType == TEST_TYPE_ROAD_DUMMY_LIGHT) { |
| | | if (exam_dummy_light == 0) { |
| | | StartDummyLightExam(DummyLightContent, DummyLightContentSize, rtkTime); |
| | | StartPrepare(); |
| | | // StartDummyLightExam(DummyLightContent, DummyLightContentSize, rtkTime); |
| | | exam_dummy_light = 1; |
| | | // 汇报灯光考试开始 |
| | | DEBUG("灯光考试开始"); |
| | | } else if (exam_dummy_light == 1) { |
| | | exam_dummy_light = ExecuteDummyLightExam(rtkTime); |
| | | // 汇报灯光考试结束 |
| | | if (exam_dummy_light == 2) { |
| | | DEBUG("开始上车准备"); |
| | | } else if (exam_dummy_light == 2) { |
| | | DEBUG("开始灯光考试"); |
| | | StartDummyLightExam(DummyLightContent, DummyLightContentSize, rtkTime); |
| | | exam_dummy_light = 3; |
| | | } else if (exam_dummy_light == 3) { |
| | | if (!ExecuteDummyLightExam(rtkTime)) { |
| | | exam_dummy_light = 4; |
| | | // 汇报灯光考试结束 |
| | | DEBUG("灯光考试结束"); |
| | | InitRoadExam(RoadMap); |
| | | } |
| | |
| | | if (ReadCarStatus(SEATBELT) == EJECT_SEATBELT && !reportSeatbeltEject) { |
| | | DEBUG("不系安全带"); |
| | | reportSeatbeltEject = true; |
| | | AddExamFault(1, rtkTime); |
| | | AddExamFault(ExamType == TEST_TYPE_AREA? 10101: 30101, rtkTime); |
| | | } |
| | | } |
| | | |
| | | if (ExamType != TEST_TYPE_AREA) { |
| | | if (exam_dummy_light == 2 || ExamType == TEST_TYPE_ROAD_TRUE_LIGHT || ExamType == TEST_TYPE_ROAD_CALIBRATE) { |
| | | if (exam_dummy_light == 4 || ExamType == TEST_TYPE_ROAD_TRUE_LIGHT || ExamType == TEST_TYPE_ROAD_CALIBRATE) { |
| | | TestRoadGeneral(RoadMap, CarModel, CarModelList, speed, move, rtkTime); |
| | | } |
| | | } else { |
| | |
| | | sprintf(fault.utc, "%04d%02d%02d%02d%02d%02d.%02d", 2000 + rtkTime->YY, |
| | | rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss); |
| | | |
| | | if (ExamType != TEST_TYPE_AREA) { |
| | | wrong += 1000; |
| | | } |
| | | // if (ExamType != TEST_TYPE_AREA) { |
| | | // wrong += 1000; |
| | | // } |
| | | |
| | | fault.wrong_id = wrong; |
| | | |
| | | DEBUG("考试发生错误 %d %s", wrong, fault.utc); |
| | | DEBUG("考试发生错误 code = %d %s", wrong, fault.utc); |
| | | |
| | | ExamFaultList.push_back(fault); |
| | | |
| | |
| | | |
| | | } |
| | | } |
| | | |
| | | void SensorXChanged(uint16_t id, int value) |
| | | { |
| | | handlePrepare(id, value); |
| | | handleLigthExam(id, value); |
| | | } |
| | | |
| | | void PrepareOver(int res) |
| | | { |
| | | exam_dummy_light = 2; |
| | | } |