From 6b136af26a51b3d53051cd3e0e7d467ed2ab8a6b Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期四, 05 三月 2020 13:33:21 +0800
Subject: [PATCH] 更新地图

---
 lib/src/main/cpp/test_items/driving_curve.cpp |  192 +++++++++++++++++++++++---------------
 lib/src/main/cpp/driver_test.cpp              |   57 +++++------
 lib/src/main/cpp/rtk_module/rtk.cpp           |    2 
 3 files changed, 143 insertions(+), 108 deletions(-)

diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp
index 321f3c5..443a303 100644
--- a/lib/src/main/cpp/driver_test.cpp
+++ b/lib/src/main/cpp/driver_test.cpp
@@ -878,40 +878,16 @@
 //            }
 //        }
         if (mapList[i].type == MAP_TYPE_CURVE) {
-            const int step = 10;
-            Polygon map;
-            bool enter = false;
+            Line startLine;
+            Line carAxial;
 
-            map.num = 1 + mapList[i].map.num / step + ((mapList[i].map.num % step == 0) ? 0 : 1);
-            map.num += 1 + mapList[i].map2.num / step + ((mapList[i].map2.num % step == 0) ? 0 : 1);
-            map.point = (PointF *) malloc(map.num * sizeof(PointF));
+            MakeLine(&startLine, &mapList[i].map.point[0], &mapList[i].map2.point[0]);
+            MakeLine(&carAxial, &car->carXY[car->axial[AXIAL_FRONT]], &car->carXY[car->axial[AXIAL_REAR]]);
 
-            int n = 0, m = 0;
-            while (n < mapList[i].map.num - 1) {
-                map.point[m++] = mapList[i].map.point[n];
-                n += step;
+            if (IntersectionOf(startLine, carAxial) == GM_Intersection) {
+                if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], startLine) > 0.1)
+                    return i;
             }
-            map.point[m++] = mapList[i].map.point[mapList[i].map.num - 1];
-
-            n = mapList[i].map2.num - 1;
-            while (n > 0) {
-                map.point[m++] = mapList[i].map2.point[n];
-                n -= step;
-            }
-            map.point[m++] = mapList[i].map2.point[0];
-
-            if (IntersectionOf(car->carXY[ car->axial[AXIAL_FRONT] ], &map) == GM_Containment) {
-                Line enterLine1;
-
-                MakeLine(&enterLine1, &(mapList[i].map.point[0]), &(mapList[i].map2.point[0]));
-
-                if (DistanceOf(car->carXY[car->axial[AXIAL_FRONT]], enterLine1) > 0.1)
-                    enter = true;
-            }
-
-            free(map.point);
-
-            if (enter) return i;
         }
     }
     return -1;
@@ -979,6 +955,25 @@
             free(carBody.point);
             free(map.point);
     }
+    if (mapList[index].type == MAP_TYPE_CURVE) {
+        Line carAxial;
+        Line scanLine;
+
+        MakeLine(&carAxial, &car->carXY[car->axial[AXIAL_FRONT]], &car->carXY[car->axial[AXIAL_REAR]]);
+
+        int startL = 0, startR = 0;
+        while (startL < mapList[index].map.num || startR < mapList[index].map2.num) {
+            MakeLine(&scanLine, &mapList[index].map.point[startL], &mapList[index].map.point[startR]);
+            if (IntersectionOf(scanLine, carAxial) == GM_Intersection) {
+                break;
+            }
+            if (startL < mapList[index].map.num)
+                startL++;
+            if (startR < mapList[index].map2.num)
+                startR++;
+        }
+        ret = true;
+    }
 
     return ret;
 }
diff --git a/lib/src/main/cpp/rtk_module/rtk.cpp b/lib/src/main/cpp/rtk_module/rtk.cpp
index cda71de..bb5e332 100644
--- a/lib/src/main/cpp/rtk_module/rtk.cpp
+++ b/lib/src/main/cpp/rtk_module/rtk.cpp
@@ -202,7 +202,7 @@
         }*/
 
         if (RxBufLen > 0) {
-#if 1
+#if 0
             const uint8_t *ptr = parseGPS(RxBuf, RxBuf + RxBufLen);
             if(ptr != RxBuf) {
                 memcpy(RxBuf, ptr, RxBufLen - (ptr - RxBuf));
diff --git a/lib/src/main/cpp/test_items/driving_curve.cpp b/lib/src/main/cpp/test_items/driving_curve.cpp
index b5294a1..3a3cd49 100644
--- a/lib/src/main/cpp/test_items/driving_curve.cpp
+++ b/lib/src/main/cpp/test_items/driving_curve.cpp
@@ -26,15 +26,14 @@
 static bool reportStopCarTimeout;
 static int prevMoveDirect;
 static bool crashRedLine;
-static struct {
+static struct calc_zone_t {
     int leftStart;
     int leftEnd;
     int rightStart;
     int rightEnd;
 } calcZone;
 
-static bool CrashRedLine(const Polygon *left, const Polygon *right, const car_model_cache_t *car);
-static bool ExitTestArea(const Polygon *left, const Polygon *right, const car_model_cache_t *car);
+static bool CrashRedLine(const Polygon *map, const Polygon *map2, const car_model *car, struct calc_zone_t *zone);
 
 void StartDrivingCurve(int moveDirect, const struct RtkTime *rtkTime)
 {
@@ -49,104 +48,145 @@
     reportStopCarTimeout = false;
     crashRedLine = false;
 
-    calcZone.leftStart = calcZone.leftEnd = calcZone.rightStart = calcZone.rightEnd = -1;
+    calcZone.leftStart = calcZone.leftEnd = calcZone.rightStart = calcZone.rightEnd = 0;
 }
 
 int TestDrivingCurve(const Polygon *map, const Polygon *map2, const car_model *car, const car_model *carPrev, double speed, int moveDirect, const struct RtkTime *rtkTime)
 {
     Line start, end;
-    Polygon zone;
+    Line axial;
 
-    if (calcZone.leftStart == -1) {
-        calcZone.leftStart = 0;
-    }
-    if (calcZone.rightStart == -1) {
-        calcZone.rightStart = 0;
+    MakeLine(&axial, &car->carXY[car->axial[AXIAL_FRONT]], &car->carXY[car->axial[AXIAL_REAR]]);
+
+    MakeLine(&start, &map->point[calcZone.leftStart], &map->point[calcZone.rightStart]);
+    MakeLine(&end, &map->point[calcZone.leftEnd], &map->point[calcZone.rightEnd]);
+
+    if (IntersectionOf(start, axial) == GM_None) {
+        // 鍚戣捣鐐规煡鎵�
+        do {
+            if (calcZone.leftStart == 0 && calcZone.rightStart == 0) {
+                break;
+            }
+            if (calcZone.leftStart > 0)
+                calcZone.leftStart--;
+            if (calcZone.rightStart > 0)
+                calcZone.rightStart--;
+            MakeLine(&start, &map->point[calcZone.leftStart], &map->point[calcZone.rightStart]);
+        } while (IntersectionOf(start, axial) == GM_None);
+    } else {
+        // 鍚戠粓鐐规煡鎵�
+        do {
+            if (calcZone.leftStart >= map->num && calcZone.rightStart >= map2->num) {
+                break;
+            }
+            if (calcZone.leftStart < map->num)
+                calcZone.leftStart++;
+            if (calcZone.rightStart < map2->num)
+                calcZone.rightStart++;
+            MakeLine(&start, &map->point[calcZone.leftStart], &map->point[calcZone.rightStart]);
+        } while (IntersectionOf(start, axial) != GM_None);
     }
 
-    start.X1 = map->point[calcZone.leftStart].X;
-    start.Y1 = map->point[calcZone.leftStart].Y;
-
-    start.X2 = map->point[calcZone.rightStart].X;
-    start.Y2 = map->point[calcZone.rightStart].Y;
-
-    zone.num = 4;
-    zone.point = (PointF *) malloc(zone.num * sizeof(PointF));
-    zone.point[0] = car->carXY[car->left_front_tire[TIRE_OUTSIDE]];
-    zone.point[1] = car->carXY[car->right_front_tire[TIRE_OUTSIDE]];
-    zone.point[2] = car->carXY[car->right_rear_tire[TIRE_OUTSIDE]];
-    zone.point[3] = car->carXY[car->left_rear_tire[TIRE_OUTSIDE]];
-
-    if (IntersectionOf(start, &zone) == GM_None) {
-
+    if (IntersectionOf(end, axial) == GM_None) {
+        // 鍚戠粓鐐规煡鎵�
+        do {
+            if (calcZone.leftEnd >= map->num && calcZone.rightEnd >= map2->num) {
+                break;
+            }
+            if (calcZone.leftEnd < map->num)
+                calcZone.leftEnd++;
+            if (calcZone.rightEnd < map2->num)
+                calcZone.rightEnd++;
+            MakeLine(&end, &map->point[calcZone.leftEnd], &map->point[calcZone.rightEnd]);
+        } while (IntersectionOf(end, axial) == GM_None);
+    } else {
+        // 鍚戣捣鐐规煡鎵�
+        do {
+            if (calcZone.leftEnd == 0 && calcZone.rightEnd == 0) {
+                break;
+            }
+            if (calcZone.leftEnd > 0)
+                calcZone.leftEnd--;
+            if (calcZone.rightEnd > 0)
+                calcZone.rightEnd--;
+            MakeLine(&end, &map->point[calcZone.leftEnd], &map->point[calcZone.rightEnd]);
+        } while (IntersectionOf(end, axial) == GM_None);
     }
 
-    free(zone.point);
+    if (calcZone.leftStart <= calcZone.leftEnd || calcZone.rightStart <= calcZone.rightEnd) {
+        // 绂诲紑鍦哄湴
+        testing = false;
+    }
+
+    if (CrashRedLine(map, map2, car, &calcZone)) {
+        if (!crashRedLine) {
+            crashRedLine = true;
+            // 杞﹁疆鍘嬭竟绾匡紝涓嶅悎鏍�
+            AddExamFault(27, rtkTime);
+            DEBUG("杞﹁疆鍘嬭竟绾�");
+        }
+    } else {
+        crashRedLine = false;
+    }
+
+    if (moveDirect != prevMoveDirect) {
+        if (moveDirect == 0) {
+            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);
+        } else {
+
+        }
+        prevMoveDirect = moveDirect;
+    } else if (moveDirect == 0) {
+        uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
+
+        if (tp - stopTimepoint >= STOP_CAR_TIME && !reportStopCarTimeout) {
+            // 鍋滆溅瓒�2绉掞紝涓嶅悎鏍�
+            AddExamFault(28, rtkTime);
+            DEBUG("涓�斿仠杞�");
+            reportStopCarTimeout = true;
+        }
+    }
 
     return testing ? 1 : 0;
 }
 
 // 杞﹁疆鏄惁鍘嬭竟绾�
-static bool CrashRedLine(const Polygon *left, const Polygon *right, const car_model_cache_t *car)
+static bool CrashRedLine(const Polygon *map, const Polygon *map2, const car_model *car, struct calc_zone_t *zone)
 {
     bool ret = false;
 
-    car_model_cache_t *prev_car = GetCarModelCache(1);
-    if (prev_car == NULL)
-        return false;
+    Line frontTireAxial, rearTireAxial;
+    Line redLine;
 
-    // 鎸�4涓疆瀛愮殑澶栦晶璁$畻
-    Line front_left_tire_track, front_right_tire_track, rear_left_tire_track, rear_right_tire_track;
-    MakeLine(&front_left_tire_track,  &car->points[car->desc->front_left_tire[TIRE_OUTSIDE]],  &prev_car->points[car->desc->front_left_tire[TIRE_OUTSIDE]]);
-    MakeLine(&front_right_tire_track,  &car->points[car->desc->front_right_tire[TIRE_OUTSIDE]],  &prev_car->points[car->desc->front_right_tire[TIRE_OUTSIDE]]);
-    MakeLine(&rear_left_tire_track,  &car->points[car->desc->rear_left_tire[TIRE_OUTSIDE]],  &prev_car->points[car->desc->rear_left_tire[TIRE_OUTSIDE]]);
-    MakeLine(&rear_right_tire_track,  &car->points[car->desc->rear_right_tire[TIRE_OUTSIDE]],  &prev_car->points[car->desc->rear_right_tire[TIRE_OUTSIDE]]);
+    MakeLine(&frontTireAxial, &car->carXY[car->left_front_tire[TIRE_OUTSIDE]], &car->carXY[car->right_front_tire[TIRE_OUTSIDE]]);
+    MakeLine(&rearTireAxial, &car->carXY[car->left_rear_tire[TIRE_OUTSIDE]], &car->carXY[car->right_rear_tire[TIRE_OUTSIDE]]);
 
-    Line line;
-
-    line.X1 = left->point[0].X;
-    line.Y1 = left->point[0].Y;
-    for (int i = 1; i < left->num; ++i) {
-        line.X2 = left->point[i].X;
-        line.Y2 = left->point[i].Y;
-
-        if (IntersectionOf(line, front_left_tire_track) == GM_Intersection ||
-                IntersectionOf(line, front_right_tire_track) == GM_Intersection ||
-                IntersectionOf(line, rear_left_tire_track) == GM_Intersection ||
-                IntersectionOf(line, rear_right_tire_track) == GM_Intersection) {
-            ret = true;
-            break;
+    int s = zone->leftStart;
+    for (int e = zone->leftStart + 1; e < zone->leftEnd; ++e) {
+        MakeLine(&redLine, &map->point[s], &map->point[e]);
+        if (IntersectionOf(redLine, frontTireAxial) != GM_None) {
+            return true;
         }
-        line.X1 = line.X2;
-        line.Y1 = line.Y2;
+        if (IntersectionOf(redLine, rearTireAxial) != GM_None) {
+            return true;
+        }
+        s = e;
     }
 
-    line.X1 = right->point[0].X;
-    line.Y1 = right->point[0].Y;
-    for (int i = 1; !ret && i < right->num; ++i) {
-        line.X2 = right->point[i].X;
-        line.Y2 = right->point[i].Y;
-
-        if (IntersectionOf(line, front_left_tire_track) == GM_Intersection ||
-            IntersectionOf(line, front_right_tire_track) == GM_Intersection ||
-            IntersectionOf(line, rear_left_tire_track) == GM_Intersection ||
-            IntersectionOf(line, rear_right_tire_track) == GM_Intersection) {
-            ret = true;
-            break;
+    s = zone->rightStart;
+    for (int e = zone->rightStart + 1; e < zone->rightEnd; ++e) {
+        MakeLine(&redLine, &map2->point[s], &map2->point[e]);
+        if (IntersectionOf(redLine, frontTireAxial) != GM_None) {
+            return true;
         }
-        line.X1 = line.X2;
-        line.Y1 = line.Y2;
+        if (IntersectionOf(redLine, rearTireAxial) != GM_None) {
+            return true;
+        }
+        s = e;
     }
 
     return ret;
-}
-
-// 鏁翠釜杞﹁締閮借椹剁璇ユ祴璇曞尯鍩�
-static bool ExitTestArea(const Polygon *left, const Polygon *right, const car_model_cache_t *car)
-{
-    for (int i = 0; i < car->point_num; ++i) {
-        if (IntersectionOfLine(left->point[0], right->point[0], car->points[i]) != 1)
-            return false;
-    }
-    return true;
 }

--
Gitblit v1.8.0