yy1717
2020-07-23 27c78b3431a38878b8c8b1b81c79694cea4a2bcf
20200723
6个文件已修改
218 ■■■■ 已修改文件
lib/src/main/cpp/native-lib.cpp 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/rtk_module/rtk.cpp 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/rtk_module/rtk.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/drive_straight.cpp 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/dummy_light.cpp 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/road_exam.cpp 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/native-lib.cpp
@@ -272,8 +272,15 @@
}
static void SendBootIndicate(union sigval sig) {
    static int n = 0;
    AppTimer_delete(SendBootIndicate);
    MA_NdkStart();
    n++;
    if (n < 3) {
        AppTimer_add(SendBootIndicate, D_SEC(1));
    }
}
extern "C"
lib/src/main/cpp/rtk_module/rtk.cpp
@@ -38,7 +38,7 @@
static gpsStatus_t gpsStatus;
static rtk_info CurrRTKInfo;
static bool needSetPjk = false;
static void CheckPjkParam(void);
static void CheckPjkParamTimeout(union sigval sig);
@@ -84,55 +84,58 @@
void handleRTKRebootComp(const struct nmea *s)
{
    DEBUG("RTK Reboot complete!!");
    SetAYFactoryParam(5);
    CheckPjkParam();
}
void handlePJKParam(const struct nmea *s) {
//PJK Parameter: A:6378137.000, 1/F:298.257223563, B0:0.000000deg, L0:120.000000, N0:0.000, E0:500000.000.
//PJK Parameter: A:6378137.000, 1/F:298.257223563, B0:29.512453deg, L0:106.455336, N0:0.000, E0:0.000.
    bool setparam = true;
    const char DP1[] = "A:6378137.000";
    const char DP2[] = "1/F:298.257223563";
    const char DP3[] = "B0:29.512453deg";
    const char DP4[] = "L0:106.455336";
    const char DP5[] = "N0:0.000";
    const char DP6[] = "E0:0.000";
//    bool setparam = true;
//
//    const char DP1[] = "A:6378137.000";
//    const char DP2[] = "1/F:298.257223563";
//    const char DP3[] = "B0:29.512453deg";
//    const char DP4[] = "L0:106.455336";
//    const char DP5[] = "N0:0.000";
//    const char DP6[] = "E0:0.000";
    AppTimer_delete(CheckPjkParamTimeout);
    for (int i = 0; i < s->nmea_num; ++i) {
        char out[64] = {0};
//    for (int i = 0; i < s->nmea_num; ++i) {
//        char out[64] = {0};
//
//        memcpy(out, s->nmea_value[i].data, s->nmea_value[i].length);
//
//        DEBUG("handlePJKParam = %s", out);
//    }
//
//    if (s->nmea_num != 6) return;
//
//    if (memcmp(s->nmea_value[0].data, DP1, strlen(DP1))) {
//        setparam = true;
//    }
//    if (memcmp(s->nmea_value[1].data, DP2, strlen(DP2))) {
//        setparam = true;
//    }
//    if (memcmp(s->nmea_value[2].data, DP3, strlen(DP3))) {
//        setparam = true;
//    }
//    if (memcmp(s->nmea_value[3].data, DP4, strlen(DP4))) {
//        setparam = true;
//    }
//    if (memcmp(s->nmea_value[4].data, DP5, strlen(DP5))) {
//        setparam = true;
//    }
//    if (memcmp(s->nmea_value[5].data, DP6, strlen(DP6))) {
//        setparam = true;
//    }
//
//    if (setparam) {
//        SetAYFactoryParam(5);
//    }
        memcpy(out, s->nmea_value[i].data, s->nmea_value[i].length);
        DEBUG("handlePJKParam = %s", out);
    }
    if (s->nmea_num != 6) return;
    if (memcmp(s->nmea_value[0].data, DP1, strlen(DP1))) {
        setparam = true;
    }
    if (memcmp(s->nmea_value[1].data, DP2, strlen(DP2))) {
        setparam = true;
    }
    if (memcmp(s->nmea_value[2].data, DP3, strlen(DP3))) {
        setparam = true;
    }
    if (memcmp(s->nmea_value[3].data, DP4, strlen(DP4))) {
        setparam = true;
    }
    if (memcmp(s->nmea_value[4].data, DP5, strlen(DP5))) {
        setparam = true;
    }
    if (memcmp(s->nmea_value[5].data, DP6, strlen(DP6))) {
        setparam = true;
    }
    if (setparam) {
        SetAYFactoryParam(5);
    }
    SetAYFactoryParam(5);
    needSetPjk = true;
}
void SetAYFactoryParam(int freq)
@@ -155,8 +158,19 @@
        WriteSerialPort(RTK_MODULE_UART, cmd, strlen(cmd));
    }
    WriteSerialPort(RTK_MODULE_UART, AY_PJKPARAM, strlen(AY_PJKPARAM));
//    WriteSerialPort(RTK_MODULE_UART, AY_PJKPARAM, strlen(AY_PJKPARAM));
//    WriteSerialPort(RTK_MODULE_UART, SAVECONFIG, strlen(SAVECONFIG));
}
void SetPjkPara(int centLon)
{
    char buff[64];
    sprintf(buff, "set pjkpara 6378137 298.257223563 0 %d 0 500000\r\n", centLon);
    WriteSerialPort(RTK_MODULE_UART, buff, strlen(buff));
    DEBUG("%s", buff);
}
void GetGpsStatus(gpsStatus_t &data)
@@ -229,6 +243,8 @@
void handleGPGGA(const struct nmea *s)
{
    static uint32_t qfCnt = 0;
    DEBUG("handleGPGGA num = %d", s->nmea_num);
    if (s->nmea_num >= 10) {
        gpsStatus.gps_status = str2int(s->nmea_value[5].data, s->nmea_value[5].length);
@@ -263,6 +279,18 @@
        gpsStatus.mm = mm;
        gpsStatus.ss = ss;
        gpsStatus.mss = mss;
        // 计算中央子午线
        int qf = str2int(s->nmea_value[5].data, s->nmea_value[5].length);
        if (qf > 0) {
            qfCnt++;
            if (needSetPjk && qfCnt >= 3) {
                needSetPjk = false;
                SetPjkPara(((int) (lon1 / 3.0 + 0.5)) * 3);
            }
        } else {
            qfCnt = 0;
        }
    }
}
lib/src/main/cpp/rtk_module/rtk.h
@@ -44,5 +44,6 @@
void RebootModule(void);
void SetAYFactoryParam(int freq);
void GetGpsStatus(gpsStatus_t &data);
void SetPjkPara(int centLon);
#endif //RTKDRIVERTEST_RTK_H
lib/src/main/cpp/test_items2/drive_straight.cpp
@@ -72,9 +72,9 @@
        reportOffsetOver = true;
        //////////////////////////////////////////////
        startPoint = car->basePoint;
        edgeDistance = dis2roadEdge;
        reportOffsetOver = false;
//        startPoint = car->basePoint;
//        edgeDistance = dis2roadEdge;
//        reportOffsetOver = false;
    }
    if (distanceToStart > CHECK_STAGE_DISTANCE) {
@@ -99,6 +99,7 @@
    if (id == examTtsSeq) {
        DEBUG("StopCarTTSDone %d", id);
        ttsPlayEnd = 1;
        AppTimer_delete(PlayTTSTimeout);
    }
}
@@ -141,9 +142,11 @@
FIND_VP_END:
    if (get_vp) {
        DEBUG("得到垂点 %d: %f, %f -- %f, %f", road.id, car->basePoint.X, car->basePoint.Y, vp.X, vp.Y);
        distance = DistanceOf(car->basePoint, vp);
    } else {
        // 没有找到匹配线端,按最小距离顶点计算
        DEBUG("无垂点");
        distance = 100;
        for (int i = 0; i < road.leftEdge.size(); ++i) {
            for (int j = 0; j < road.leftEdge[i].points.size(); ++j) {
lib/src/main/cpp/test_items2/dummy_light.cpp
@@ -38,16 +38,20 @@
    content = ptr;
    contentNum = num;
    currRtkTime = *rtkTime;
    if (content != NULL && num > 0) {
        currRtkTime = *rtkTime;
    for (int i = 0; i < contentNum; ++i) {
        content[i].itemStatus = TTS_NOT_START;
        for (int i = 0; i < contentNum; ++i) {
            content[i].itemStatus = TTS_NOT_START;
        }
        testing = true;
        AppTimer_delete(DummyLightCheckActive);
        AppTimer_delete(ExamDummyLight);
        AppTimer_add(ExamDummyLight, D_SEC(2));
    } else {
        testing = false;
    }
    testing = true;
    AppTimer_delete(DummyLightCheckActive);
    AppTimer_delete(ExamDummyLight);
    AppTimer_add(ExamDummyLight, D_SEC(2));
}
int ExecuteDummyLightExam(const struct RtkTime* rtkTime)
lib/src/main/cpp/test_items2/road_exam.cpp
@@ -48,7 +48,7 @@
const double SLIDE_DISTANCE_THRESHOLD_YELLOW = 0.1;
const double CHANGE_LANE_RANGE = 100.0;
const double OVERTAKE_RANGE = 150.0;
const double OVERTAKE_HOLD_RANGE = 30.0;                // 在超车道行驶的一段距离
const int OVERTAKE_HOLD_TIME = D_SEC(11);                // 在超车道行驶的一段时间
const double EXAM_RANGE = 3000.0;                       // 至少驾驶距离
static const double LASTEST_BREAK_POINT = 30.0;
@@ -84,6 +84,7 @@
static struct drive_timer gearErrorTimePoint;
static struct drive_timer gearNSlideTimePoint;
static struct drive_timer startCarLeftTurnSignalTime;
static struct drive_timer overTakeCmpTime;
static int gearErrorTime;
static int gearNSlideTime;
@@ -95,7 +96,7 @@
static PointF roadItemStartPoint;
static struct drive_timer roadItemStartTime;
static bool overtake = false;
static bool checkTurn = false;
static bool checkDoor = false;
static bool handBreakActive = false;
static bool reportRPMOver = false;
@@ -122,7 +123,7 @@
static const uint32_t GEAR_N_SLIDE_TIMEOUT = D_SEC(5);
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_ROAD_MIN_INTERVAL = D_SEC(10);
static const uint32_t CHANGE_LANE_MIN_INTERVAL = D_SEC(10);
static const uint32_t CRASH_DOTTED_LINE_TIMEOUT = D_SEC(10);
static const uint32_t TURN_SIGNAL_LAMP_ADVANCE = D_SEC(3);
@@ -200,6 +201,7 @@
    laneChanging = false;
    nextRoadId = -1;
    checkTurn = false;
    ClearAll(RoadMap);
    odoGraph = 0.0;
@@ -584,6 +586,7 @@
        free(area.point);
    }
    if (currExamMapIndex == FIND_POSITION) {
        DEBUG("搜索道路");
        for (int i = 0; i < RoadMap.roads.size(); ++i) {
            Polygon area;
            int n = 0;
@@ -633,13 +636,14 @@
                    AddExamFault(3, rtkTime);
                }
                nextRoadId = -1;
                checkTurn = false;
                break;
            }
            free(area.point);
        }
        if (currExamMapIndex < 0) {
            currExamMapIndex = INVALID_POSITION;
            currExamMapIndex = FIND_POSITION;//INVALID_POSITION;
            DEBUG("搜寻未果");
        }
    } else if (currExamMapIndex == INVALID_POSITION) {
@@ -701,7 +705,7 @@
                                                        crashGreenCmpTime.sec,
                                                        crashGreenCmpTime.msec * 10);
                            if (diff < CHANGE_ROAD_MIN_INTERVAL) {
                            if (diff < CHANGE_LANE_MIN_INTERVAL) {
                                DEBUG("===================== 连续变道 ============!!");
                                // 连续变道,不合格
                                AddExamFault(15, rtkTime);
@@ -763,7 +767,8 @@
                    } else if (currRoadItem != NULL && currRoadItem->active == ROAD_ITEM_OVERTAKE) {
                        if (CurrentLane.lane > lane.lane) {
                            DEBUG("超车变道完成");
                            overtake = true;
                            Rtk2DriveTimer(overTakeCmpTime, rtkTime);
                        } else {
                            DEBUG("右道超车,错误");
                            AddExamFault(3, rtkTime);
@@ -802,6 +807,51 @@
        if (CrashTheLine(RoadMap.roads[currExamMapIndex].stopLine, car, CarModelList)) {
            DEBUG("下一个目标路 id = %d", RoadMap.roads[currExamMapIndex].targetRoad);
            nextRoadId = RoadMap.roads[currExamMapIndex].targetRoad;
            checkTurn = true;
        }
        if (checkTurn) {
            // 检查是否持续转向
            char turnDirect = CheckCarTurn(CarModelList);
            if (turnDirect == 'L') {
//        PlayTTS("左1");
                if (currTurnSignalStatus != LEFT_TURN_LIGHT) {
                    if (!reportTurnSignalError) {
                        DEBUG("没打左转灯");
                        // 没打左转灯,不合格
                        reportTurnSignalError = true;
                        ReportTurnSignalError(13, rtkTime);
                    }
                } else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10,
                                       turnSignalChangeTime.hour, turnSignalChangeTime.min, turnSignalChangeTime.sec, turnSignalChangeTime.msec*10) < TURN_SIGNAL_LAMP_ADVANCE) {
                    if (!reportTurnSignalError) {
                        DEBUG("转向灯时间不足");
                        // 不足3秒,不合格
                        reportTurnSignalError = true;
                        ReportTurnSignalError(14, rtkTime);
                    }
                }
            } else if (turnDirect == 'R') {
//        PlayTTS("右1");
                if (currTurnSignalStatus != RIGHT_TURN_LIGHT) {
                    if (!reportTurnSignalError) {
                        DEBUG("没打右转灯");
                        // 没打右转灯,不合格
                        reportTurnSignalError = true;
                        ReportTurnSignalError(13, rtkTime);
                    }
                } else if (TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10,
                                       turnSignalChangeTime.hour, turnSignalChangeTime.min, turnSignalChangeTime.sec, turnSignalChangeTime.msec*10) < TURN_SIGNAL_LAMP_ADVANCE) {
                    if (!reportTurnSignalError) {
                        DEBUG("转向灯时间不足");
                        // 不足3秒,不合格
                        reportTurnSignalError = true;
                        ReportTurnSignalError(14, rtkTime);
                    }
                }
            } else {
                reportTurnSignalError = false;
            }
        }
    }
@@ -882,7 +932,10 @@
                DEBUG("超车距离超标");
                AddExamFault(3, rtkTime);
                currRoadItem = NULL;
            } else if (overtake && DistanceOf(car->basePoint, roadItemStartPoint) > OVERTAKE_HOLD_RANGE) {
            } else if (overtake && TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss,
                                               rtkTime->mss * 10,
                                               overTakeCmpTime.hour, overTakeCmpTime.min,
                                               overTakeCmpTime.sec, overTakeCmpTime.msec * 10) > OVERTAKE_HOLD_TIME) {
                DEBUG("回原车道");
                PlayTTS("请返回原车道");
                currRoadItem = NULL;
@@ -1484,7 +1537,7 @@
                                                crashGreenCmpTime.hour, crashGreenCmpTime.min,
                                                crashGreenCmpTime.sec, crashGreenCmpTime.msec * 10);
                    if (diff < CHANGE_ROAD_MIN_INTERVAL) {
                    if (diff < CHANGE_LANE_MIN_INTERVAL) {
                        DEBUG("===================== 连续变道 ============!!");
                        // 连续变道,不合格
                        AddExamFault(15, rtkTime);