//
|
// Created by YY on 2020/3/9.
|
//
|
|
#include <cstdlib>
|
#include "../common/apptimer.h"
|
#include "dummy_light.h"
|
#include "../native-lib.h"
|
#include "../jni_log.h"
|
#include "../test_common/car_sensor.h"
|
|
#define DEBUG(fmt, args...) LOGD("<dummy_light> <%s>: " fmt, __func__, ##args)
|
|
static struct RtkTime currRtkTime;
|
static struct dummy_light_exam *content;
|
static int contentNum;
|
static int currContent;
|
static int checkCnt;
|
static bool turn_left_active, flash_beam_active;
|
|
static void DummyLightCheckActive(union sigval sig);
|
static void ExamDummyLight(union sigval sig);
|
|
void StartDummyLightExam(struct dummy_light_exam *ptr, int num, const struct RtkTime* rtkTime)
|
{
|
DEBUG("StartDummyLightExam");
|
content = ptr;
|
contentNum = num;
|
currContent = 0;
|
currRtkTime = *rtkTime;
|
|
AppTimer_delete(DummyLightCheckActive);
|
AppTimer_delete(ExamDummyLight);
|
AppTimer_add(ExamDummyLight, D_SEC(2));
|
}
|
|
int ExecuteDummyLightExam(const struct RtkTime* rtkTime)
|
{
|
currRtkTime = *rtkTime;
|
return (currContent == contentNum)?2:1;
|
}
|
|
void DummyLightTTSDone(int id)
|
{
|
DEBUG("DummyLightTTSDone %d", id);
|
// 等语音播报完毕后计时
|
if (id == 100) {
|
AppTimer_add(DummyLightCheckActive, D_SEC(3), id);
|
} else if (id == 101) {
|
AppTimer_add(DummyLightCheckActive, D_SEC(1), id);
|
} else if (id == OVERTAKE) {
|
checkCnt = 0;
|
turn_left_active = flash_beam_active = false;
|
AppTimer_add(DummyLightCheckActive, D_SEC(1), id);
|
} else {
|
AppTimer_add(DummyLightCheckActive, D_SEC(5), id);
|
}
|
}
|
|
static void DummyLightCheckActive(union sigval sig)
|
{
|
AppTimer_delete(DummyLightCheckActive);
|
|
DEBUG("DummyLightCheckActive %d", sig.sival_int);
|
|
switch (sig.sival_int) {
|
case DRIVE_AT_NIGHT:
|
case TURN_ON_MAIN_BEAM_LAMP:
|
if (ReadCarStatus(MAIN_BEAM_LAMP) != MAIN_BEAM_LIGHT) {
|
AddExamFault(58, &currRtkTime);
|
}
|
break;
|
case TURN_ON_DIPPED_LAMP:
|
case BRIDGE_MEET_CAR:
|
case FOLLOW_CAR:
|
if (ReadCarStatus(DIPPED_BEAM_LAMP) != DIPPED_BEAM_LIGHT) {
|
AddExamFault(58, &currRtkTime);
|
}
|
break;
|
case DRIVE_IN_FOG:
|
if (ReadCarStatus(FOG_LAMP) != FOG_LIGHT) {
|
AddExamFault(58, &currRtkTime);
|
}
|
break;
|
case THROUGE_CROSSWALK:
|
case THROUGE_CURVE:
|
case THROUGE_CROSSROADS:
|
if (ReadCarStatus(FLASH_BEAM_LAMP) != FLASH_BEAM_LIGHT) {
|
AddExamFault(58, &currRtkTime);
|
}
|
break;
|
case OVERTAKE:
|
if (++checkCnt < 5) {
|
if (!flash_beam_active) {
|
if (ReadCarStatus(TURN_SIGNAL_LAMP) == LEFT_TURN_LIGHT) {
|
turn_left_active = true;
|
}
|
}
|
if (turn_left_active) {
|
if (ReadCarStatus(FLASH_BEAM_LAMP) == FLASH_BEAM_LIGHT) {
|
flash_beam_active = true;
|
}
|
}
|
AppTimer_add(DummyLightCheckActive, D_SEC(1), OVERTAKE);
|
return;
|
} else {
|
if (!flash_beam_active || !turn_left_active) {
|
AddExamFault(58, &currRtkTime);
|
}
|
}
|
break;
|
case CAR_FAULT:
|
case PARK_CAR_TEMP:
|
if (ReadCarStatus(TURN_SIGNAL_LAMP) != HAZARD_LIGHTS) {
|
AddExamFault(58, &currRtkTime);
|
}
|
break;
|
default:
|
break;
|
}
|
|
AppTimer_add(ExamDummyLight, D_SEC(1));
|
}
|
|
static void ExamDummyLight(union sigval sig)
|
{
|
AppTimer_delete(ExamDummyLight);
|
|
if (currContent < contentNum) {
|
DEBUG("模拟灯光测试 %s", content[currContent].tts);
|
|
PlayTTS(content[currContent].tts, content[currContent].item);
|
currContent++;
|
}
|
}
|