yy1717
2020-08-17 21834035950feaadac9d4c7cad82b90ee624c984
传感器变更
15个文件已修改
562 ■■■■■ 已修改文件
lib/src/main/cpp/driver_test.cpp 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/master/comm_if.cpp 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/master/comm_if.h 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/mcu/mcu_if.cpp 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/rtk_platform/platform.cpp 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/rtk_platform/platform.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_common/Geometry.cpp 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_common/Geometry.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_common/car_sensor.cpp 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_common/car_sensor.h 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/road_exam.cpp 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/road_exam.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/test_items2/through_something.cpp 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/utils/num.cpp 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/utils/num.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/src/main/cpp/driver_test.cpp
@@ -31,6 +31,7 @@
#include "test_items/stop_and_start.h"
#include "master/comm_if.h"
#include "utils/xconvert.h"
#include "utils/num.h"
#include "test_common/car_sensor.h"
#include "mcu/mcu_if.h"
#include "test_common/car_sensor.h"
lib/src/main/cpp/master/comm_if.cpp
@@ -62,7 +62,7 @@
#define ID_SM_LIGHT_EXAM_REQ    0x0012
#define ID_MS_LIGHT_EXAM_RES    0x8012
#define ID_SM_DISTANCE              0x0020
#define ID_SM_CARSENSOR              0x0013
#define MA_OUT_GPS_BRIEF        0x0001
#define MA_OUT_RTK_BRIEF        0x0002
@@ -262,12 +262,12 @@
    writer.String(brief->version);
    writer.Key("selftest");
    writer.Int(brief->selftest);
    writer.Key("gpio");
    writer.Int(brief->gpio);
    writer.Key("speed");
    writer.Int(brief->speed);
    writer.Key("engine");
    writer.Int(brief->engine);
//    writer.Key("gpio");
//    writer.Int(brief->gpio);
//    writer.Key("speed");
//    writer.Int(brief->speed);
//    writer.Key("engine");
//    writer.Int(brief->engine);
    writer.Key("sn");
    writer.String(brief->sn);
@@ -276,6 +276,73 @@
    SendMsgToMainProcIndep(ID_SM_MCU_BRIEF, sb.GetString());
}
void MA_SendCarSensorBrief(const struct carSensorBrief *brief)
{
    StringBuffer sb;
    Writer<StringBuffer> writer(sb);
    writer.StartObject();
    writer.Key("odo");
    writer.Int(brief->odo);
    writer.Key("trip");
    writer.Int(brief->trip);
    writer.Key("trip_time");
    writer.Int(brief->tripTime);
    writer.Key("cell_volt");
    writer.Double(brief->cellVolt);
    writer.Key("engine");
    writer.Double(brief->engine);
    writer.Key("sas");
    writer.Int(brief->sas);
    writer.Key("key");
    writer.Int(brief->key);
    writer.Key("gear");
    writer.Int(brief->gear);
    writer.Key("aps");
    writer.Int(brief->aps);
    writer.Key("lock");
    writer.Int(brief->lock);
    writer.Key("seat_belt");
    writer.Int(brief->seatBelt);
    writer.Key("clutch");
    writer.Int(brief->clutch);
    writer.Key("horn");
    writer.Int(brief->horn);
    writer.Key("wiper");
    writer.Int(brief->wiper);
    writer.Key("hand_break");
    writer.Int(brief->handBreak);
    writer.Key("main_break");
    writer.Int(brief->mainBreak);
    writer.Key("left_turn_lamp");
    writer.Int(brief->leftTurnLamp);
    writer.Key("right_turn_lamp");
    writer.Int(brief->rightTurnLamp);
    writer.Key("clearance_lamp");
    writer.Int(brief->clearanceLamp);
    writer.Key("dipped_beam_lamp");
    writer.Int(brief->dippedBeamLamp);
    writer.Key("main_beam_lamp");
    writer.Int(brief->mainBeamLamp);
    writer.Key("fog_lamp");
    writer.Int(brief->fogLamp);
    writer.Key("assist_break");
    writer.Int(brief->assBreak);
    writer.Key("surround1");
    writer.Int(brief->surround1);
    writer.Key("surround2");
    writer.Int(brief->surround2);
    writer.Key("surround3");
    writer.Int(brief->surround3);
    writer.Key("surround4");
    writer.Int(brief->surround4);
    writer.EndObject();
    SendMsgToMainProcIndep(ID_SM_CARSENSOR, sb.GetString());
}
void MA_SendGpsBrief(const struct gpsBrief *brief)
{
    if (!(OnOff & MA_OUT_GPS_BRIEF))
lib/src/main/cpp/master/comm_if.h
@@ -11,10 +11,41 @@
struct mcuBrief {
    char version[70];
    int selftest;
    int gpio;
    int speed;
    int engine;
//    int gpio;
//    int speed;
//    int engine;
    char sn[20];
};
struct carSensorBrief {
    int odo;
    int trip;
    int tripTime;
    double cellVolt;
    double speed;
    int engine;
    int sas;
    int key;
    int gear;
    int aps;
    int lock;
    int seatBelt;
    int clutch;
    int horn;
    int wiper;
    int handBreak;
    int mainBreak;
    int leftTurnLamp;
    int rightTurnLamp;
    int clearanceLamp;
    int dippedBeamLamp;
    int mainBeamLamp;
    int fogLamp;
    int assBreak;
    int surround1;
    int surround2;
    int surround3;
    int surround4;
};
struct cardBrief {
@@ -88,6 +119,7 @@
void MA_SendExamStatus(int start, int errorCode);
void MA_SendCardBrief(const struct cardBrief *brief);
void MA_SendMcuBrief(const struct mcuBrief *brief);
void MA_SendCarSensorBrief(const struct carSensorBrief *brief);
void MA_SendGpsBrief(const struct gpsBrief *brief);
void MA_SendRtkBrief(const struct rtkBrief *brief);
void MA_SendCarPosition(const struct carBrief *brief);
lib/src/main/cpp/mcu/mcu_if.cpp
@@ -39,7 +39,7 @@
#define ID_MC_MCU_DFU_RSP       0x8004
#define ID_CM_MCU_DFU_DATA       0x0005
#define ID_CM_MCU_DFU_DATA_CMP  0x0006
#define ID_MC_MCU_DFU_DATA_RSP  0x8006
#define ID_MC_CAR_INFO2  0x8006
#define ID_MC_CAR_INFO           0x8007
#define ID_MC_RTK_DATA          0x8008
#define ID_CM_RTK_DATA            0x0008
@@ -357,7 +357,10 @@
            break;
        case ID_MC_MCU_DFU_RSP:
            break;
        case ID_MC_MCU_DFU_DATA_RSP:
        case ID_MC_CAR_INFO2:
            if (lenth > 0) {
                PlatformStatusChanged(CAR_SENSOR_UPDATE_EVT, data, lenth);
            }
            break;
        case ID_MC_CAR_INFO: {
            DEBUG("ID_MC_CAR_INFO %d", lenth);
lib/src/main/cpp/rtk_platform/platform.cpp
@@ -408,14 +408,84 @@
        ConvertHex2String(brief.version, data, x);
        brief.selftest = BUILD_UINT16(data[33], data[32]);
        brief.gpio = BUILD_UINT16(data[35], data[34]);
        brief.speed = BUILD_UINT16(data[37], data[36]);
        brief.engine = BUILD_UINT16(data[39], data[38]);
        memcpy(brief.sn, data+40, 16);
//        brief.gpio = BUILD_UINT16(data[35], data[34]);
//        brief.speed = BUILD_UINT16(data[37], data[36]);
//        brief.engine = BUILD_UINT16(data[39], data[38]);
//        memcpy(brief.sn, data+40, 16);
        memcpy(brief.sn, data+34, 16);
        MA_SendMcuBrief(&brief);
        UpdateSensor(brief.gpio, brief.speed, brief.engine);
//        UpdateSensor(brief.gpio, brief.speed, brief.engine);
    }
    if (events & CAR_SENSOR_UPDATE_EVT) {
        struct carSensorBrief brief;
        int x = 20;
        brief.odo = BUILD_UINT32(data[3], data[2], data[1], data[0]);
        brief.trip = BUILD_UINT32(data[7], data[6], data[5], data[4]);
        brief.tripTime = BUILD_UINT32(data[11], data[10], data[9], data[8]);
        brief.cellVolt = (double)(BUILD_UINT16(data[13], data[12])) / 10.0;
        brief.speed = (double)(BUILD_UINT16(data[15], data[14])) / 10.0;
        brief.engine = BUILD_UINT16(data[17], data[16]);
        brief.sas = (short)BUILD_UINT16(data[19], data[18]);
        brief.key = data[x++];
        brief.gear = data[x++];
        brief.aps = data[x++];
        brief.lock = data[x++];
        brief.seatBelt = data[x++];
        brief.clutch = data[x++];
        brief.horn = data[x++];
        brief.wiper = data[x++];
        brief.handBreak = data[x++];
        brief.mainBreak = data[x++];
        brief.leftTurnLamp = data[x++];
        brief.rightTurnLamp = data[x++];
        brief.clearanceLamp = data[x++];
        brief.dippedBeamLamp = data[x++];
        brief.mainBeamLamp = data[x++];
        brief.fogLamp = data[x++];
        brief.assBreak = data[x++];
        brief.surround1 = data[x++];
        brief.surround2 = data[x++];
        brief.surround3 = data[x++];
        brief.surround4 = data[x++];
        MA_SendCarSensorBrief(&brief);
        car_sensor_t sensor;
        x = 20;
        sensor.odo = BUILD_UINT32(data[3], data[2], data[1], data[0]);
        sensor.trip = BUILD_UINT32(data[7], data[6], data[5], data[4]);
        sensor.tripTime = BUILD_UINT32(data[11], data[10], data[9], data[8]);
        sensor.cellVolt = (double)(BUILD_UINT16(data[13], data[12])) / 10.0;
        sensor.speed = (double)(BUILD_UINT16(data[15], data[14])) / 10.0;
        sensor.engine = BUILD_UINT16(data[17], data[16]);
        sensor.sas = (short)BUILD_UINT16(data[19], data[18]);
        sensor.key = data[x++];
        sensor.gear = data[x++];
        sensor.aps = data[x++];
        sensor.lock = data[x++];
        sensor.seatBelt = data[x++];
        sensor.clutch = data[x++];
        sensor.horn = data[x++];
        sensor.wiper = data[x++];
        sensor.handBreak = data[x++];
        sensor.mainBreak = data[x++];
        sensor.leftTurnLamp = data[x++];
        sensor.rightTurnLamp = data[x++];
        sensor.clearanceLamp = data[x++];
        sensor.dippedBeamLamp = data[x++];
        sensor.mainBeamLamp = data[x++];
        sensor.fogLamp = data[x++];
        sensor.assBreak = data[x++];
        sensor.surround1 = data[x++];
        sensor.surround2 = data[x++];
        sensor.surround3 = data[x++];
        sensor.surround4 = data[x++];
        UpdateSensor(&sensor);
    }
    if (events & CARD_UPDATE_EVT) {
        DEBUG("CARD_UPDATE_EVT length %d", length);
lib/src/main/cpp/rtk_platform/platform.h
@@ -16,6 +16,7 @@
#define MCU_UPDATE_EVT                              0x0040
#define CARD_UPDATE_EVT                             0x0080
#define PLAY_TTS_DONE_EVT                           0x0100
#define CAR_SENSOR_UPDATE_EVT                           0x0200
typedef struct {
    char domain_name[32];
lib/src/main/cpp/test_common/Geometry.cpp
@@ -42,13 +42,6 @@
    return (radians * 180.0) / M_PI;
}
double round(double number, unsigned int bits) {
    stringstream ss;
    ss << setiosflags(ios::fixed) << setprecision(bits) << number;
    ss >> number;
    return number;
}
void MakeLine(Line *line, const PointF *p1, const PointF *p2)
{
    line->X1 = p1->X;
lib/src/main/cpp/test_common/Geometry.h
@@ -37,7 +37,6 @@
inline double toDegree(double radians);
inline bool isEqual(double a, double b);
inline bool isEqual2(double a, double b);
double round(double number, unsigned int bits);
void MakeLine(Line *line, const PointF *p1, const PointF *p2);
void MakePolygon(Polygon *polygon, std::initializer_list<PointF> point_set);
lib/src/main/cpp/test_common/car_sensor.cpp
@@ -56,9 +56,11 @@
} SensorConfig[MAX_SENSOR_NUM];
static int SensorNum = 0;
static car_sensor_t Sensor;
static pthread_mutex_t sonser_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t status_rw_mutex = PTHREAD_MUTEX_INITIALIZER;
inline static int BX(int value);
static void WriteCarStatus(uint16_t id, int value);
static void LRLightTimeout(union sigval sig);
static void ChangeLRLight(int light);
@@ -74,6 +76,8 @@
    memset(SensorConfig, 0, sizeof(SensorConfig));
    memset(CarStatus, 0, sizeof(CarStatus));
    memset(&Sensor, 0, sizeof(Sensor));
    left_turn_signal = right_turn_signal = 0;
    flashMainBeamCnt = 0;
@@ -143,6 +147,66 @@
            }
        }
    }
}
void UpdateSensor(const car_sensor_t *s)
{
    WriteCarStatus(OBD_SPEED, s->speed);
    WriteCarStatus(ENGINE_RPM, s->engine);
    if (s->leftTurnLamp != Sensor.leftTurnLamp && s->leftTurnLamp != '#') {
        SensorChanged(SENSOR_LEFT_TURN_SIGNAL, BX(s->leftTurnLamp));
    }
    if (s->rightTurnLamp != Sensor.leftTurnLamp && s->rightTurnLamp != '#') {
        SensorChanged(SENSOR_RIGHT_TURN_SIGNAL, BX(s->rightTurnLamp));
    }
    if (s->fogLamp != Sensor.fogLamp && s->fogLamp != '#') {
        SensorChanged(SENSOR_FOG_LIGHT, BX(s->fogLamp));
    }
    if (s->clearanceLamp != Sensor.clearanceLamp && s->clearanceLamp != '#') {
        SensorChanged(SENSOR_CLEARANCE_LIGHT, BX(s->clearanceLamp));
    }
    if (s->dippedBeamLamp != Sensor.dippedBeamLamp && s->dippedBeamLamp != '#') {
        SensorChanged(SENSOR_DIPPED_BEAM_LIGHT, BX(s->dippedBeamLamp));
    }
    if (s->mainBeamLamp != Sensor.leftTurnLamp && s->mainBeamLamp != '#') {
        SensorChanged(SENSOR_MAIN_BEAM_LIGHT, BX(s->mainBeamLamp));
    }
    if (s->seatBelt != Sensor.seatBelt && s->seatBelt != '#') {
        SensorChanged(SENSOR_SEATBELT, BX(s->seatBelt));
    }
    if (s->key != Sensor.key && s->key != '#') {
        SensorChanged(SENSOR_ENGINE_START, s->key == 3? 1 : 0);
    }
    if (s->mainBreak != Sensor.mainBreak && s->mainBreak != '#') {
        SensorChanged(SENSOR_BREAK, BX(s->mainBreak));
    }
    if (s->assBreak != Sensor.assBreak && s->assBreak != '#') {
        SensorChanged(SENSOR_BREAK2, BX(s->assBreak));
    }
    if (s->handBreak != Sensor.handBreak && s->handBreak != '#') {
        SensorChanged(SENSOR_HANDBREAK, BX(s->handBreak));
    }
    if (s->lock != Sensor.lock && s->lock != '#') {
        SensorChanged(SENSOR_DOOR, BX(s->lock));
    }
    if (s->surround1 != Sensor.surround1 && s->surround1 != '#') {
        SensorChanged(SENSOR_SURROUND_CAR_1, BX(s->surround1));
    }
    if (s->surround2 != Sensor.surround2 && s->surround2 != '#') {
        SensorChanged(SENSOR_SURROUND_CAR_2, BX(s->surround2));
    }
    if (s->surround3 != Sensor.surround3 && s->surround3 != '#') {
        SensorChanged(SENSOR_SURROUND_CAR_3, BX(s->surround3));
    }
    if (s->surround4 != Sensor.surround4 && s->surround4 != '#') {
        SensorChanged(SENSOR_SURROUND_CAR_4, BX(s->surround4));
    }
    if (s->gear != Sensor.gear && s->gear != '#') {
        SensorChanged(GEAR, GEAR_N + s->gear);
    }
    Sensor = *s;
}
int ReadCarStatus(uint16_t id)
@@ -368,4 +432,7 @@
    }
}
inline static int BX(int value)
{
    return (value == 1) ? 1 : 0;
}
lib/src/main/cpp/test_common/car_sensor.h
@@ -62,9 +62,42 @@
    SURROUND_CAR_ACTIVE
};
typedef struct {
    int odo;
    int trip;
    int tripTime;
    double cellVolt;
    double speed;
    int engine;
    int sas;
    int key;
    int gear;
    int aps;
    int lock;
    int seatBelt;
    int clutch;
    int horn;
    int wiper;
    int handBreak;
    int mainBreak;
    int leftTurnLamp;
    int rightTurnLamp;
    int clearanceLamp;
    int dippedBeamLamp;
    int mainBeamLamp;
    int fogLamp;
    int assBreak;
    int surround1;
    int surround2;
    int surround3;
    int surround4;
} car_sensor_t;
void CarSensorInit(void);
int ReadCarStatus(uint16_t id);
void UpdateSensor(uint16_t gpio, uint16_t speed, uint16_t rpm);
void UpdateSensor(const car_sensor_t *s);
void SetSensorCfg(int (*sensor)[3], int sensorNum);
#endif //MYAPPLICATION2_COMM_TEST_H
lib/src/main/cpp/test_items2/road_exam.cpp
@@ -74,7 +74,7 @@
static const int INVALID_ROAD = -1;
static const int TURN_THRESHOLD = 1;
static const int TURN_THRESHOLD = 3;
static const int TURN_CHECK_INTERVAL = 500;
const double SLIDE_DISTANCE_THRESHOLD_RED = 0.3;
const double SLIDE_DISTANCE_THRESHOLD_YELLOW = 0.1;
@@ -94,7 +94,7 @@
static char carIntersectionOfGreenLine;
static int currTurnSignalStatus;
static int turnSignalStatusWhenCrashGreenLine;
static bool reportTurnSignalError;
static int prevMoveDirect;
static uint32_t stopTimepoint = 0;
static bool reportStopCarOnRedArea;
@@ -135,6 +135,12 @@
static map<int, car_sensor_value_t> CarSensorValue;
static map<int, int> CrossingHint;
static map<int, bool> ErrorLaneReport;
static struct RtkTime beginTurnTime, prevDetectTurnTime;
static int startTurnYaw, prevYaw;
static int turnCnt, turnTimeCnt;
static int prevTurnWise;
static const int MAX_ENGINE_RPM = 2500;
static const double START_CAR_MOVE_DISTANCE = 10.0;
@@ -157,8 +163,9 @@
static int TestRoadStartCar(const car_model *car, double speed, int moveDirect, const struct RtkTime *rtkTime);
static char isTurn(int currYaw, int prevYaw, int &ang);
static char CheckCarTurn(LIST_CAR_MODEL &CarModelList);
static int isTurn(int currYaw, int prevYaw, int thres);
static void ResetTurnDetect(const car_model *car);
static void DetectTurn(const car_model *car, int moveDirect, const struct RtkTime *rtkTime);
static trigger_line_t * EntryItem(int index, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList);
@@ -179,7 +186,6 @@
    carIntersectionOfGreenLine = 0;
    reportTurnSignalError = false;
    currTurnSignalStatus = OFF_LIGHT;
    prevMoveDirect = 0;
@@ -211,6 +217,7 @@
    checkTurn = false;
    CrashLineType = -1;
    turnCnt = -1;
    ResetOdo();
    ResetTarget(RoadMap);
@@ -973,7 +980,6 @@
                    } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) >= D_SEC(3)) {
                        DEBUG("转向灯时间不足");
                        // 不足3秒,不合格
                        reportTurnSignalError = true;
                        AddExamFault(14, rtkTime);
                    }
                } else {
@@ -984,7 +990,6 @@
                    } else if (TimeGetDiff(&crashGreenStartTime, &lamp.time) >= D_SEC(3)) {
                        DEBUG("转向灯时间不足");
                        // 不足3秒,不合格
                        reportTurnSignalError = true;
                        AddExamFault(14, rtkTime);
                    }
                }
@@ -1027,6 +1032,62 @@
    return CROSSING_NOT_HINT;
}
static void ResetCrossingStatus(int roadIndex)
{
    while (true) {
        bool w = false;
        for (auto it = CrossingHint.begin(); it != CrossingHint.end(); ++it) {
            if (it->first / 100 == roadIndex && it->second != CROSSING_NOT_HINT) {
                ChangeCrossingStatus(it->first / 100, it->first % 100, CROSSING_NOT_HINT);
                w = true;
                break;
            }
        }
        if (!w)
            break;
    }
}
static void SetErrorLaneRpt(int roadIndex, int index, bool status)
{
    int key = roadIndex * 100 + index;
    auto it = ErrorLaneReport.find(key);
    if (it != ErrorLaneReport.end()) {
        ErrorLaneReport.erase(it);
    }
    ErrorLaneReport.insert(pair<int, bool>(key, status));
}
static bool GetErrorLaneRpt(int roadIndex, int index)
{
    int key = roadIndex * 100 + index;
    auto it = ErrorLaneReport.find(key);
    if (it != ErrorLaneReport.end()) {
        return it->second;
    }
    return false;
}
static void ResetErrorLaneRpt(int roadIndex)
{
    while (true) {
        bool w = false;
        for (auto it = ErrorLaneReport.begin(); it != ErrorLaneReport.end(); ++it) {
            if (it->first / 100 == roadIndex && it->second == true) {
                SetErrorLaneRpt(it->first / 100, it->first % 100, false);
                w = true;
                break;
            }
        }
        if (!w)
            break;
    }
}
static void HintCrossing(int roadIndex, road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList)
{
    for (int i = 0; i < road.stopLine.size(); ++i) {
@@ -1053,12 +1114,13 @@
    }
}
static int NearbyCrossingGuide(int roadIndex, road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList)
static int NearbyCrossingGuide(int &stopLineIndex, int roadIndex, road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList)
{
    int guide = 0;
    int guide = 0, stopLine = 0;
    double distance;
    struct nearby_crossing {
        int stopLine;
        int guide;
        double distance;
    };
@@ -1077,6 +1139,7 @@
        if (distance > 1e-3) {
            struct nearby_crossing temp;
            temp.stopLine = i;
            temp.guide = road.stopLine[i].active;
            temp.distance = distance;
@@ -1092,10 +1155,12 @@
            if (distance > set[i].distance) {
                distance = set[i].distance;
                guide = set[i].guide;
                stopLine = set[i].stopLine;
            }
        }
    }
    stopLineIndex = stopLine;
    return guide;
}
@@ -1286,6 +1351,15 @@
    // 检测离开此路段,全车需不在范围内
    int oldid = currExamMapIndex;
    currExamMapIndex = CalcRoadIndex(currExamMapIndex, RoadMap, car);
    if (oldid != currExamMapIndex) {
        DEBUG("道路ID切换 %d ======> %d", oldid, currExamMapIndex);
        if (oldid >= 0) {
            ResetCrossingStatus(oldid);
            ResetErrorLaneRpt(oldid);
        }
    }
    if (currExamMapIndex >= 0) {
        car_sensor_value_t brk = ReadCarSensorValue(BREAK);
        HintCrossing(currExamMapIndex, RoadMap.roads[currExamMapIndex], car, CarModelList);
@@ -1294,10 +1368,6 @@
        ApproachTarget(RoadMap, car, currExamMapIndex, (brk.value == BREAK_ACTIVE), speed, moveDirect, rtkTime);
    }
    ExitTarget(RoadMap, car, CarModelList, rtkTime);
    if (oldid != currExamMapIndex) {
        DEBUG("道路ID切换 %d", currExamMapIndex);
    }
    oldid = CrashLineType;
@@ -1311,9 +1381,14 @@
    oldid = Lane.guide;
    DetectLane(RoadMap, car, currExamMapIndex, rtkTime);
    if (Lane.guide > 0 && currExamMapIndex >= 0) {
        if (!(NearbyCrossingGuide(currExamMapIndex, RoadMap.roads[currExamMapIndex], car, CarModelList) & Lane.guide)) {
            DEBUG("不按规定车道标向行驶");
            AddExamFault(9, rtkTime);
        int stop_line;
        if (!(NearbyCrossingGuide(stop_line, currExamMapIndex, RoadMap.roads[currExamMapIndex], car, CarModelList) & Lane.guide)) {
            if (!GetErrorLaneRpt(currExamMapIndex, stop_line)) {
                DEBUG("不按规定车道标向行驶");
                AddExamFault(9, rtkTime);
                SetErrorLaneRpt(currExamMapIndex, stop_line, true);
            }
        }
    }
@@ -1323,6 +1398,9 @@
    // 检测压线状态
    TestRoadStartCar(car, speed, moveDirect, rtkTime);
    // 额外的转向检测
    DetectTurn(car, moveDirect, rtkTime);
    if (startCar != START_CAR_DONE)
        return;
@@ -1399,7 +1477,15 @@
    tm.msec = rtkTime->mss;
}
static char isTurn(int currYaw, int prevYaw, int &ang)
void CrossRoadCallback(int road, int stop_line, int active, const car_model *car)
{
    SetErrorLaneRpt(road, stop_line, false);
    if (active != ROAD_ACTIVE_FORWARD) {
        ResetTurnDetect(car);
    }
}
static int isTurn(int currYaw, int prevYaw, int thres)
{
//    DEBUG("currYaw %d prevYaw %d", currYaw, prevYaw);
    int deltaAng = 0;
@@ -1410,21 +1496,117 @@
        deltaAng = ABS(currYaw - prevYaw);
    }
    ang = deltaAng;
//    DEBUG("角度差值 %d", deltaAng);
    if (deltaAng >= TURN_THRESHOLD) {
    if (deltaAng >= thres) {
        if((( currYaw + 360 - prevYaw) % 360) < 180) {
//            DEBUG("右转");
            return 'R';
            return deltaAng;
        } else {
//            DEBUG("左转");
            return 'L';
            return 0 - deltaAng;
        }
    }
    return 'N';
    return 0;
}
static void ResetTurnDetect(const car_model *car)
{
    turnCnt = 0;
    turnTimeCnt = 0;
    prevDetectTurnTime = car->tm;
    prevYaw = car->yaw;
}
static void DetectTurn(const car_model *car, int moveDirect, const struct RtkTime *rtkTime)
{
    int angle;
    if (turnCnt < 0 || TimeGetDiff(rtkTime, &prevDetectTurnTime) < 500) {
        return;
    }
    angle = isTurn((int) car->yaw, prevYaw, TURN_THRESHOLD);
    prevYaw = (int) car->yaw;
    prevDetectTurnTime = *rtkTime;
    if (turnCnt == 0) {
        if (angle != 0 && moveDirect != 0) {
            DEBUG("有转向迹象");
            turnCnt++;
            beginTurnTime = *rtkTime;
            startTurnYaw = (int) car->yaw;
        }
    } else if (turnCnt == 1) {
        if (angle != 0 && moveDirect != 0) {
            if (angle * prevTurnWise > 0) {
                DEBUG("确认转向");
                // 同向转动
                turnCnt++;
                turnTimeCnt = 0;
            } else {
                beginTurnTime = *rtkTime;
                startTurnYaw = (int) car->yaw;
            }
        } else {
            turnCnt = 0;
        }
    } else if (turnCnt >= 2) {
        if (moveDirect == 0) {
            // 暂停
        } else {
            turnTimeCnt += TimeGetDiff(rtkTime, &prevDetectTurnTime);
            int wise = isTurn((int) car->yaw, startTurnYaw, TURN_THRESHOLD);
            DEBUG("转动角度 %d", wise);
            if (ABS(wise) > 60) {
                // 确认转弯行为,检测开始刚转弯时转向灯情况
                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) {
                            DEBUG("变调未打灯!!");
                            // 没打灯,不合格
                            AddExamFault(13, rtkTime);
                        } else if (TimeGetDiff(&beginTurnTime, &lamp.time) >= D_SEC(3)) {
                            DEBUG("转向灯时间不足");
                            // 不足3秒,不合格
                            AddExamFault(14, rtkTime);
                        }
                    } else {
                        if (lamp.value != RIGHT_TURN_LIGHT) {
                            DEBUG("变调未打灯!!");
                            // 没打灯,不合格
                            AddExamFault(13, rtkTime);
                        } else if (TimeGetDiff(&beginTurnTime, &lamp.time) >= D_SEC(3)) {
                            DEBUG("转向灯时间不足");
                            // 不足3秒,不合格
                            AddExamFault(14, rtkTime);
                        }
                    }
                }
            } else if (turnTimeCnt > D_SEC(10)) {
                // 取消转向检测
                DEBUG("取消转向检测1");
                turnCnt = -1;
            }
        }
    }
    if (turnCnt < 2 && moveDirect != 0) {
        turnTimeCnt += TimeGetDiff(rtkTime, &prevDetectTurnTime);
        if (turnTimeCnt > D_SEC(15)) {
            // 取消转向检测
            DEBUG("取消转向检测2");
            turnCnt = -1;
        }
    }
    prevTurnWise = angle;
}
static char CheckCarTurn(LIST_CAR_MODEL &CarModelList)
lib/src/main/cpp/test_items2/road_exam.h
@@ -25,7 +25,7 @@
    int sec;
    int msec;
};
void CrossRoadCallback(int road, int stop_line, int active, const car_model *car);
void Rtk2DriveTimer(struct drive_timer &tm, const struct RtkTime *rtkTime);
void InitRoadExam(road_exam_map &RoadMap);
void TerminateRoadExam(void);
lib/src/main/cpp/test_items2/through_something.cpp
@@ -154,6 +154,9 @@
            if (CrashTheLine(RoadMap.roads[road].stopLine[x].line, car, CarModelList)) {
                DEBUG("越过路口 road %d 路口 %d", road, x);
                CrossRoadCallback(road, x, RoadMap.roads[road].stopLine[x].active, car);
                if (!(it->second & REDUCE_SPEED)) {
                    // 不按规定减速,不合格
                    DEBUG("不按规定减速");
lib/src/main/cpp/utils/num.cpp
@@ -3,6 +3,11 @@
//
#include "num.h"
#include <sstream>
#include <iosfwd>
#include <iomanip>
using namespace std;
long str2int(const uint8_t *s, uint16_t length)
{
@@ -85,3 +90,10 @@
    return n ;
}
double round(double number, unsigned int bits) {
    stringstream ss;
    ss << setiosflags(ios::fixed) << setprecision(bits) << number;
    ss >> number;
    return number;
}
lib/src/main/cpp/utils/num.h
@@ -10,5 +10,6 @@
long str2int(const uint8_t *s, uint16_t length);
bool str2float(double *f, const uint8_t *s, uint16_t length);
int BitCount(uint32_t n);
double round(double number, unsigned int bits);
#endif //RTKDRIVERTEST_NUM_H