fctom1215
2020-08-29 d05c25aa4823e9d2aa812e9c0e3d1d66bb9861dd
坐标
10个文件已修改
148 ■■■■■ 已修改文件
lib/src/main/cpp/driver_test.cpp 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/native-lib.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/rtk_platform/platform.cpp 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_common/car_sensor.cpp 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/change_lane.cpp 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/drive_straight.cpp 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/drive_straight.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/operate_gear.cpp 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/overtake.cpp 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/road_exam.cpp 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/driver_test.cpp
@@ -513,7 +513,8 @@
    if (TimeGetDiff(rtkTime, &cTime) >= D_SEC(3)) {
        cTime = *rtkTime;
        DEBUG("ENGINE_RPM %d OBD_SPEED %f SPEED %f",
        DEBUG("GEAR %d RPM %d OBD_SPEED %f SPEED %f",
                ReadCarStatus(GEAR) - GEAR_N,
                ReadCarStatus(ENGINE_RPM),
              ((double)ReadCarStatus(OBD_SPEED)) / 10.0,
              speed * 3.6);
lib/src/main/cpp/native-lib.cpp
@@ -27,7 +27,7 @@
const int RTK_PLATFORM_PORT = 12125;
const uint8_t phone[] = {0x20,0x19,0x10,0x15,0x00,0x00,0x00,0x01};
const char *VIRTUAL_RTK_IP = "192.168.1.6";
const char *VIRTUAL_RTK_IP = "192.168.1.7";
const int VIRTUAL_RTK_PORT = 9001;
static pthread_mutex_t tts_mutex = PTHREAD_MUTEX_INITIALIZER;
lib/src/main/cpp/rtk_platform/platform.cpp
@@ -489,6 +489,9 @@
        sensor.surround3 = data[x++];
        sensor.surround4 = data[x++];
        if (sensor.clutch == 1)
            sensor.gear = 0;
        UpdateSensor(&sensor);
    }
    if (events & CARD_UPDATE_EVT) {
lib/src/main/cpp/test_common/car_sensor.cpp
@@ -77,6 +77,7 @@
    memset(CarStatus, 0, sizeof(CarStatus));
    CarStatus[DOOR] = DOOR_CLOSE;
    CarStatus[GEAR] = GEAR_N;
    memset(&Sensor, 0, sizeof(Sensor));
@@ -265,7 +266,7 @@
static void SensorChanged(int id, int value)
{
    DEBUG("状态改变 %d = %d", id, value);
//    DEBUG("状态改变 %d = %d", id, value);
    switch (id) {
        case SENSOR_LEFT_TURN_SIGNAL: {
lib/src/main/cpp/test_items2/change_lane.cpp
@@ -18,6 +18,7 @@
{
    maxMoveDistance = ReadOdo();
    start = true;
    DEBUG("变道开始里程 %ld", maxMoveDistance);
}
void StartChaneLaneExam(int ori_lane)
@@ -41,7 +42,7 @@
    if (ReadOdo() - maxMoveDistance > 100) {
        // 超车未完成
        DEBUG("超车固定距离内未完成");
        DEBUG("变道固定距离内未完成 当前里程 %ld", ReadOdo());
        AddExamFault(3, rtkTime);
        return false;
    }
lib/src/main/cpp/test_items2/drive_straight.cpp
@@ -20,6 +20,7 @@
static int setup;
static double beginOdo;
static int yaw_stat;
static double offsetBase;
static void TtsBack(int seq)
{
@@ -33,9 +34,13 @@
    PlayTTS("请保持直线行驶", TtsBack);
}
bool TestDriveStraight(const car_model *car, const struct RtkTime *rtkTime) {
bool TestDriveStraight(road_exam_map &RoadMap, int roadIndex, const car_model *car, const struct RtkTime *rtkTime) {
    static double yaw;
    static Line baseLine;
    static double offset1, offset2;
    if (roadIndex < 0 || roadIndex >= RoadMap.roads.size())
        return false;
    if (setup == 1) {
        // 偏航角平均值
@@ -47,7 +52,7 @@
        yaws.push_back(car->yaw);
        yaw_stat++;
        if (yaw_stat == 5) {
        if (yaw_stat == 15) {
            yaw = AvgYaw(yaws);
            vector<double>().swap(yaws);
@@ -55,13 +60,28 @@
            PointF extPoint = PointExtend(car->basePoint, 100, yaw);
            MakeLine(&baseLine, &car->basePoint, &extPoint);
            beginOdo = ReadOdo();
            PointF px = CalcProjectionWithRoadEdge(RoadMap.roads[roadIndex].rightEdge, car->carXY[car->axial[AXIAL_FRONT]]);
            offsetBase = DistanceOf(px, car->carXY[car->axial[AXIAL_FRONT]]);
            DEBUG("起点偏离 %f", offsetBase);
            setup = 2;
        }
    } else if (setup == 2) {
        double offset = DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], baseLine);
        offset1 = DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], baseLine);
        if (offset > MAX_OFFSET_DISTANCE) {
            DEBUG("直线偏移大于30厘米 offset = %f", offset);
        if (offset1 > MAX_OFFSET_DISTANCE) {
            DEBUG("虚拟直线偏移大于30厘米 offset1 = %f", offset1);
//            // 偏移大于30厘米,不合格
//            AddExamFault(30, rtkTime);
//            return false;
        }
        PointF px = CalcProjectionWithRoadEdge(RoadMap.roads[roadIndex].rightEdge, car->carXY[car->axial[AXIAL_FRONT]]);
        offset2 = DistanceOf(px, car->carXY[car->axial[AXIAL_FRONT]]);
        if (fabs(offset2 - offsetBase) > MAX_OFFSET_DISTANCE) {
            DEBUG("直线偏移大于30厘米 offset2 = %f", fabs(offset2 - offsetBase));
            // 偏移大于30厘米,不合格
            AddExamFault(30, rtkTime);
            return false;
@@ -69,7 +89,8 @@
    }
    if (setup == 2 && ReadOdo() - beginOdo > CHECK_STAGE_DISTANCE) {
        DEBUG("直线行驶结束");
        DEBUG("直线行驶结束 offset1 = %f offset2 = %f", offset1, fabs(offset2 - offsetBase));
        PlayTTS("直线行驶结束", NULL);
        return false;
    }
lib/src/main/cpp/test_items2/drive_straight.h
@@ -8,6 +8,6 @@
#include "../driver_test.h"
void StartDriveStraightExam(void);
bool TestDriveStraight(const car_model *car, const struct RtkTime *rtkTime);
bool TestDriveStraight(road_exam_map &RoadMap, int roadIndex, const car_model *car, const struct RtkTime *rtkTime);
#endif //MYAPPLICATION2_DRIVE_STRAIGHT_H
lib/src/main/cpp/test_items2/operate_gear.cpp
@@ -47,9 +47,10 @@
    if (setup == 0) {
        return true;
    } else if (setup == 1) {
        if (sensor.value != GEAR_N)
        if (sensor.value != GEAR_N) {
            oldGear = sensor.value;
            DEBUG("准备首次换挡 GEAR = %d", oldGear);
        }
        switch (sensor.value) {
            case GEAR_1: {
                expectGear = GEAR_2;
@@ -89,49 +90,56 @@
        }
    } else if (setup == 2) {
        if (sensor.value == GEAR_N || sensor.value == oldGear) {
            DEBUG("等待首次换挡");
        } else if (sensor.value != expectGear) {
            // 未按指令操作挡位,不合格
            DEBUG("未按指令操作挡位");
            DEBUG("首次换挡错误 GEAR %d  希望 %d", sensor.value, expectGear);
            AddExamFault(31, rtkTime);
            return false;
        } else {
            // 在此挡位行驶一定距离,再执行下一个
            DEBUG("首次换挡成功,下一个...");
            oldGear = expectGear;
            shiftTime = *rtkTime;
            setup = 3;
        }
    } else if (setup == 3) {
        if (TimeGetDiff(&shiftTime, rtkTime) >= D_SEC(4)) {
        if (TimeGetDiff(rtkTime, &shiftTime) >= D_SEC(3)) {
            setup = 4;
            char buff[128];
            expectGear += 0 - upDownShift;
            sprintf(buff, "请%s到%d挡", upDownShift > 0 ? "减": "加", expectGear - GEAR_N);
            PlayTTS(buff, NULL);
            DEBUG("%s", buff);
            DEBUG("准备二次换挡 希望 %d", expectGear);
        }
    } 
    else if (setup == 4) {
        if (sensor.value == GEAR_N || sensor.value == oldGear) {
            DEBUG("等待二次换挡");
        } else if (sensor.value != expectGear) {
            // 未按指令操作挡位,不合格
            DEBUG("未按指令操作挡位");
            DEBUG("二次换挡错误 GEAR %d  希望 %d", sensor.value, expectGear);
            AddExamFault(31, rtkTime);
            return false;
        } else {
            // 在此挡位行驶一定距离,再执行下一个
            shiftTime = *rtkTime;
            setup = 5;
            DEBUG("二次换挡成功,下一个...");
        }
    } else if (setup == 5) {
        if (TimeGetDiff(&shiftTime, rtkTime) >= D_SEC(5)) {
        if (TimeGetDiff(rtkTime, &shiftTime) >= D_SEC(3)) {
            PlayTTS("加减挡位操作结束", NULL);
            DEBUG("加减挡位操作结束");
            return false;
        }
    }
    if (ReadOdo() - maxMoveDistance > 120) {
        // 未按指令操作挡位,不合格
        DEBUG("未按指令操作挡位");
        DEBUG("未按指令操作挡位,超时");
        AddExamFault(31, rtkTime);
        return false;
    }
lib/src/main/cpp/test_items2/overtake.cpp
@@ -18,6 +18,7 @@
{
    maxMoveDistance = ReadOdo();
    setup = 1;
    DEBUG("超车开始里程 %ld", maxMoveDistance);
}
void StartOvertakeExam(int ori_lane)
@@ -61,7 +62,7 @@
    if (ReadOdo() - maxMoveDistance > 150) {
        // 超车未完成
        DEBUG("超车固定距离内未完成");
        DEBUG("超车固定距离内未完成 当前里程 %ld", ReadOdo());
        AddExamFault(3, rtkTime);
        return false;
    }
lib/src/main/cpp/test_items2/road_exam.cpp
@@ -72,7 +72,7 @@
const double SLIDE_DISTANCE_THRESHOLD_RED = 0.3;
const double SLIDE_DISTANCE_THRESHOLD_YELLOW = 0.1;
const double EXAM_RANGE = 3000.0;                       // 至少驾驶距离
const double EXAM_RANGE = 2700.0;                       // 至少驾驶距离
static bool occurOverSpeed;
static bool occurSecondBreak;
@@ -93,6 +93,8 @@
static struct RtkTime gearErrorTimePoint;
static struct RtkTime gearNSlideTimePoint;
static car_sensor_value_t turnSignalStatus;
static int gearErrorTime;
@@ -127,13 +129,14 @@
} RoadExamItem_t;
static map<int, int> RoadExamItem;
static int RoadExamStatus;
static bool win;
static struct RtkTime beginTurnTime, prevDetectTurnTime;
static int startTurnYaw, prevYaw;
static int turnCnt, turnTimeCnt;
static int prevTurnWise;
static const uint32_t GEAR_N_SLIDE_TIMEOUT = D_SEC(5);
static const uint32_t GEAR_N_SLIDE_TIMEOUT = D_SEC(10);
static const uint32_t GEAR_ERROR_TIMEOUT = D_SEC(15);
static const uint32_t STOP_CAR_TIME = D_SEC(2);
static const uint32_t CHANGE_LANE_MIN_INTERVAL = D_SEC(10);
@@ -199,6 +202,8 @@
    RoadExamItem[ROAD_EXAM_ITEM_CAR_STOP] = ROAD_EXAM_ITEM_NOT_EXEC;
    RoadExamStatus = ROAD_EXAM_READY_NEXT;
    win = false;
}
void TerminateRoadExam(void)
@@ -879,7 +884,7 @@
            checkCrashGreenTimeout = 0;
            // 记录开始压线的时间,不确定是否有变道意图,待确认变道后再处理之
            crashGreenStartTime = *rtkTime;
            turnSignalStatus = ReadCarSensorValue(TURN_SIGNAL_LAMP);
            DEBUG("开始压虚线 %02d-%02d-%02d %02d:%02d:%02d", crashGreenStartTime.YY, crashGreenStartTime.MM, crashGreenStartTime.DD, crashGreenStartTime.hh, crashGreenStartTime.mm, crashGreenStartTime.ss, crashGreenStartTime.mss * 10);
        }
        crashDottedLine = true;
@@ -926,40 +931,45 @@
        if (newLane.road == Lane.road && newLane.sep == Lane.sep) {
            gain = newLane.no - Lane.no;
        } else {
            DEBUG("车道分段切换");
            DEBUG("车道分段切换 Old Lane road = %d sep = %d no = %d New Lane road = %d sep = %d no = %d", Lane.road, Lane.sep, Lane.no, newLane.road, newLane.sep, newLane.no);
            ChangeLane.gain = 0;
        }
        // 检查转向灯
        if (gain != 0) {
            DEBUG("变道 new lane %d, gain %d", newLane.no, gain);
            car_sensor_value_t lamp = ReadCarSensorValue(TURN_SIGNAL_LAMP);
            if (lamp.name == TURN_SIGNAL_LAMP) {
                if (gain < 0) {
                    if (lamp.value != LEFT_TURN_LIGHT) {
                if (turnSignalStatus.value != LEFT_TURN_LIGHT) {
                        DEBUG("变调未打灯!!");
                        // 没打灯,不合格
                        AddExamFault(13, rtkTime);
                    } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) < TURN_SIGNAL_LAMP_ADVANCE) {
                } else if (TimeGetDiff(&crashGreenStartTime, &turnSignalStatus.time) <
                           TURN_SIGNAL_LAMP_ADVANCE) {
                        DEBUG("转向灯时间不足 %02d-%02d-%02d %02d:%02d:%02d.%03d  -> %02d-%02d-%02d %02d:%02d:%02d.%03d",
                              crashGreenStartTime.YY, crashGreenStartTime.MM, crashGreenStartTime.DD, crashGreenStartTime.hh, crashGreenStartTime.mm, crashGreenStartTime.ss, crashGreenStartTime.mss * 10,
                              lamp.time.YY, lamp.time.MM, lamp.time.DD, lamp.time.hh, lamp.time.mm, lamp.time.ss, lamp.time.mss * 10);
                          crashGreenStartTime.YY, crashGreenStartTime.MM, crashGreenStartTime.DD,
                          crashGreenStartTime.hh, crashGreenStartTime.mm, crashGreenStartTime.ss,
                          crashGreenStartTime.mss * 10,
                          turnSignalStatus.time.YY, turnSignalStatus.time.MM, turnSignalStatus.time.DD, turnSignalStatus.time.hh,
                          turnSignalStatus.time.mm, turnSignalStatus.time.ss, turnSignalStatus.time.mss * 10);
                        // 不足3秒,不合格
                        AddExamFault(14, rtkTime);
                    }
                } else {
                    if (lamp.value != RIGHT_TURN_LIGHT) {
                if (turnSignalStatus.value != RIGHT_TURN_LIGHT) {
                        DEBUG("变调未打灯!!");
                        // 没打灯,不合格
                        AddExamFault(13, rtkTime);
                    } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) < TURN_SIGNAL_LAMP_ADVANCE) {
                } else if (TimeGetDiff(&crashGreenStartTime, &turnSignalStatus.time) <
                           TURN_SIGNAL_LAMP_ADVANCE) {
                        DEBUG("转向灯时间不足 %02d-%02d-%02d %02d:%02d:%02d.%03d  -> %02d-%02d-%02d %02d:%02d:%02d.%03d",
                              crashGreenStartTime.YY, crashGreenStartTime.MM, crashGreenStartTime.DD, crashGreenStartTime.hh, crashGreenStartTime.mm, crashGreenStartTime.ss, crashGreenStartTime.mss * 10,
                              lamp.time.YY, lamp.time.MM, lamp.time.DD, lamp.time.hh, lamp.time.mm, lamp.time.ss, lamp.time.mss * 10);
                          crashGreenStartTime.YY, crashGreenStartTime.MM, crashGreenStartTime.DD,
                          crashGreenStartTime.hh, crashGreenStartTime.mm, crashGreenStartTime.ss,
                          crashGreenStartTime.mss * 10,
                          turnSignalStatus.time.YY, turnSignalStatus.time.MM, turnSignalStatus.time.DD, turnSignalStatus.time.hh,
                          turnSignalStatus.time.mm, turnSignalStatus.time.ss, turnSignalStatus.time.mss * 10);
                        // 不足3秒,不合格
                        AddExamFault(14, rtkTime);
                    }
                }
            }
@@ -1238,6 +1248,11 @@
    UpdataOdo(speed, moveDirect, rtkTime);
    if (!win) {
        win = true;
        turnSignalStatus = ReadCarSensorValue(TURN_SIGNAL_LAMP);
    }
    // 刹车提示音
    RingBreak();
@@ -1323,6 +1338,7 @@
    
    // 挡位不匹配超时
    if (currGearError && prevGearError) {
        DEBUG("挡位错误增加 %ld毫秒 当前挡位 %d 时速 %f", TimeGetDiff(rtkTime, &gearErrorTimePoint), ReadCarStatus(GEAR), ConvertMs2KMh(speed));
        gearErrorTime += TimeGetDiff(rtkTime, &gearErrorTimePoint);
    }
    if (gearErrorTime > GEAR_ERROR_TIMEOUT) {
@@ -1425,10 +1441,11 @@
//    DEBUG("Lane信息 road %d sep %d total %d no %d guide %d", Lane.road, Lane.sep, Lane.total, Lane.no, Lane.guide);
    if (Lane.guide > 0 && currExamMapIndex >= 0) {
        int stop_line_index;
        int act = NearbyCrossingGuide(stop_line_index, currExamMapIndex, RoadMap.roads[currExamMapIndex], car);
        if (!(NearbyCrossingGuide(stop_line_index, currExamMapIndex, RoadMap.roads[currExamMapIndex], car) & Lane.guide)) {
        if (act != 0 && !(act & Lane.guide)) {
            if (!GetErrorLaneRpt(currExamMapIndex, stop_line_index)) {
                DEBUG("不按规定车道标向行驶 %d: %d  guide = %d", currExamMapIndex, stop_line_index, Lane.guide);
                DEBUG("不按规定车道标向行驶 %d: %d  期望 = %d guide = %d", currExamMapIndex, stop_line_index, act, Lane.guide);
                AddExamFault(9, rtkTime);
                SetErrorLaneRpt(currExamMapIndex, stop_line_index, true);
            }
@@ -1547,7 +1564,7 @@
                testing = TestOvertake(Lane.no, rtkTime);
                break;
            case ROAD_EXAM_ITEM_STRAIGHT:
                testing = TestDriveStraight(car, rtkTime);
                testing = TestDriveStraight(RoadMap, roadIndex, car, rtkTime);
                break;
            case ROAD_EXAM_ITEM_CAR_STOP:
                testing = TestStopCar(RoadMap, roadIndex, car, moveDirect, rtkTime);
@@ -1650,6 +1667,8 @@
            turnCnt++;
            beginTurnTime = *rtkTime;
            startTurnYaw = (int) car->yaw;
            turnSignalStatus = ReadCarSensorValue(TURN_SIGNAL_LAMP);
        }
    } else if (turnCnt == 1) {
        if (angle != 0 && moveDirect != 0) {
@@ -1661,6 +1680,8 @@
            } else {
                beginTurnTime = *rtkTime;
                startTurnYaw = (int) car->yaw;
                turnSignalStatus = ReadCarSensorValue(TURN_SIGNAL_LAMP);
            }
        } else {
            turnCnt = 0;
@@ -1676,28 +1697,27 @@
                // 确认转弯行为,检测开始刚转弯时转向灯情况
                turnCnt = -1;
                car_sensor_value_t lamp = ReadCarSensorValue(TURN_SIGNAL_LAMP);
                if (lamp.name == TURN_SIGNAL_LAMP) {
                    if (wise < 0) {
                        if (lamp.value != LEFT_TURN_LIGHT) {
                    if (turnSignalStatus.value != LEFT_TURN_LIGHT) {
                            DEBUG("变调未打灯!!");
                            // 没打灯,不合格
                            AddExamFault(13, rtkTime);
                        } else if (TimeGetDiff(&beginTurnTime, &lamp.time) < TURN_SIGNAL_LAMP_ADVANCE) {
                    } else if (TimeGetDiff(&beginTurnTime, &turnSignalStatus.time) <
                               TURN_SIGNAL_LAMP_ADVANCE) {
                            DEBUG("转向灯时间不足");
                            // 不足3秒,不合格
                            AddExamFault(14, rtkTime);
                        }
                    } else {
                        if (lamp.value != RIGHT_TURN_LIGHT) {
                    if (turnSignalStatus.value != RIGHT_TURN_LIGHT) {
                            DEBUG("变调未打灯!!");
                            // 没打灯,不合格
                            AddExamFault(13, rtkTime);
                        } else if (TimeGetDiff(&beginTurnTime, &lamp.time) < TURN_SIGNAL_LAMP_ADVANCE) {
                    } else if (TimeGetDiff(&beginTurnTime, &turnSignalStatus.time) <
                               TURN_SIGNAL_LAMP_ADVANCE) {
                            DEBUG("转向灯时间不足");
                            // 不足3秒,不合格
                            AddExamFault(14, rtkTime);
                        }
                    }
                }
            } else if (turnTimeCnt > D_SEC(10)) {