From 03a05501800d2c02bca1c05ca6f7080d715aba23 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期五, 18 九月 2020 15:41:50 +0800
Subject: [PATCH] 坐标

---
 lib/src/main/cpp/driver_test.cpp           |   33 +++++++-
 lib/src/main/cpp/rtk_platform/platform.h   |    3 
 lib/src/main/cpp/master/comm_if.cpp        |   89 +++++++++++++++++++++
 lib/src/main/cpp/native-lib.cpp            |   25 +++++
 lib/src/main/cpp/test_items2/road_exam.cpp |   34 +++++++
 lib/src/main/cpp/driver_test.h             |    1 
 lib/src/main/cpp/rtk_platform/platform.cpp |   16 ++++
 7 files changed, 188 insertions(+), 13 deletions(-)

diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp
index e596990..600be36 100644
--- a/lib/src/main/cpp/driver_test.cpp
+++ b/lib/src/main/cpp/driver_test.cpp
@@ -148,7 +148,7 @@
             free(AreaMapList[i].map2.point);
     }
 
-    AreaMapList.clear();
+    LIST_AREA_MAP().swap(AreaMapList);
 }
 
 void AddAreaMap(int id, int type, const double (*map)[2], int pointNum, const double (*map2)[2], int pointNum2)
@@ -195,7 +195,7 @@
     vector<road_t>().swap(RoadMap.roads);
     vector<special_area_t>().swap(RoadMap.specialAreas);
     vector<forbid_line_t>().swap(RoadMap.forbidLines);
-    vector<scheme_t>().swap(RoadMap.examScheme);
+//    vector<scheme_t>().swap(RoadMap.examScheme);
 }
 
 void SetRoadMap(road_exam_map &map, vector<scheme_t> &scheme)
@@ -207,9 +207,20 @@
 //    RoadMap.triggerLines.assign(map.triggerLines.begin(), map.triggerLines.end());
     RoadMap.forbidLines.assign(map.forbidLines.begin(), map.forbidLines.end());
 
-    RoadMap.examScheme.assign(scheme.begin(), scheme.end());
+//    RoadMap.examScheme.assign(scheme.begin(), scheme.end());
 
     DEBUG("寰楀埌鏂扮殑璺�冨湴鍥� 璺暟閲� %d 鐗规畩鍖哄煙鏁伴噺 %d 鍏朵粬绂佹绾挎暟閲� %d 椤圭洰鏁伴噺 %d", RoadMap.roads.size(), RoadMap.specialAreas.size(), RoadMap.forbidLines.size(), RoadMap.examScheme.size());
+}
+
+void SetRoadExamScheme(vector<scheme_t> &scheme)
+{
+    if (ExamStart) return;
+
+    vector<scheme_t>().swap(RoadMap.examScheme);
+
+    RoadMap.examScheme.assign(scheme.begin(), scheme.end());
+
+    DEBUG("寰楀埌鏂扮殑璺�冨湴鍥� 椤圭洰鏁伴噺 %d", RoadMap.examScheme.size());
 }
 
 void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire,
@@ -375,6 +386,8 @@
         return;
     }
 
+    type = TEST_TYPE_ROAD_CALIBRATE;
+
     if (AreaMapList.size() == 0 && type == TEST_TYPE_AREA) {
         DEBUG("娌℃湁鍦鸿�冨湴鍥�");
         err = true;
@@ -394,6 +407,12 @@
         DEBUG("娌℃湁璺�冨湴鍥�");
         err = true;
         MA_SendExamStatus(0, -1);
+    }
+
+    if ((type == TEST_TYPE_ROAD_DUMMY_LIGHT || type == TEST_TYPE_ROAD_TRUE_LIGHT) && RoadMap.examScheme.size() == 0) {
+        DEBUG("娌℃湁璺�冪嚎璺柟妗�");
+        err = true;
+        MA_SendExamStatus(0, -3);
     }
 
     if (!err) {
@@ -514,7 +533,7 @@
             ExecuteExam(speed, move, azimuth, &rtkTime);
         }
 
-        PrintObdInfo(&rtkTime, speed);
+//        PrintObdInfo(&rtkTime, speed);
     }
 }
 
@@ -684,7 +703,7 @@
     }
 
     if (ExamType != TEST_TYPE_AREA) {
-        if (exam_dummy_light == 2 || ExamType == TEST_TYPE_ROAD_TRUE_LIGHT) {
+        if (exam_dummy_light == 2 || ExamType == TEST_TYPE_ROAD_TRUE_LIGHT || ExamType == TEST_TYPE_ROAD_CALIBRATE) {
             TestRoadGeneral(RoadMap, CarModel, CarModelList, speed, move, rtkTime);
         }
     } else {
@@ -885,6 +904,8 @@
     brief.status = status;
 
     MA_SendRoadStatus(&brief);
+
+    DEBUG("鎶ュ憡闀垮畼 杩涘嚭璺 road %d status %d", road, status);
 }
 
 void CrossingChange(int road, int crossing, int status)
@@ -896,6 +917,8 @@
     brief.status = status;
 
     MA_SendCrossingStatus(&brief);
+
+    DEBUG("鎶ュ憡闀垮畼 杩涘嚭璺彛 road %d crossing %d status %d", road, crossing, status);
 }
 
 void AddExamFault(int wrong, const struct RtkTime *rtkTime)
diff --git a/lib/src/main/cpp/driver_test.h b/lib/src/main/cpp/driver_test.h
index d19c35b..6c24bc3 100644
--- a/lib/src/main/cpp/driver_test.h
+++ b/lib/src/main/cpp/driver_test.h
@@ -225,6 +225,7 @@
 
 void CleanRoadMap(void);
 void SetRoadMap(road_exam_map &map, vector<scheme_t> &scheme);
+void SetRoadExamScheme(vector<scheme_t> &scheme);
 
 void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire,
                         int *right_front_tire, int *left_rear_tire, int *right_rear_tire,
diff --git a/lib/src/main/cpp/master/comm_if.cpp b/lib/src/main/cpp/master/comm_if.cpp
index 0468b02..7ffd67d 100644
--- a/lib/src/main/cpp/master/comm_if.cpp
+++ b/lib/src/main/cpp/master/comm_if.cpp
@@ -39,6 +39,7 @@
 #define ID_MS_MAP               0x8006
 #define ID_MS_ROAD_MAP          0x8014
 #define ID_MS_ROAD_MAP2         0x8013
+#define ID_MS_SCHEME            0x8017
 
 #define ID_SM_READ_CAR          0x0007
 #define ID_MS_CAR               0x8007
@@ -1263,6 +1264,90 @@
 
             break;
         }
+        case ID_MS_SCHEME: {
+            Document doc;
+            doc.Parse(value);
+            if (!doc.HasParseError()) {
+                DEBUG("寮�濮嬭В鏋愯矾鑰冩柟妗�");
+                vector<scheme_t> schemes;
+
+                if (doc.HasMember("scheme")) {
+                    const Value &a = doc["scheme"];
+
+                    for (Value::ConstValueIterator itr = a.Begin();
+                         itr != a.End(); ++itr) {
+                        scheme_t scheme;
+                        if (itr->HasMember("name")) {
+                            const Value &s = (*itr)["name"];
+                            scheme.name = s.GetString();
+                        }
+                        if (itr->HasMember("crossing_active")) {
+                            const Value &a2 = (*itr)["crossing_active"];
+
+                            for (Value::ConstValueIterator itr2 = a2.Begin();
+                                 itr2 != a2.End(); ++itr2) {
+                                crossing_active_t act;
+
+                                if (itr2->HasMember("road")) {
+                                    const Value &s = (*itr2)["road"];
+                                    act.road_id = s.GetInt();
+                                }
+                                if (itr2->HasMember("idx")) {
+                                    const Value &s = (*itr2)["idx"];
+                                    act.index = s.GetInt();
+                                }
+                                if (itr2->HasMember("active")) {
+                                    const Value &s = (*itr2)["active"];
+                                    act.active = s.GetInt();
+                                }
+
+                                scheme.crossingActive.push_back(act);
+                            }
+                        }
+                        if (itr->HasMember("trigger_line")) {
+                            const Value &a2 = (*itr)["trigger_line"];
+
+                            for (Value::ConstValueIterator itr2 = a2.Begin();
+                                 itr2 != a2.End(); ++itr2) {
+                                trigger_line_t ins;
+
+                                if (itr2->HasMember("x_y")) {
+                                    const Value &a3 = (*itr2)["x_y"];
+                                    if (a3.IsArray()) {
+                                        PointF point;
+                                        int n = 0;
+                                        for (Value::ConstValueIterator itr3 = a3.Begin();
+                                             itr3 != a3.End(); ++itr3) {
+                                            if (n == 0) {
+                                                point.X = (*itr3).GetDouble();
+                                                n = 1;
+                                            } else if (n == 1) {
+                                                point.Y = (*itr3).GetDouble();
+                                                ins.points.push_back(point);
+                                                n = 0;
+                                            }
+                                        }
+                                    }
+                                }
+                                if (itr2->HasMember("road")) {
+                                    const Value &s = (*itr2)["road"];
+                                    ins.road = s.GetInt();
+                                }
+                                if (itr2->HasMember("type")) {
+                                    const Value &s = (*itr2)["type"];
+                                    ins.active = s.GetInt();
+                                }
+
+                                scheme.triggerLines.push_back(ins);
+                            }
+                        }
+                        schemes.push_back(scheme);
+                    }
+                }
+                SetRoadExamScheme(schemes);
+            }
+            break;
+        }
         case ID_MS_MAP: {
             Document doc;
             doc.Parse(value);
@@ -1471,7 +1556,7 @@
             break;
         }
         case ID_MS_SENSOR_CFG: {
-            Document doc;
+            /*Document doc;
             doc.Parse(value);
             if (!doc.HasParseError()) {
                 const Value &a = doc.GetArray();
@@ -1500,7 +1585,7 @@
                     SetSensorCfg(sensor, n);
                     delete []sensor;
                 }
-            }
+            }*/
             break;
         }
         case ID_MS_START_EXAM: {
diff --git a/lib/src/main/cpp/native-lib.cpp b/lib/src/main/cpp/native-lib.cpp
index b8e44e1..6eedb68 100644
--- a/lib/src/main/cpp/native-lib.cpp
+++ b/lib/src/main/cpp/native-lib.cpp
@@ -17,6 +17,7 @@
 #include "driver_test.h"
 #include "master/comm_if.h"
 #include "rtk_module/virtual_rtk.h"
+#include "defs.h"
 
 #define DEBUG(fmt, args...)     LOGD("<native-lib> <%s>: " fmt, __func__, ##args)
 
@@ -322,12 +323,32 @@
 Java_com_anyun_exam_lib_RemoteService_MainProcMsgEntry(JNIEnv *env, jobject thiz, jint cmd,
                                                        jstring value) {
     // TODO: implement MainProcMsgEntry()
+    union {
+        int a;
+        uint8_t b[sizeof(int)];
+    } c;
+
+    c.a = cmd;
+
     if (value != NULL) {
         const char *str = env->GetStringUTFChars(value, 0);
-        MA_MainProcMsgEntry(cmd, str);
+
+        uint8_t *data = new uint8_t[4 + strlen(str) + 1];
+
+        data[0] = c.b[0];
+        data[1] = c.b[1];
+        data[2] = c.b[2];
+        data[3] = c.b[3];
+
+        strcpy((char *)data + 4, str);
+//        MA_MainProcMsgEntry(cmd, str);
+        PlatformStatusChanged(MASTER_COMM_EVT, data, 4 + strlen(str) + 1);
         env->ReleaseStringUTFChars(value, str);
+
+        delete []data;
     } else {
-        MA_MainProcMsgEntry(cmd, NULL);
+        //MA_MainProcMsgEntry(cmd, NULL);
+        PlatformStatusChanged(MASTER_COMM_EVT, c.b, sizeof(int));
     }
 }
 
diff --git a/lib/src/main/cpp/rtk_platform/platform.cpp b/lib/src/main/cpp/rtk_platform/platform.cpp
index a343c04..6060868 100644
--- a/lib/src/main/cpp/rtk_platform/platform.cpp
+++ b/lib/src/main/cpp/rtk_platform/platform.cpp
@@ -520,6 +520,22 @@
             cb->callback(cb->seq);
         }
     }
+    if (events & MASTER_COMM_EVT) {
+        union {
+            int a;
+            uint8_t b[sizeof(int)];
+        } c;
+
+        c.b[0] = data[0];
+        c.b[1] = data[1];
+        c.b[2] = data[2];
+        c.b[3] = data[3];
+
+        if (length == 4)
+            MA_MainProcMsgEntry(c.a, NULL);
+        else
+            MA_MainProcMsgEntry(c.a, (char *)data + 4);
+    }
 }
 
 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 62c0c60..f48eb4e 100644
--- a/lib/src/main/cpp/rtk_platform/platform.h
+++ b/lib/src/main/cpp/rtk_platform/platform.h
@@ -16,7 +16,8 @@
 #define MCU_UPDATE_EVT                              0x0040
 #define CARD_UPDATE_EVT                             0x0080
 #define PLAY_TTS_DONE_EVT                           0x0100
-#define CAR_SENSOR_UPDATE_EVT                           0x0200
+#define CAR_SENSOR_UPDATE_EVT                       0x0200
+#define MASTER_COMM_EVT                             0x0400
 
 typedef struct {
     char domain_name[32];
diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp
index 0ade5a9..8a1c97f 100644
--- a/lib/src/main/cpp/test_items2/road_exam.cpp
+++ b/lib/src/main/cpp/test_items2/road_exam.cpp
@@ -90,9 +90,11 @@
 static bool occurSlide;
 
 static struct RtkTime crashGreenRunTime, crashGreenStartTime, stopTimepoint;
-
+static struct RtkTime gearChangeTimePoint;
 static struct RtkTime gearErrorTimePoint;
 static struct RtkTime gearNSlideTimePoint;
+
+static int gearChange;
 
 static car_sensor_value_t turnSignalStatus;
 
@@ -1324,6 +1326,21 @@
             occurSecondBreak = false;
         }
 
+        // 涓ゆ鎹㈡尅涓嶈繘
+        static int prevGear = -1;
+
+        int currGear = ReadCarStatus(GEAR);
+        if (currGear != GEAR_N && prevGear == GEAR_N) {
+            // 涓�娆℃崲鎸�
+            if (gearChange == currGear && TimeGetDiff(rtkTime, &gearChangeTimePoint) < D_SEC(5)) {
+                AddExamFault(7, rtkTime);
+            }
+
+            gearChange = currGear;
+            gearChangeTimePoint = *rtkTime;
+        }
+        prevGear = currGear;
+
         // 鎸′綅鍖归厤妫�娴�
         bool currGearError = false;
         bool currGearNSlide = false;
@@ -1475,9 +1492,9 @@
 
         if (RoadMap.calibrate) {
             if (currExamMapIndex < 0 && oldid >= 0) {
-                RoadChange(oldid, 0);
+                RoadChange(RoadMap.roads[oldid].id, 0);
             } else if (currExamMapIndex >= 0) {
-                RoadChange(currExamMapIndex, 1);
+                RoadChange(RoadMap.roads[currExamMapIndex].id, 1);
             }
         }
         Lane.guide = 0;
@@ -1648,6 +1665,9 @@
             RoadExamItem[RoadExamStatus] = ROAD_EXAM_ITEM_EXECED;
             if (RoadExamStatus == ROAD_EXAM_ITEM_CAR_START) {
                 freeRunExceptDistance = 60.0;
+            } else if (RoadExamStatus == ROAD_EXAM_ITEM_CAR_STOP) {
+                // 鑰冭瘯缁撴潫
+                MA_SendExamStatus(1, 1);
             } else {
                 freeRunExceptDistance = 2;//250.0;
             }
@@ -1674,6 +1694,14 @@
     } else if (RoadExamStatus == ROAD_EXAM_READY_NEXT && item == 2) {
         StartOvertakeExam(Lane.no);
         RoadExamStatus = ROAD_EXAM_ITEM_OVER_TAKE;
+    } else if (RoadExamStatus == ROAD_EXAM_READY_NEXT && item == 5) {
+        if (RoadExamItem[ROAD_EXAM_ITEM_STRAIGHT] == ROAD_EXAM_ITEM_EXECED &&
+                RoadExamItem[ROAD_EXAM_ITEM_OP_GEAR] == ROAD_EXAM_ITEM_EXECED &&
+                RoadExamItem[ROAD_EXAM_ITEM_CHANGE_LANE] == ROAD_EXAM_ITEM_EXECED &&
+                RoadExamItem[ROAD_EXAM_ITEM_OVER_TAKE] == ROAD_EXAM_ITEM_EXECED) {
+            StartStopCarExam();
+            RoadExamStatus = ROAD_EXAM_ITEM_CAR_STOP;
+        }
     }
 }
 

--
Gitblit v1.8.0