//
|
// 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 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));
|
}
|
}
|