fctom1215
2020-08-28 bf8e1f4ef4961b32dfa73a0b898f82c20721bf09
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//
// Created by YY on 2020/8/20.
//
 
#include "car_start.h"
#include "../driver_test.h"
#include "../test_common/odo_graph.h"
#include "../native-lib.h"
#include "../test_common/car_sensor.h"
#include "road_exam.h"
#include "../jni_log.h"
#include "../common/apptimer.h"
 
#define DEBUG(fmt, args...)     LOGD("<road_exam car_start> <%s>: " fmt, __func__, ##args)
 
static const int MAX_ENGINE_RPM = 2500;
static const double START_CAR_MOVE_DISTANCE = 10.0;
static const double START_CAR_CHECK_DOOR_DISTANCE = 1.0;
 
static double startCarMoveDistance;
static bool checkEngineRPM, checkStartCarSignal, checkDoor, handBreakActive;
 
void cb(int seq)
{
    DEBUG("语音结束 %d", seq);
}
 
void CarStartInit(void)
{
    startCarMoveDistance = ReadOdo();
    checkEngineRPM = false;
    checkStartCarSignal = false;
    checkDoor = false;
    handBreakActive = false;
    PlayTTS("请起步", cb);
 
    DEBUG("车辆起步");
}
 
bool TestCarStart(const car_model *car, double speed, int moveDirect, const struct RtkTime *rtkTime)
{
    car_sensor_value_t sensor;
    double moveDistance = ReadOdo() - startCarMoveDistance;
 
//    DEBUG("起步行驶距离 %f", moveDistance);
 
    if (!checkStartCarSignal && moveDirect == 1) {
        checkStartCarSignal = true;
 
        sensor = ReadCarSensorValue(TURN_SIGNAL_LAMP);
        if (sensor.name == TURN_SIGNAL_LAMP) {
            if (sensor.value != LEFT_TURN_LIGHT) {
                DEBUG("变调未打灯!!");
                // 没打灯,不合格
                AddExamFault(13, rtkTime);
            } else if (TimeGetDiff(rtkTime, &sensor.time) < D_SEC(3)) {
                DEBUG("转向灯时间不足");
                // 不足3秒,不合格
                AddExamFault(14, rtkTime);
            }
        }
    }
 
    if (moveDistance > START_CAR_MOVE_DISTANCE) {
        sensor = ReadCarSensorValue(HAND_BREAK);
 
        if (sensor.name == HAND_BREAK && sensor.value == BREAK_ACTIVE) {
            DEBUG("Handbreak active move over 10m");
            // 手刹拉起状态下,行驶了10米以上,不合格
            AddExamFault(25, rtkTime);
        } else if (handBreakActive) {
            // 手刹拉起状态下,行驶了1米以上,扣10分
            DEBUG("Handbreak active move over 1M");
            AddExamFault(26, rtkTime);
        }
 
        PlayTTS("完成起步", NULL);
        DEBUG("############# 完成起步 ############");
 
        return false;
    } else if (moveDistance >= START_CAR_CHECK_DOOR_DISTANCE) {
        if (!checkDoor) {
            checkDoor = true;
 
            sensor = ReadCarSensorValue(DOOR);
            if (sensor.name == DOOR && sensor.value == DOOR_OPEN) {
                // 车门未完全关闭,不合格
                DEBUG("车门未关闭");
                AddExamFault(23, rtkTime);
            }
 
            sensor = ReadCarSensorValue(HAND_BREAK);
            if (sensor.name == HAND_BREAK && sensor.value == BREAK_ACTIVE) {
                handBreakActive = true;
            }
        }
    }
 
    if (ReadCarStatus(ENGINE_RPM) > MAX_ENGINE_RPM && !checkEngineRPM) {
        // 转速超标,不合格
        DEBUG("转速超标");
        AddExamFault(29, rtkTime);
        checkEngineRPM = true;
    }
 
    return true;
}