| | |
| | | |
| | | #define DEBUG(fmt, args...) LOGD("<operate_gear> <%s>: " fmt, __func__, ##args) |
| | | |
| | | static struct RtkTime currRtkTime; |
| | | |
| | | static const int MAX_READ_GEAR = 6; |
| | | |
| | | static int opGear; |
| | | static bool testing; |
| | | static int examTtsSeq = 0; |
| | | static int expectGear; |
| | | static int upDownShift; |
| | | static bool checkError; |
| | | static int readGearCnt; |
| | | static int opCnt = 0; |
| | | |
| | | enum { |
| | | START_GEAR, |
| | | WAIT_TTS_END, |
| | | TTS_END, |
| | | WAITE_CHECK, |
| | | CHECKED |
| | | SEND_OP_INS, |
| | | CHECK_OP |
| | | }; |
| | | |
| | | static void CheckGear(union sigval sig); |
| | | |
| | | void StartOperateGearExam(int index, LIST_ROAD_MAP &RoadMapList) { |
| | | void StartOperateGearExam(int index, LIST_ROAD_MAP &RoadMapList, const struct RtkTime *rtkTime) { |
| | | if (index == -1) |
| | | return; |
| | | DEBUG("开始加减挡操作"); |
| | | |
| | | testing = true; |
| | | opGear = START_GEAR; |
| | | checkError = false; |
| | | opGear = SEND_OP_INS; |
| | | readGearCnt = 0; |
| | | upDownShift = 0; |
| | | opCnt = 0; |
| | | currRtkTime = *rtkTime; |
| | | |
| | | AppTimer_delete(CheckGear); |
| | | AppTimer_add(CheckGear, 100); |
| | | } |
| | | |
| | | void TerminateOperateGearExam(void) |
| | |
| | | AppTimer_delete(CheckGear); |
| | | } |
| | | |
| | | int ExecuteOperateGearExam(int index, LIST_ROAD_MAP &RoadMapList, const car_model *car, |
| | | LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime) { |
| | | DEBUG("opGear %d", opGear); |
| | | static void CheckGear(union sigval sig) { |
| | | AppTimer_delete(CheckGear); |
| | | |
| | | if (opGear == START_GEAR) { |
| | | int currGear = ReadCarStatus(GEAR); |
| | | switch (currGear) { |
| | | if (opGear == SEND_OP_INS) { |
| | | readGearCnt++; |
| | | switch (ReadCarStatus(GEAR)) { |
| | | case GEAR_1: { |
| | | opGear = WAIT_TTS_END; |
| | | upDownShift = 1; |
| | | expectGear = GEAR_2; |
| | | examTtsSeq = PlayTTS("请加到二挡"); |
| | | break; |
| | | } |
| | | case GEAR_2: { |
| | | opGear = WAIT_TTS_END; |
| | | if (upDownShift == 0) { |
| | | upDownShift = 1; |
| | | expectGear = GEAR_3; |
| | |
| | | break; |
| | | } |
| | | case GEAR_3: { |
| | | opGear = WAIT_TTS_END; |
| | | if (upDownShift == 0) { |
| | | upDownShift = -1; |
| | | expectGear = GEAR_2; |
| | |
| | | break; |
| | | } |
| | | case GEAR_4: { |
| | | opGear = WAIT_TTS_END; |
| | | if (upDownShift == 0) { |
| | | upDownShift = -1; |
| | | expectGear = GEAR_3; |
| | |
| | | break; |
| | | } |
| | | case GEAR_5: { |
| | | opGear = WAIT_TTS_END; |
| | | upDownShift = -1; |
| | | expectGear = GEAR_4; |
| | | examTtsSeq = PlayTTS("请减到四挡"); |
| | |
| | | } |
| | | default: |
| | | // 未读到有效挡位,继续尝试 |
| | | if (readGearCnt > MAX_READ_GEAR) { |
| | | DEBUG("总是读到空挡或无效挡位"); |
| | | AddExamFault(31, &currRtkTime); |
| | | testing = false; |
| | | } else { |
| | | AppTimer_add(CheckGear, 500); |
| | | } |
| | | break; |
| | | } |
| | | } else if (opGear == WAIT_TTS_END) { |
| | | |
| | | } else if (opGear == TTS_END) { |
| | | } else { |
| | | DEBUG("检测挡位 %d", expectGear); |
| | | opCnt++; |
| | | opGear = WAITE_CHECK; |
| | | checkError = false; |
| | | AppTimer_delete(CheckGear); |
| | | AppTimer_add(CheckGear, D_SEC(5)); |
| | | } else if (opGear == CHECKED) { |
| | | if (checkError) { |
| | | // 检查挡位 |
| | | if (ReadCarStatus(GEAR) != expectGear) { |
| | | // 未按指令操作挡位,不合格 |
| | | DEBUG("未按指令操作挡位"); |
| | | AddExamFault(31, rtkTime); |
| | | } |
| | | AddExamFault(31, &currRtkTime); |
| | | |
| | | if (opCnt < 2) { |
| | | opGear = START_GEAR; |
| | | testing = false; |
| | | } else if (opCnt < 2) { |
| | | opGear = SEND_OP_INS; |
| | | AppTimer_add(CheckGear, 500); |
| | | } else { |
| | | testing = false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | int ExecuteOperateGearExam(int index, LIST_ROAD_MAP &RoadMapList, const car_model *car, |
| | | LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime) { |
| | | currRtkTime = *rtkTime; |
| | | return testing ? index : -1; |
| | | } |
| | | |
| | | void OperateGearTTSDone(int id) |
| | | { |
| | | DEBUG("OperateGearTTSDone %d", id); |
| | | DEBUG("升降挡指令发出完毕 %d", id); |
| | | // 等语音播报完毕后计时 |
| | | if (id == examTtsSeq) { |
| | | opGear = TTS_END; |
| | | opGear = CHECK_OP; |
| | | AppTimer_add(CheckGear, D_SEC(7)); |
| | | } |
| | | } |
| | | |
| | | static void CheckGear(union sigval sig) |
| | | { |
| | | AppTimer_delete(CheckGear); |
| | | |
| | | DEBUG("检测挡位 %d", expectGear); |
| | | // 检查挡位 |
| | | if (ReadCarStatus(GEAR) != expectGear) { |
| | | // 不执行指定挡位,不合格 |
| | | checkError = true; |
| | | } |
| | | opGear = CHECKED; |
| | | } |