// // Created by YY on 2020/3/25. // #include "operate_gear.h" #include "../driver_test.h" #include "../common/apptimer.h" #include "../native-lib.h" #include "../test_common/car_sensor.h" #include "../jni_log.h" #define DEBUG(fmt, args...) LOGD(" <%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 int readGearCnt; static int opCnt = 0; enum { SEND_OP_INS, CHECK_OP }; static void CheckGear(union sigval sig); void StartOperateGearExam(const struct RtkTime *rtkTime) { DEBUG("开始加减挡操作"); testing = true; 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); } static void CheckGear(union sigval sig) { AppTimer_delete(CheckGear); if (opGear == SEND_OP_INS) { readGearCnt++; switch (ReadCarStatus(GEAR)) { case GEAR_1: { upDownShift = 1; expectGear = GEAR_2; examTtsSeq = PlayTTS("请加到二挡"); break; } case GEAR_2: { if (upDownShift == 0) { upDownShift = 1; expectGear = GEAR_3; examTtsSeq = PlayTTS("请加到三挡"); } else if (upDownShift == 1) { upDownShift = -1; expectGear = GEAR_1; examTtsSeq = PlayTTS("请减到一挡"); } else { upDownShift = 1; expectGear = GEAR_3; examTtsSeq = PlayTTS("请加到三挡"); } break; } case GEAR_3: { if (upDownShift == 0) { upDownShift = -1; expectGear = GEAR_2; examTtsSeq = PlayTTS("请减到二挡"); } else if (upDownShift == 1) { upDownShift = -1; expectGear = GEAR_2; examTtsSeq = PlayTTS("请减到二挡"); } else { upDownShift = 1; expectGear = GEAR_4; examTtsSeq = PlayTTS("请加到四挡"); } break; } case GEAR_4: { if (upDownShift == 0) { upDownShift = -1; expectGear = GEAR_3; examTtsSeq = PlayTTS("请减到三挡"); } else if (upDownShift == 1) { upDownShift = -1; expectGear = GEAR_3; examTtsSeq = PlayTTS("请减到三挡"); } else { upDownShift = 1; expectGear = GEAR_5; examTtsSeq = PlayTTS("请加到五挡"); } break; } case GEAR_5: { upDownShift = -1; expectGear = GEAR_4; examTtsSeq = PlayTTS("请减到四挡"); break; } default: // 未读到有效挡位,继续尝试 if (readGearCnt > MAX_READ_GEAR) { DEBUG("总是读到空挡或无效挡位"); AddExamFault(31, &currRtkTime); testing = false; } else { AppTimer_add(CheckGear, 500); } break; } } else { DEBUG("检测挡位 %d", expectGear); opCnt++; // 检查挡位 if (ReadCarStatus(GEAR) != expectGear) { // 未按指令操作挡位,不合格 DEBUG("未按指令操作挡位"); AddExamFault(31, &currRtkTime); testing = false; } else if (opCnt < 2) { opGear = SEND_OP_INS; readGearCnt = 0; AppTimer_add(CheckGear, 500); } else { testing = false; } } } int ExecuteOperateGearExam(const struct RtkTime *rtkTime) { currRtkTime = *rtkTime; return testing ? 1 : -1; } void OperateGearTTSDone(int id) { // 等语音播报完毕后计时 if (id == examTtsSeq) { DEBUG("升降挡指令发出完毕 %d", id); opGear = CHECK_OP; AppTimer_add(CheckGear, D_SEC(7)); } }