//
|
// 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("<operate_gear> <%s>: " fmt, __func__, ##args)
|
|
static int opGear;
|
static bool testing;
|
static int examTtsSeq = 0;
|
static int expectGear;
|
static int upDownShift;
|
static bool checkError;
|
static int opCnt = 0;
|
|
enum {
|
START_GEAR,
|
WAIT_TTS_END,
|
TTS_END,
|
WAITE_CHECK,
|
CHECKED
|
};
|
|
static void CheckGear(union sigval sig);
|
|
void StartOperateGearExam(int index, LIST_ROAD_MAP &RoadMapList) {
|
if (index == -1)
|
return;
|
|
testing = true;
|
opGear = START_GEAR;
|
checkError = false;
|
upDownShift = 0;
|
opCnt = 0;
|
}
|
|
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);
|
|
if (opGear == START_GEAR) {
|
int currGear = ReadCarStatus(GEAR);
|
switch (currGear) {
|
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;
|
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: {
|
opGear = WAIT_TTS_END;
|
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: {
|
opGear = WAIT_TTS_END;
|
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: {
|
opGear = WAIT_TTS_END;
|
upDownShift = -1;
|
expectGear = GEAR_4;
|
examTtsSeq = PlayTTS("请减到四挡");
|
break;
|
}
|
default:
|
// 未读到有效挡位,继续尝试
|
break;
|
}
|
} else if (opGear == WAIT_TTS_END) {
|
|
} else if (opGear == TTS_END) {
|
opCnt++;
|
opGear = WAITE_CHECK;
|
checkError = false;
|
AppTimer_delete(CheckGear);
|
AppTimer_add(CheckGear, D_SEC(5));
|
} else if (opGear == CHECKED) {
|
if (checkError) {
|
// 未按指令操作挡位,不合格
|
DEBUG("未按指令操作挡位");
|
AddExamFault(31, rtkTime);
|
}
|
|
if (opCnt < 2) {
|
opGear = START_GEAR;
|
} else {
|
testing = false;
|
}
|
}
|
|
return testing ? index : -1;
|
}
|
|
void OperateGearTTSDone(int id)
|
{
|
DEBUG("OperateGearTTSDone %d", id);
|
// 等语音播报完毕后计时
|
if (id == examTtsSeq) {
|
opGear = TTS_END;
|
}
|
}
|
|
static void CheckGear(union sigval sig)
|
{
|
AppTimer_delete(CheckGear);
|
|
DEBUG("检测挡位 %d", expectGear);
|
// 检查挡位
|
if (ReadCarStatus(GEAR) != expectGear) {
|
// 不执行指定挡位,不合格
|
checkError = true;
|
}
|
opGear = CHECKED;
|
}
|