From 7c5b25c8617807635e9f272ebe9e98304d07cf2f Mon Sep 17 00:00:00 2001
From: fctom1215 <fctom1215@outlook.com>
Date: 星期五, 14 二月 2020 14:28:25 +0800
Subject: [PATCH] 增加单片机信息传递。

---
 lib/src/main/cpp/driver_test.cpp               |   44 +++++-
 lib/src/main/cpp/test_items/stop_and_start.cpp |   28 ++--
 lib/src/main/cpp/test_items/comm_test.h        |   14 ++
 lib/src/main/cpp/CMakeLists.txt                |    1 
 lib/src/main/cpp/driver_test.h                 |    3 
 lib/src/main/cpp/master/comm_if.h              |   10 +
 lib/src/main/cpp/test_items/turn_a90.cpp       |   29 ++--
 lib/src/main/cpp/test_items/park_edge.cpp      |   18 +-
 lib/src/main/cpp/rtk_platform/platform.h       |    1 
 lib/src/main/cpp/master/comm_if.cpp            |   35 +++++
 lib/src/main/cpp/test_items/comm_test.cpp      |   63 ++++++++++
 lib/src/main/cpp/utils/xconvert.h              |    2 
 lib/src/main/cpp/utils/xconvert.cpp            |   23 +++
 lib/src/main/cpp/mcu/mcu_if.cpp                |    9 
 lib/src/main/cpp/rtk_platform/platform.cpp     |   24 ++++
 15 files changed, 248 insertions(+), 56 deletions(-)

diff --git a/lib/src/main/cpp/CMakeLists.txt b/lib/src/main/cpp/CMakeLists.txt
index 759cbf1..044fbc1 100644
--- a/lib/src/main/cpp/CMakeLists.txt
+++ b/lib/src/main/cpp/CMakeLists.txt
@@ -33,6 +33,7 @@
         test_items/stop_and_start.cpp
         test_items/driving_curve.cpp
         test_items/turn_a90.cpp
+        test_items/comm_test.cpp
         rtk_module/rtk.cpp
         rtk_module/virtual_rtk.cpp
         master/comm_if.cpp
diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp
index 64c63c9..ca588b9 100644
--- a/lib/src/main/cpp/driver_test.cpp
+++ b/lib/src/main/cpp/driver_test.cpp
@@ -80,6 +80,13 @@
 static car_model *CarModel = NULL;
 static car_model *CarModelPrev = NULL;
 
+static struct sensor_cfg {
+    int gpioId;
+    int funId;
+    int validLvl;
+} SensorConfig[32];
+static int SensorNum = 0;
+
 #define MOV_AVG_SIZE                1
 #define RTK_BUFFER_SIZE            100
 #define CAR_MODEL_CACHE_SIZE      10
@@ -104,6 +111,9 @@
     MapNum = 0;
     CarModel = NULL;
     CarModelPrev = NULL;
+
+    SensorNum = 0;
+    memset(SensorConfig, 0, sizeof(SensorConfig));
 
     RtkBuffer = (rtk_info *) malloc(RTK_BUFFER_SIZE * sizeof(rtk_info));
     RtkBufferNum = RtkBufferIn = 0;
@@ -287,9 +297,26 @@
     DEBUG("SetCarMeasurePoint Calc Over");
 }
 
-void SetSensorCfg(int (*sensor)[2], int sensorNum)
+void SetSensorCfg(int (*sensor)[3], int sensorNum)
 {
     DEBUG("SetSensorCfg sensorNum %d", sensorNum);
+
+    SensorNum = sensorNum;
+    for (int i = 0; i < sensorNum; ++i) {
+        SensorConfig[i].gpioId = sensor[i][0];
+        SensorConfig[i].funId = sensor[i][1];
+        SensorConfig[i].validLvl = sensor[i][2];
+    }
+}
+
+void GetFuncGpio(int func, int &gpio, int &lvl)
+{
+    for (int i = 0; i < SensorNum; ++i) {
+        if (SensorConfig[i].funId == func) {
+            gpio = SensorConfig[i].gpioId;
+            lvl = SensorConfig[i].validLvl;
+        }
+    }
 }
 
 void StartDriverExam(int start)
@@ -345,7 +372,7 @@
                 RtkBuffer[index].mm, RtkBuffer[index].ss, RtkBuffer[index].dss);
 
         brief.qf = RtkBuffer[index].qf;
-        brief.map_id = 865;//GetMapId(CurrExamMapIndex, MapList, MapNum);
+        brief.map_id = 866;//GetMapId(CurrExamMapIndex, MapList, MapNum);
         brief.move = move;
         brief.speed = speed * 3.6;
         brief.heading = RtkBuffer[index].heading;
@@ -469,15 +496,14 @@
 }
 
 /*************************************************
- * 2娆¢噰鏍风浉宸殑鏃堕棿
+ * 2娆¢噰鏍风浉宸殑鏃堕棿, a 鏈�杩戠殑锛宐 鍏堝墠鐨�
  * @param a
  * @param b
  * @return ms
  */
 static uint32_t CalcTimeDiff(const rtk_info *a, const rtk_info *b)
 {
-    return ABS((long)(TimeMakeComposite(2000 + a->YY, a->MM, a->DD, a->hh, a->mm, a->ss) * 1000 + a->dss*10) -
-               (long)(TimeMakeComposite(2000 + b->YY, b->MM, b->DD, b->hh, b->mm, b->ss) * 1000 + b->dss*10));
+    return TimeGetDiff(a->hh, a->mm, a->ss, a->dss*10, b->hh, b->mm, b->ss, b->dss*10);
 }
 
 static bool UpdateCarCoord(double &spd, int &mov, int &idx)
@@ -686,7 +712,7 @@
 {
     // 杞︾殑鏈�鍓嶇偣鏄惁杩涘叆鍦板浘
     for (int i = 0; i < mapNum && car != NULL; ++i) {
-        if (mapList[i].type == MAP_TYPE_STOP_START) {
+        /*if (mapList[i].type == MAP_TYPE_STOP_START) {
             // 鏋勯�犺櫄鎷熺殑宸︿笂瑙掔偣
             double x9, y9, xo, yo;
 
@@ -721,7 +747,7 @@
             free(map.point);
 
             if (enter) return i;
-        } /*else if (mapList[i].type == MAP_TYPE_CURVE) {
+        } else if (mapList[i].type == MAP_TYPE_CURVE) {
 
         } else if (mapList[i].type == MAP_TYPE_PARK_BUTTOM || mapList[i].type == MAP_TYPE_PART_EDGE) {
             if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &mapList[i].map) == GM_Containment) {
@@ -734,7 +760,7 @@
                     DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine2) > 0.1)
                     return i;
             }
-        } else if (mapList[i].type == MAP_TYPE_TURN_90) {
+        } else */if (mapList[i].type == MAP_TYPE_TURN_90) {
             if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &mapList[i].map) == GM_Containment) {
                 Line enterLine1;
 
@@ -743,7 +769,7 @@
                 if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine1) > 0.1)
                     return i;
             }
-        }*/
+        }
     }
     return -1;
 }
diff --git a/lib/src/main/cpp/driver_test.h b/lib/src/main/cpp/driver_test.h
index c1c2b58..339469c 100644
--- a/lib/src/main/cpp/driver_test.h
+++ b/lib/src/main/cpp/driver_test.h
@@ -81,7 +81,8 @@
 void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire,
                         int *right_front_tire, int *left_rear_tire, int *right_rear_tire,
                         int *body, int bodyNum, double (*point)[2], int pointNum);
-void SetSensorCfg(int (*sensor)[2], int sensorNum);
+void SetSensorCfg(int (*sensor)[3], int sensorNum);
+void GetFuncGpio(int func, int &gpio, int &lvl);
 void StartDriverExam(int start);
 void UpdateRTKInfo(const rtk_info *s);
 void AddExamFault(int wrong, const struct RtkTime *rtkTime);
diff --git a/lib/src/main/cpp/master/comm_if.cpp b/lib/src/main/cpp/master/comm_if.cpp
index fc9f457..688ffe2 100644
--- a/lib/src/main/cpp/master/comm_if.cpp
+++ b/lib/src/main/cpp/master/comm_if.cpp
@@ -36,7 +36,7 @@
 #define ID_MS_MAP               0x8006
 #define ID_SM_READ_CAR          0x0007
 #define ID_MS_CAR               0x8007
-#define ID_SM_READ_SENSOR_CFG   0x0008
+#define ID_SM_MCU_BRIEF   0x0008
 #define ID_MS_SENSOR_CFG        0x8008
 #define ID_MS_START_EXAM        0x8009
 #define ID_SM_EXAM_STATUS       0x0009
@@ -135,7 +135,7 @@
 
 void MA_ReadSensor(void)
 {
-    SendMsgToMainProc(ID_SM_READ_SENSOR_CFG, NULL);
+
 }
 
 void MA_SendExamStatus(int start, int errorCode)
@@ -153,6 +153,31 @@
     writer.EndObject();
 
     SendMsgToMainProc(ID_SM_EXAM_STATUS, sb.GetString());
+}
+
+void MA_SendMcuBrief(const struct mcuBrief *brief)
+{
+    StringBuffer sb;
+    Writer<StringBuffer> writer(sb);
+
+    writer.StartObject();
+
+    writer.Key("version");
+    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("sn");
+    writer.String(brief->sn);
+
+    writer.EndObject();
+
+    SendMsgToMainProc(ID_SM_MCU_BRIEF, sb.GetString());
 }
 
 void MA_SendGpsBrief(const struct gpsBrief *brief)
@@ -615,7 +640,7 @@
                 if (a.IsArray() && a.Size() > 0) {
                     int n = a.Size();
                     int i = 0;
-                    int (*sensor)[2] = (int (*)[2]) new int[n][2];
+                    int (*sensor)[3] = (int (*)[3]) new int[n][3];
 
                     for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) {
                         // a gpio mapping
@@ -627,6 +652,10 @@
                             const Value &s = (*itr)["func_id"];
                             sensor[i][1] = s.GetInt();
                         }
+                        if (itr->HasMember("level")) {
+                            const Value &s = (*itr)["level"];
+                            sensor[i][2] = s.GetInt();
+                        }
                         ++i;
                     }
                     SetSensorCfg(sensor, n);
diff --git a/lib/src/main/cpp/master/comm_if.h b/lib/src/main/cpp/master/comm_if.h
index aaeae65..deae21e 100644
--- a/lib/src/main/cpp/master/comm_if.h
+++ b/lib/src/main/cpp/master/comm_if.h
@@ -8,6 +8,15 @@
 #include <cstdint>
 #include "../driver_test.h"
 
+struct mcuBrief {
+    char version[70];
+    int selftest;
+    int gpio;
+    int speed;
+    int engine;
+    char sn[20];
+};
+
 struct gpsBrief {
     char utc[32];
     int sat_num;
@@ -61,6 +70,7 @@
 void MA_ReadCar(void);
 void MA_ReadSensor(void);
 void MA_SendExamStatus(int start, int errorCode);
+void MA_SendMcuBrief(const struct mcuBrief *brief);
 void MA_SendGpsBrief(const struct gpsBrief *brief);
 void MA_SendRtkBrief(const struct rtkBrief *brief);
 void MA_SendCarPosition(const struct carBrief *brief);
diff --git a/lib/src/main/cpp/mcu/mcu_if.cpp b/lib/src/main/cpp/mcu/mcu_if.cpp
index 44e0c9e..9821685 100644
--- a/lib/src/main/cpp/mcu/mcu_if.cpp
+++ b/lib/src/main/cpp/mcu/mcu_if.cpp
@@ -11,6 +11,7 @@
 #include "../defs.h"
 #include "../jni_log.h"
 #include "../common/serial_port.h"
+#include "../rtk_platform/platform.h"
 
 #define DEBUG(fmt, args...)     LOGD("<mcu_if> <%s>: " fmt, __func__, ##args)
 
@@ -62,6 +63,7 @@
 static int dfuTryCnt = 0;
 const int DFU_MAX_TRY = 3;
 const int DFU_FILE_BLOCK_SIZE = 896;
+
 
 static void *UartThread1(void *p);
 static void ParseMcuTimeout(union sigval sig);
@@ -357,12 +359,9 @@
             break;
         case ID_MC_CAR_INFO: {
             DEBUG("ID_MC_CAR_INFO %d", lenth);
-            char ver[64] = {0};
 
-            memcpy(ver, data, 32);
-
-            DEBUG("ID_MC_CAR_INFO %s", ver);
-
+            if (lenth > 0)
+                PlatformStatusChanged(MCU_UPDATE_EVT, data, lenth);
             break;
         }
         case ID_MC_RTK_DATA:
diff --git a/lib/src/main/cpp/rtk_platform/platform.cpp b/lib/src/main/cpp/rtk_platform/platform.cpp
index 322708f..bd801f8 100644
--- a/lib/src/main/cpp/rtk_platform/platform.cpp
+++ b/lib/src/main/cpp/rtk_platform/platform.cpp
@@ -390,6 +390,30 @@
         MA_SendRtkBrief(&brief);
         UpdateRTKInfo(rtk);
     }
+    if (events & MCU_UPDATE_EVT) {
+        DEBUG("MCU_UPDATE_EVT length %d", length);
+        // 0-31 version
+        // 32-33 selftest
+        // 34-35 gpio
+        // 36-37 speed
+        // 38-39 engine
+        // 40-55 sn
+        struct mcuBrief brief;
+
+        memset(&brief, 0, sizeof(brief));
+
+        int x = 0;
+        while(data[x] != 0 && x < 32) x++;
+
+        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);
+
+        MA_SendMcuBrief(&brief);
+    }
 }
 
 static void *PlatformDataListenThread(void *p) {
diff --git a/lib/src/main/cpp/rtk_platform/platform.h b/lib/src/main/cpp/rtk_platform/platform.h
index 4008293..05898a5 100644
--- a/lib/src/main/cpp/rtk_platform/platform.h
+++ b/lib/src/main/cpp/rtk_platform/platform.h
@@ -13,6 +13,7 @@
 #define PLATFORM_LOGIN_EVT                           0x0008
 #define RTK_UPDATE_EVT                               0x0010
 #define GPS_UPDATE_EVT                              0x0020
+#define MCU_UPDATE_EVT                              0x0040
 
 typedef struct {
     char domain_name[32];
diff --git a/lib/src/main/cpp/test_items/comm_test.cpp b/lib/src/main/cpp/test_items/comm_test.cpp
new file mode 100644
index 0000000..3ea8099
--- /dev/null
+++ b/lib/src/main/cpp/test_items/comm_test.cpp
@@ -0,0 +1,63 @@
+//
+// Created by fctom on 2020/2/13.
+//
+
+#include "comm_test.h"
+#include "../driver_test.h"
+#include "../defs.h"
+
+static bool seatbeltInsert;
+static bool engineStart;
+
+const int ENGINE_MIN_ROTATE = 200;
+
+static uint16_t gpioStore = 0;
+static uint16_t engineStore = 0;
+
+static void SensorChange(int index, bool value);
+
+void CommTestStart(void)
+{
+    gpioStore = engineStore = 0;
+}
+
+void UpdateSensor(uint16_t gpio, uint16_t speed, uint16_t engine)
+{
+    int idx, lvl;
+
+    uint16_t chg = gpioStore^gpio;
+
+    if (chg == 0)
+        return;
+
+    for (int i = 0; i < 16; ++i) {
+        if (chg & BV(i)) {
+            SensorChange(i, (bool)(gpio & BV(i)));
+        }
+    }
+
+    gpioStore = gpio;
+
+
+
+    // 瀹夊叏甯�
+
+    // 鎸′綅
+
+    // 鍚姩鎸囩ず
+
+    // 鐔勭伀鐩戞帶
+}
+
+static void SensorChange(int index, bool value)
+{
+    int func;
+
+    switch (func) {
+        case SENSOR_SEATBELT:
+            break;
+        case SENSOR_TURNRIGHT:
+            break;
+
+    }
+}
diff --git a/lib/src/main/cpp/test_items/comm_test.h b/lib/src/main/cpp/test_items/comm_test.h
new file mode 100644
index 0000000..a1f7a5c
--- /dev/null
+++ b/lib/src/main/cpp/test_items/comm_test.h
@@ -0,0 +1,14 @@
+//
+// Created by fctom on 2020/2/13.
+//
+
+#ifndef MYAPPLICATION2_COMM_TEST_H
+#define MYAPPLICATION2_COMM_TEST_H
+
+#define SENSOR_SEATBELT         0
+#define SENSOR_TURNRIGHT         1
+#define SENSOR_TURNLEFT         2
+#define SENSOR_HANDBREAK         3
+
+
+#endif //MYAPPLICATION2_COMM_TEST_H
diff --git a/lib/src/main/cpp/test_items/park_edge.cpp b/lib/src/main/cpp/test_items/park_edge.cpp
index 105bd16..c5ed6ec 100644
--- a/lib/src/main/cpp/test_items/park_edge.cpp
+++ b/lib/src/main/cpp/test_items/park_edge.cpp
@@ -17,11 +17,11 @@
 
 using namespace std;
 
-const int PARK_TIMEOUT = 90;
+const int PARK_TIMEOUT = D_SEC(90);
 const uint32_t STOP_CAR_TIME = D_SEC(2);
 
 static bool reportExamTimeout;
-static uint64_t stopTimepoint = 0;
+static uint32_t stopTimepoint = 0;
 static bool occurCrashRedLine1, occurCrashRedLine2;
 static int prevMoveStatus, storeMoveStatusBeforeStop;
 static int parkStatus;
@@ -45,7 +45,7 @@
     occurMoveBack = false;
     if (moveStatus == -1) {
         occurMoveBack = true;
-        moveBackTimePoint = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
+        moveBackTimePoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
     }
 
     DEBUG("杩涘叆渚ф柟鍋滆溅鍦哄湴");
@@ -87,7 +87,7 @@
     }
 
     if (occurMoveBack) {
-        uint32_t tp = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
+        uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
 
         if (!reportExamTimeout && tp - moveBackTimePoint >= PARK_TIMEOUT) {
             // 瓒呮椂90绉掞紝涓嶅悎鏍�
@@ -100,15 +100,13 @@
     if (moveStatus != prevMoveStatus) {
         if (moveStatus == 0) {
             parkStatus = 0;
-            stopTimepoint = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
-            stopTimepoint = stopTimepoint * 1000 + rtkTime->mss*10;
+            stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
             storeMoveStatusBeforeStop = prevMoveStatus;
 
             DEBUG("鍋滆溅浜� %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss);
         } else {
             DEBUG("缁х画琛岄┒ %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss);
-            uint64_t tp = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
-            tp = tp * 1000 + rtkTime->mss * 10;
+            uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
 
             DEBUG("鍋滆溅鏃堕棿 %ld", tp - stopTimepoint);
 
@@ -144,13 +142,13 @@
             if (moveStatus == -1 && !occurMoveBack) {
                 DEBUG("寮�濮嬪�掕溅");
                 occurMoveBack = true;
-                moveBackTimePoint = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
+                moveBackTimePoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
             }
         }
 
         prevMoveStatus = moveStatus;
     } else if (moveStatus == 0 && parkStatus == 0) {
-        uint64_t tp = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
+        uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
         tp = tp * 1000 + rtkTime->mss * 10;
 
         if (tp - stopTimepoint >= STOP_CAR_TIME) {
diff --git a/lib/src/main/cpp/test_items/stop_and_start.cpp b/lib/src/main/cpp/test_items/stop_and_start.cpp
index 1398ee5..9c0c69e 100644
--- a/lib/src/main/cpp/test_items/stop_and_start.cpp
+++ b/lib/src/main/cpp/test_items/stop_and_start.cpp
@@ -16,12 +16,6 @@
 
 using namespace std;
 
-enum
-{
-    STOP_CAR,
-    START_CAR
-};
-
 const double STOP_DISTANCE_THRESHOLD_RED = 0.5;
 const double EDGE_DISTANCE_THRESHOLD_RED = 0.5;
 const double EDGE_DISTANCE_THRESHOLD_YELLOW = 0.3;
@@ -38,7 +32,7 @@
 static PointF stopPoint;
 
 static int prevMoveDirect;
-static uint64_t stopTimepoint = 0;
+static uint32_t stopTimepoint = 0;
 static bool stopCar = false;
 static uint32_t stopCarTime;
 static bool occurCrashRedLine = false;
@@ -61,9 +55,7 @@
     prevMoveDirect = moveDirect;
 
     if (moveDirect == 0) {
-        stopTimepoint = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh,
-                                          rtkTime->mm, rtkTime->ss);
-        stopTimepoint = stopTimepoint * 1000 + rtkTime->mss * 10;
+        stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
     }
 
     occurCrashRedLine = false;
@@ -96,18 +88,16 @@
 
     if (prevMoveDirect != moveDirect) {
         if (moveDirect == 0) {
-            stopTimepoint = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
-            stopTimepoint = stopTimepoint * 1000 + rtkTime->mss*10;
+            stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
         }
         prevMoveDirect = moveDirect;
     } else if (moveDirect == 0) {
-        uint64_t tp = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
-        tp = tp * 1000 + rtkTime->mss * 10;
+        uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
 
         if (tp - stopTimepoint >= STOP_CAR_TIME && !stopCar) {
             // 杩欓噷鍒ゆ柇鍋滆溅鐘舵��
             stopCar = true;
-            stopCarTime = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
+            stopCarTime = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
 
             stopPoint = car->carXY[car->body[0]];
 
@@ -161,9 +151,10 @@
             }
         }
 
+
         if (!reportStartTimeout && (IntersectionOfLine(map->point[4], stopPoint, car->carXY[car->axial[AXIAL_FRONT]]) != -1 ||
                 DistanceOf(stopPoint, car->carXY[car->axial[AXIAL_FRONT]]) < 0.1)) {
-            if (TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss) - stopCarTime > CAR_START_TIMEOUT) {
+            if (TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10) - stopCarTime > CAR_START_TIMEOUT) {
                 // 璧锋鏃堕棿瓒呰繃30绉掞紝涓嶅悎鏍�
                 AddExamFault(15, rtkTime);
                 DEBUG("璧锋鏃堕棿瓒呰繃30绉�");
@@ -217,6 +208,9 @@
     int rel1 = IntersectionOfLine(map->point[4], map->point[3], car->carXY[car->body[0]]);
     int rel2 = IntersectionOfLine(map->point[5], map->point[6], car->carXY[car->body[0]]);
 
+    DEBUG("%d %d %f, %f", car->body[0], car->axial[AXIAL_FRONT], car->carXY[car->body[0]].X, car->carXY[car->body[0]].Y);
+    DEBUG("rel1 %d rel2 %d", rel1, rel2);
+
     if (rel1 == 1) {
         Line line1;
 
@@ -231,6 +225,8 @@
         dis = DistanceOf(car->carXY[car->body[0]], line2);
     }
 
+    DEBUG("DistanceOfHead2Stopline dis %f", dis);
+
     return dis;
 }
 
diff --git a/lib/src/main/cpp/test_items/turn_a90.cpp b/lib/src/main/cpp/test_items/turn_a90.cpp
index d03e269..f76ac16 100644
--- a/lib/src/main/cpp/test_items/turn_a90.cpp
+++ b/lib/src/main/cpp/test_items/turn_a90.cpp
@@ -21,9 +21,9 @@
 
 static bool TA90Testing;
 
-static int azimuth;
+static int enterAreaHeading;
 static bool turnLeftFinished;
-static uint64_t stopTimepoint = 0;
+static uint32_t stopTimepoint = 0;
 
 static bool reportStopCarTimeout;
 static int prevMoveDirect;
@@ -34,11 +34,11 @@
 
 void StartTurnA90(int moveDirect, double heading, const struct RtkTime *rtkTime)
 {
-    azimuth = (int) heading;
+    DEBUG("杩涘叆鐩磋杞集鍦哄湴");
+    enterAreaHeading = (int) heading;
     prevMoveDirect = moveDirect;
     if (moveDirect == 0) {
-        stopTimepoint = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
-        stopTimepoint = stopTimepoint * 1000 + rtkTime->mss*10;
+        stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
     }
     reportStopCarTimeout = false;
     crashRedLine = false;
@@ -66,8 +66,7 @@
 
     if (moveDirect != prevMoveDirect) {
         if (moveDirect == 0) {
-            stopTimepoint = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
-            stopTimepoint = stopTimepoint * 1000 + rtkTime->mss*10;
+            stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
             reportStopCarTimeout = false;
 
             DEBUG("鍋滆溅浜� %d %d %d %d %d %d %d", rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss);
@@ -76,8 +75,7 @@
         }
         prevMoveDirect = moveDirect;
     } else if (moveDirect == 0) {
-        uint64_t tp = TimeMakeComposite(2000 + rtkTime->YY, rtkTime->MM, rtkTime->DD, rtkTime->hh, rtkTime->mm, rtkTime->ss);
-        tp = tp * 1000 + rtkTime->mss * 10;
+        uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
 
         if (tp - stopTimepoint >= STOP_CAR_TIME && !reportStopCarTimeout) {
             // 鍋滆溅瓒�2绉掞紝姣忔鎵�5鍒�
@@ -90,14 +88,21 @@
     // 妫�鏌ヨ浆鍚戠姸鎬�
     int az = (int) heading;
 
-    if (ABS(az - azimuth) > 180) {
-        az = 360 - ABS(az-azimuth);
+    if (ABS(az - enterAreaHeading) > 180) {
+        az = 360 - ABS(az-enterAreaHeading);
     } else {
-        az = ABS(az - azimuth);
+        az = ABS(az - enterAreaHeading);
     }
+
+
 
     if (az >= 30) {
         if (!turnLeftFinished) {
+            if((( ((int)heading) + 360 - enterAreaHeading) % 360) < 180) {
+                DEBUG("鍙宠浆");
+            } else {
+                DEBUG("宸﹁浆");
+            }
             // 杞悜鐏湭寮�鍚紝鎵�10鍒�
             AddExamFault(30, rtkTime);
             DEBUG("杞悜鐏湭寮�鍚�");
diff --git a/lib/src/main/cpp/utils/xconvert.cpp b/lib/src/main/cpp/utils/xconvert.cpp
index 62aeca2..0232370 100644
--- a/lib/src/main/cpp/utils/xconvert.cpp
+++ b/lib/src/main/cpp/utils/xconvert.cpp
@@ -107,3 +107,26 @@
     totalSeconds += daysThisYear * SECONDS_PER_DAY;
     return totalSeconds;
 }
+
+uint32_t TimeMakeComposite(int hour, int minute, int second, int msecond)
+{
+    return (hour*SECONDS_PER_HOUR + minute*SECONDS_PER_MINUTE + second) * 1000 + msecond;
+}
+
+/*********************************************************
+ * TIME1 - TIME2: msecond
+ * @param hour1
+ * @param minute1
+ * @param second1
+ * @param msecond1
+ * @param hour2
+ * @param minute2
+ * @param second2
+ * @param msecond2
+ * @return
+ */
+uint32_t TimeGetDiff(int hour1, int minute1, int second1, int msecond1, int hour2, int minute2, int second2, int msecond2)
+{
+    return (TimeMakeComposite(hour1, minute1, second1, msecond1) + SECONDS_PER_DAY * 1000 -
+            TimeMakeComposite(hour2, minute2, second2, msecond2)) % (SECONDS_PER_DAY * 1000);
+}
diff --git a/lib/src/main/cpp/utils/xconvert.h b/lib/src/main/cpp/utils/xconvert.h
index 7278c0c..cec7129 100644
--- a/lib/src/main/cpp/utils/xconvert.h
+++ b/lib/src/main/cpp/utils/xconvert.h
@@ -11,5 +11,7 @@
 void ConvertHex2String(char *str, const uint8_t *hex, int length);
 void ConvertString2Hex(uint8_t *hex, int length, const char *str);
 uint32_t TimeMakeComposite(int year, int month, int day, int hour, int minute, int second);
+uint32_t TimeMakeComposite(int hour, int minute, int second, int msecond);
+uint32_t TimeGetDiff(int hour1, int minute1, int second1, int msecond1, int hour2, int minute2, int second2, int msecond2);
 
 #endif //MYAPPLICATION2_XCONVERT_H

--
Gitblit v1.8.0