yy1717
2020-04-02 24428a1b69afcf113883e9cede1159443201a1b8
lib/src/main/cpp/test_items/park_bottom.cpp
@@ -9,6 +9,7 @@
#include "../jni_log.h"
#include "../driver_test.h"
#include "../utils/xconvert.h"
#include "../master/comm_if.h"
#include <vector>
#include <cstdlib>
@@ -27,7 +28,8 @@
const int PARK_TIMEOUT = D_SEC(210);
static bool testing = false;
static bool testing = false, reverseCar = false;
static int mapIndex = 0;
const uint32_t STOP_CAR_TIME = D_SEC(2);
static uint32_t stopTimepoint;
@@ -44,13 +46,15 @@
static char CrossCtrlLine(const Polygon *map, const car_model *car, const car_model *prev_car);
static bool EnterParking(const Polygon *map, const car_model *car);
static bool CrashRedLine(const Polygon *map, const car_model *car);
static bool CrashRedLine(const Polygon *map, const car_model *car, int &who);
static bool ExitParkArea(const Polygon *map, const car_model *car);
void StartParkBottom(int moveDirect, const struct RtkTime *rtkTime)
void StartParkBottom(int index, int moveDirect, const struct RtkTime *rtkTime)
{
    DEBUG("StartParkBottom");
    testing = true;
    reverseCar = false;
    mapIndex = index;
    memset(carray, 0, sizeof(carray));
    memset(darray, 0, sizeof(darray));
    memset(parkStatus, 0, sizeof(parkStatus));
@@ -69,12 +73,13 @@
{
    char crossCtrlLine = 0;
    uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
    int who = 0;
    if (ExitParkArea(map, car)) {
        DEBUG("离开场地");
        // 离开场地
        testing = false;
        if ((parkStatus[0] != 1 || parkStatus[1] != 1) && !reportParkFail) {
        if ((parkStatus[0] != 1 || parkStatus[1] != 1) && !reportParkFail && reverseCar) {
            // 倒库不入,不合格
            reportParkFail = true;
            AddExamFault(8, rtkTime);
@@ -83,12 +88,18 @@
        goto TEST_END;
    }
    if (CrashRedLine(map, car)) {
    if (CrashRedLine(map, car, who)) {
        if (!occurCrashRedLine) {
            occurCrashRedLine = true;
            // 车身出线,不合格
            AddExamFault(7, rtkTime);
            DEBUG("车轮压线");
            if (who == 1) {
                PlayTTS("压左库位线");
            } else if (who == 2) {
                PlayTTS("压右库位线");
            }
        }
    } else {
        occurCrashRedLine = false;
@@ -153,6 +164,10 @@
                }
            } else if (moveDirect == -1) {
                // 切换为倒车
                if (!reverseCar) {
                    reverseCar = true;
                    MA_EnterMap(mapIndex, MAP_TYPE_PARK_BUTTOM, 1);
                }
                if (darray[parkCount] == 0) {
                    if (!crossCtrlLineSw) {
                        // 倒车前,前轮未驶过控制线
@@ -160,7 +175,7 @@
                        DEBUG("倒车前,前轮未驶过控制线");
                    }
                    darray[parkCount] = 1;
                    firstReverseTimepoint = tp;
                    firstReverseTimepoint = tp;         // 首次倒车,才意味着此项目开始
                }
            } else {
                // 切换为前进
@@ -209,6 +224,9 @@
    }
TEST_END:
    if (!testing && reverseCar) {
        MA_EnterMap(mapIndex, MAP_TYPE_PARK_BUTTOM, 0);
    }
    return testing ? 1 : 0;
}
@@ -258,7 +276,7 @@
    return succ;
}
static bool CrashRedLine(const Polygon *map, const car_model *car)
static bool CrashRedLine(const Polygon *map, const car_model *car, int &who)
{
    bool ret = false;
@@ -276,6 +294,12 @@
    for (int i = 0; i < sizeof(red_lines) / sizeof(red_lines[0]); ++i) {
        MakeLine(&red_line, &(map->point[red_lines[i][0]]), &(map->point[red_lines[i][1]]));
        if (IntersectionOf(red_line, &car_body) != GM_None) {
            if (i == 2 || i == 1) {
                who = 1;
            } else if (i == 4 || i == 5) {
                who = 2;
            }
            ret = true;
            break;
        }