From 4ff195404b21f74ca11e26a69cbf0418eaa4595f Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期二, 17 三月 2020 17:57:03 +0800
Subject: [PATCH] 科目三草案实现

---
 lib/src/main/cpp/driver_test.cpp |  189 +++++++++++++++++++++++++++++++----------------
 1 files changed, 125 insertions(+), 64 deletions(-)

diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp
index 0898aa2..99eac50 100644
--- a/lib/src/main/cpp/driver_test.cpp
+++ b/lib/src/main/cpp/driver_test.cpp
@@ -14,6 +14,7 @@
 #include <list>
 #include <numeric>
 #include <algorithm>
+#include <string>
 
 #include "driver_test.h"
 #include "defs.h"
@@ -88,42 +89,9 @@
     Polygon map2;
 } MapList[MAP_LIST_SIZE];
 
-struct trigger_line {
-    int mapId;
-    Line tirgger;
-};
+static Polygon RoadMapPoints;
 
-struct road_exam_parent_map {
-    int id;
-    int type;
-    Polygon map;
-    int redLineNum;
-    Polygon *redLine;
-    int greenLineNum;
-    Polygon *greenLine;
-    int redAreaNum;
-    Polygon *redArea;
-    int triggerLineNum;
-    struct trigger_line *triggerLine;
-};
-
-static struct road_exam_parent_map * RoadParentMap;
-
-struct road_exam_son_map {
-    int id;
-    int type;
-    char tts[512];
-    Line triggerLine;
-    Line controlLine;
-    Line targetLine;
-    int stop_flag;
-
-    int redLineNum;
-    Polygon *redLine;
-};
-
-typedef list<struct road_exam_son_map *> LIST_ROAD_SON_MAP;
-static LIST_ROAD_SON_MAP RoadSonMapList;
+static LIST_ROAD_MAP RoadMapList;
 
 static int MapNum = 0;
 static int CurrExamMapIndex = -1;
@@ -136,7 +104,7 @@
 
 typedef list<car_model *> LIST_CAR_MODEL;
 
-static LIST_CAR_MODEL CarModelList;
+static LIST_CAR_MODEL CarModelList;             // 涓�娈垫椂闂寸殑杞﹁締杞ㄨ抗闆嗗悎
 
 static struct dummy_light_exam *DummyLightContent;
 static int DummyLightContentSize;
@@ -174,8 +142,10 @@
     CarModel = NULL;
     CarModelList.clear();
 
-    RoadParentMap = NULL;
-    RoadSonMapList.clear();
+    RoadMapPoints.num = 0;
+    RoadMapPoints.point = NULL;
+
+    RoadMapList.clear();
 
     CarSensorInit();
 
@@ -252,42 +222,133 @@
     DEBUG("AddMap num %d", MapNum);
 }
 
-void AddRoadMapParent(int id, int type, const double (*points)[2], int pointNum, const int **redLine,
-        int redLineNum, const int **greenLine, int greenLineNum)
+void CleanRoadMap(void)
 {
-    int id;
-    int type;
-    Polygon map;
-    int redLineNum;
-    Polygon *redLine;
-    int greenLineNum;
-    Polygon *greenLine;
-    int redAreaNum;
-    Polygon *redArea;
-    int triggerLineNum;
-    struct trigger_line *triggerLine;
+    if (ExamStart) return;
 
-    RoadParentMap = (struct road_exam_parent_map *)malloc(sizeof(struct road_exam_parent_map));
-    RoadParentMap->id = id;
-    RoadParentMap->type = type;
+    if (RoadMapPoints.point != NULL) {
+        free(RoadMapPoints.point);
+    }
+    RoadMapPoints.num = 0;
 
-    RoadParentMap->map.num = pointNum;
-    if (pointNum > 0) {
-        RoadParentMap->map.point = (PointF *)malloc(sizeof(PointF) * pointNum);
-        for (int i = 0; i < pointNum; ++i) {
-            RoadParentMap->map.point[i].X = points[i][0];
-            RoadParentMap->map.point[i].Y = points[i][1];
+    for (int i = 0; i < RoadMapList.size(); ++i) {
+        struct road_exam_map map = RoadMapList[i];
+
+        if (map.redLine != NULL) {
+            for (int j = 0; j < map.redLineNum; ++j) {
+                if (map.redLine[j].point != NULL)
+                    free(map.redLine[j].point);
+            }
+            free(map.redLine);
+        }
+
+        if (map.greenLine != NULL) {
+            for (int j = 0; j < map.greenLineNum; ++j) {
+                if (map.greenLine[j].point != NULL)
+                    free(map.greenLine[j].point);
+            }
+            free(map.greenLine);
+        }
+
+        if (map.redArea != NULL) {
+            for (int j = 0; j < map.redAreaNum; ++j) {
+                if (map.redArea[j].point != NULL)
+                    free(map.redArea[j].point);
+            }
+            free(map.redArea);
+        }
+
+        if (map.triggerLine != NULL) {
+            for (int j = 0; j < map.triggerLineNum; ++j) {
+                if (map.triggerLine[j].point != NULL)
+                    free(map.triggerLine[j].point);
+            }
+            free(map.triggerLine);
         }
     }
 
-    RoadParentMap->redLineNum = redLineNum;
-    RoadParentMap->redLine = (Polygon *) malloc(sizeof(Polygon *));
+    RoadMapList.clear();
+}
 
-    for (int i = 0; i < redLineNum; ++i) {
-        RoadParentMap->redLine[i].num =
+void SetRoadMapPoints(vector<double> &mapPoints)
+{
+    DEBUG("鍔犲叆璺�冨湴鍥剧偣闆嗗悎 num = %d", mapPoints.size()/2);
+
+    RoadMapPoints.num = mapPoints.size()/2;
+
+    if (RoadMapPoints.num > 0) {
+        RoadMapPoints.point = (PointF *)malloc(sizeof(PointF) * RoadMapPoints.num);
+        for (int i = 0; i < RoadMapPoints.num; ++i) {
+            RoadMapPoints.point[i].X = mapPoints[i*2];
+            RoadMapPoints.point[i].Y = mapPoints[i*2+1];
+        }
+    }
+}
+
+void AddRoadMapParent(int id, int type, string tts, vector<vector<int>> &redLines,
+                      vector<vector<int>> &redAreas, vector<vector<int>> &greenLines, vector<vector<int>> &triggerLines)
+{
+    struct road_exam_map newMap;
+
+    newMap.id = id;
+    newMap.type = type;
+    newMap.tts = tts;
+
+    DEBUG("鍔犲叆璺�冨湴鍥句俊鎭� id = %d type = %d", id, type);
+
+    if ((newMap.redLineNum = redLines.size()) > 0) {
+        newMap.redLine = (Polygon *) malloc(sizeof(Polygon) * newMap.redLineNum);
+
+        for (int i = 0; i < newMap.redLineNum; ++i) {
+            newMap.redLine[i].num = redLines[i].size();
+            newMap.redLine[i].point = (PointF *) malloc(sizeof(PointF) * newMap.redLine[i].num);
+
+            for (int j = 0; j < newMap.redLine[i].num; ++j) {
+                newMap.redLine[i].point[j] = RoadMapPoints.point[redLines[i][j]];
+            }
+        }
     }
 
+    if ((newMap.redAreaNum = redAreas.size()) > 0) {
+        newMap.redArea = (Polygon *) malloc(sizeof(Polygon) * newMap.redAreaNum);
 
+        for (int i = 0; i < newMap.redAreaNum; ++i) {
+            newMap.redArea[i].num = redAreas[i].size();
+            newMap.redArea[i].point = (PointF *) malloc(sizeof(PointF) * newMap.redLine[i].num);
+
+            for (int j = 0; j < newMap.redArea[i].num; ++j) {
+                newMap.redArea[i].point[j] = RoadMapPoints.point[redAreas[i][j]];
+            }
+        }
+    }
+
+    if ((newMap.greenLineNum = greenLines.size()) > 0) {
+        newMap.greenLine = (Polygon *) malloc(sizeof(Polygon) * newMap.greenLineNum);
+
+        for (int i = 0; i < newMap.greenLineNum; ++i) {
+            newMap.greenLine[i].num = greenLines[i].size();
+            newMap.greenLine[i].point = (PointF *) malloc(sizeof(PointF) * newMap.greenLine[i].num);
+
+            for (int j = 0; j < newMap.greenLine[i].num; ++j) {
+                newMap.greenLine[i].point[j] = RoadMapPoints.point[greenLines[i][j]];
+            }
+        }
+    }
+
+    if ((newMap.triggerLineNum = triggerLines.size()) > 0) {
+        newMap.triggerLine = (Polygon *) malloc(sizeof(Polygon) * newMap.triggerLineNum);
+
+        for (int i = 0; i < newMap.triggerLineNum; ++i) {
+            newMap.triggerLine[i].num = triggerLines[i].size();
+            newMap.triggerLine[i].point = (PointF *) malloc(sizeof(PointF) * newMap.triggerLine[i].num);
+
+            for (int j = 0; j < newMap.triggerLine[i].num; ++j) {
+                newMap.triggerLine[i].point[j] = RoadMapPoints.point[triggerLines[i][j]];
+            }
+        }
+    }
+
+    RoadMapList.push_back(newMap);
 }
 
 void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire,

--
Gitblit v1.8.0