From a3c194e003b0cfb272e153ff11c510e02c5f72cd Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期一, 25 五月 2020 18:32:11 +0800
Subject: [PATCH] 坐标

---
 lib/src/main/cpp/test_items2/drive_straight.cpp |   34 ++++++++++-
 lib/src/main/cpp/test_items2/drive_straight.h   |    4 +
 lib/src/main/cpp/test_items2/stop_car.h         |    2 
 lib/src/main/cpp/native-lib.cpp                 |    2 
 lib/src/main/cpp/test_items2/road_exam.cpp      |  102 ++++++++++++++++++++++++++++++----
 lib/src/main/cpp/test_items2/stop_car.cpp       |    6 +-
 lib/src/main/cpp/driver_test.h                  |   12 ++--
 lib/src/main/cpp/rtk_platform/platform.cpp      |    2 
 8 files changed, 137 insertions(+), 27 deletions(-)

diff --git a/lib/src/main/cpp/driver_test.h b/lib/src/main/cpp/driver_test.h
index 769a78d..14c6407 100644
--- a/lib/src/main/cpp/driver_test.h
+++ b/lib/src/main/cpp/driver_test.h
@@ -115,12 +115,11 @@
 #define ROAD_ITEM_OPERATE_GEAR      4
 #define ROAD_ITEM_START_CAR         5
 
-enum {
-    ROAD_ACTIVE_FORWARD,
-    ROAD_ACTIVE_TURN_LEFT,
-    ROAD_ACTIVE_TURN_RIGHT,
-    ROAD_ACTIVE_TURN_BACKWARD
-};
+
+#define ROAD_ACTIVE_FORWARD     LANE_FORWARD
+#define ROAD_ACTIVE_TURN_LEFT   LANE_LEFT
+#define ROAD_ACTIVE_TURN_RIGHT  LANE_RIGHT
+#define ROAD_ACTIVE_TURN_BACKWARD   LANE_BACKWARD
 
 typedef struct {
     int character;                  // 灞炴�э紙瀹炵嚎銆佽櫄绾匡紝鏈変簺鍙互鎺夊ご鐨勮矾娈碉級
@@ -174,6 +173,7 @@
     int time;                   // 椤圭洰鏈�澶у畬鎴愭椂闂�
     int distance;               // 椤圭洰鏈�澶у畬鎴愯窛绂�
     string tts;
+    bool cmp;
     std::vector<PointF> points;
     std::vector<PointF> leftPoints; // 瀵瑰簲鍒伴亾璺乏渚х殑鐐�
 } trigger_line_t;
diff --git a/lib/src/main/cpp/native-lib.cpp b/lib/src/main/cpp/native-lib.cpp
index 206f071..b9a2944 100644
--- a/lib/src/main/cpp/native-lib.cpp
+++ b/lib/src/main/cpp/native-lib.cpp
@@ -264,7 +264,7 @@
     ConfigRTKModule();
     MA_Init();
     InitPlatform(phone, RTK_PLATFORM_IP, RTK_PLATFORM_PORT);
-    AppTimer_add(SendBootIndicate, 500);
+    AppTimer_add(SendBootIndicate, D_SEC(1));
 
     InitVirtualDevice(VIRTUAL_RTK_IP, VIRTUAL_RTK_PORT);
 
diff --git a/lib/src/main/cpp/rtk_platform/platform.cpp b/lib/src/main/cpp/rtk_platform/platform.cpp
index be6f0c1..c47a98e 100644
--- a/lib/src/main/cpp/rtk_platform/platform.cpp
+++ b/lib/src/main/cpp/rtk_platform/platform.cpp
@@ -24,6 +24,7 @@
 #include "../test_common/car_sensor.h"
 #include "../test_items2/stop_car.h"
 #include "../test_items2/operate_gear.h"
+#include "../test_items2/drive_straight.h"
 
 #define PARSE_BUFF_SIZE         4096
 
@@ -440,6 +441,7 @@
         DummyLightTTSDone(*((int *)data));
         StopCarTTSDone(*((int *)data));
         OperateGearTTSDone(*((int *)data));
+        DriveStraightTTSDone(*((int *)data));
     }
 }
 
diff --git a/lib/src/main/cpp/test_items2/drive_straight.cpp b/lib/src/main/cpp/test_items2/drive_straight.cpp
index 3b9f8d3..4e006f3 100644
--- a/lib/src/main/cpp/test_items2/drive_straight.cpp
+++ b/lib/src/main/cpp/test_items2/drive_straight.cpp
@@ -8,6 +8,7 @@
 #include "../jni_log.h"
 #include "road_exam.h"
 #include "../master/comm_if.h"
+#include "../common/apptimer.h"
 #include <cmath>
 
 #define DEBUG(fmt, args...)     LOGD("<drive_straight> <%s>: " fmt, __func__, ##args)
@@ -20,24 +21,30 @@
 static bool reportOffsetOver;
 static double edgeDistance;
 static double distanceToStartSum;
+static int examTtsSeq;
 
 static double CalcDistance2Edge(road_t &road,  const car_model *car);
+static void PlayTTSTimeout(union sigval sig);
 
 void StartDriveStraightExam(std::string tts) {
     DEBUG("寮�濮嬬洿绾胯椹�");
 
+    ttsPlayEnd = 0;
     if (!tts.empty()) {
-        PlayTTS(tts.c_str());
+        examTtsSeq = PlayTTS(tts.c_str());
     } else {
-        DEBUG("娌℃湁TTS");
+        examTtsSeq = PlayTTS("璇蜂繚鎸佺洿绾胯椹�");
     }
 
     distanceToStartSum = 0;
     reportOffsetOver = false;
+
+    AppTimer_delete(PlayTTSTimeout);
+    AppTimer_add(PlayTTSTimeout, D_SEC(5));
 }
 
 int ExecuteDriveStraightExam(road_t &road,  const car_model *car,
-                             LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime) {
+                             const trigger_line_t *item, const struct RtkTime *rtkTime) {
     static PointF startPoint;
 
     double dis2roadEdge = 0;
@@ -86,6 +93,27 @@
     return 1;
 }
 
+void DriveStraightTTSDone(int id)
+{
+    // 绛夎闊虫挱鎶ュ畬姣曞悗璁℃椂
+    if (id == examTtsSeq) {
+        DEBUG("StopCarTTSDone %d", id);
+        ttsPlayEnd = 1;
+    }
+}
+
+void TerminateDriveStraightExam(void)
+{
+    AppTimer_delete(PlayTTSTimeout);
+}
+
+static void PlayTTSTimeout(union sigval sig)
+{
+    AppTimer_delete(PlayTTSTimeout);
+
+    ttsPlayEnd = 1;
+}
+
 static double CalcDistance2Edge(road_t &road,  const car_model *car)
 {
     PointF vp;
diff --git a/lib/src/main/cpp/test_items2/drive_straight.h b/lib/src/main/cpp/test_items2/drive_straight.h
index d4fd2ba..1187221 100644
--- a/lib/src/main/cpp/test_items2/drive_straight.h
+++ b/lib/src/main/cpp/test_items2/drive_straight.h
@@ -9,6 +9,8 @@
 
 void StartDriveStraightExam(std::string tts);
 int ExecuteDriveStraightExam(road_t &road,  const car_model *car,
-                             LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime);
+                             const trigger_line_t *item, const struct RtkTime *rtkTime);
+void DriveStraightTTSDone(int id);
+void TerminateDriveStraightExam(void);
 
 #endif //MYAPPLICATION2_DRIVE_STRAIGHT_H
diff --git a/lib/src/main/cpp/test_items2/road_exam.cpp b/lib/src/main/cpp/test_items2/road_exam.cpp
index d132808..f7b028d 100644
--- a/lib/src/main/cpp/test_items2/road_exam.cpp
+++ b/lib/src/main/cpp/test_items2/road_exam.cpp
@@ -34,6 +34,12 @@
     START_CAR_DONE
 };
 
+enum {
+    STOP_CAR_NOT_DO,
+    STOP_CAR_DOING,
+    STOP_CAR_DONE
+};
+
 static const int INVALID_ROAD = -1;
 
 static const int TURN_THRESHOLD = 1;
@@ -43,6 +49,7 @@
 const double CHANGE_LANE_RANGE = 100.0;
 const double OVERTAKE_RANGE = 150.0;
 const double OVERTAKE_HOLD_RANGE = 30.0;                // 鍦ㄨ秴杞﹂亾琛岄┒鐨勪竴娈佃窛绂�
+const double EXAM_RANGE = 3000.0;                       // 鑷冲皯椹鹃┒璺濈
 
 static const double LASTEST_BREAK_POINT = 30.0;
 static const double NEXT_ROAD_TIP = 100.0;                  // 鍒拌揪璺彛鍓嶆彁绀轰笅涓�涓�庝箞璧�
@@ -81,7 +88,7 @@
 static int gearErrorTime;
 static int gearNSlideTime;
 
-static int startCar;
+static int startCar, stopCar;
 static int currExamMapIndex;
 static trigger_line_t *currRoadItem;
 static int nextRoadId;
@@ -104,6 +111,10 @@
     int type;           // 瀹炵嚎锛岃櫄绾�
 } CurrentLane;
 static bool laneChanging;
+static double odoGraph;
+static struct drive_timer odoTimer;
+static double odoPrevSpeed;
+static int odoCnt;
 
 static const int MAX_ENGINE_RPM = 2500;
 static const double START_CAR_MOVE_DISTANCE = 10.0;
@@ -140,6 +151,7 @@
 static void ArrivedRoadEnd(road_t &road, const car_model *car, LIST_CAR_MODEL &CarModelList);
 static trigger_line_t * EntryItem(int index, road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList);
 static void ClearAll(road_exam_map &map);
+static bool AllCmp(road_exam_map &map);
 static void CheckBreakActive(road_exam_map &map, const car_model *car, LIST_CAR_MODEL &CarModelList,
                              double speed, int moveDirect, const struct RtkTime *rtkTime);
 
@@ -172,6 +184,8 @@
     currExamMapIndex = FIND_POSITION;
 
     startCar = START_CAR_NOT_DO;
+    stopCar = STOP_CAR_NOT_DO;
+
     currRoadItem = NULL;
 
     checkDoor = false;
@@ -187,6 +201,11 @@
 
     nextRoadId = -1;
     ClearAll(RoadMap);
+
+    odoGraph = 0.0;
+    odoCnt = 0;
+
+    // 鍒濆鍖栬�冮」
 }
 
 void TerminateRoadExam(void)
@@ -194,6 +213,7 @@
     TerminateDummyLightExam();
     TerminateStopCarExam();
     TerminateOperateGearExam();
+    TerminateDriveStraightExam();
 
     AppTimer_delete(TurnSignalError13ColdTimer);
     AppTimer_delete(TurnSignalError14ColdTimer);
@@ -306,6 +326,25 @@
 
 void TestRoadGeneral(road_exam_map &RoadMap, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime)
 {
+    // 琛岄┒璺濈锛屼笉鍖呭惈鍊掕溅
+    if (odoCnt == 0 && moveDirect == 1) {
+        odoPrevSpeed = speed;
+        odoCnt = 1;
+        Rtk2DriveTimer(odoTimer, rtkTime);
+    } else if (odoCnt == 1) {
+        uint32_t tm = TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10,
+                                  odoTimer.hour, odoTimer.min, odoTimer.sec, odoTimer.msec*10);
+        if (tm >= D_SEC(1)) {
+            odoGraph += ((double)tm)*(odoPrevSpeed + speed)/2.0/1000.0;
+            if (moveDirect == 1) {
+                Rtk2DriveTimer(odoTimer, rtkTime);
+                odoPrevSpeed = speed;
+            } else {
+                odoCnt = 0;
+            }
+        }
+    }
+
     // 瓒呴�熸娴�
     if (moveDirect != 0 && speed > MAX_SPEED) {
         if (!occurOverSpeed) {
@@ -636,7 +675,9 @@
             crashRedLineNow = true;
         }
 
+        // 妫�鏌ュ綋鍓嶈溅閬�
         struct car_on_lane lane;
+
         if (UpdateLane(lane, RoadMap.roads[currExamMapIndex], car)) {
 
             if (lane.road == CurrentLane.road && lane.separate == CurrentLane.separate &&
@@ -737,7 +778,7 @@
                 }
             }
 
-            if (lane.road != CurrentLane.road || lane.separate != CurrentLane.separate) {
+            if (lane.road != CurrentLane.road || lane.separate != CurrentLane.separate || lane.direct != CurrentLane.direct) {
                 // 璺垨娈靛彉鏇达紝鎾ら攢鍙橀亾璺熻釜
                 DEBUG("============== 璺垨娈靛彉鏇� CURR %d, %d dir %d NEW %d, %d, dir %d", CurrentLane.road,
                       CurrentLane.separate, CurrentLane.direct,
@@ -818,7 +859,17 @@
     if (startCar != START_CAR_DONE)
         return;
 
-    // 妫�娴嬬敱瑙﹀彂绾挎帶鍒剁殑椤圭洰
+    if (odoGraph > EXAM_RANGE && currRoadItem == NULL && AllCmp(RoadMap) && stopCar == STOP_CAR_NOT_DO) {
+        // 鍦ㄥ悎閫傛潯浠朵笅鍋滆溅缁撴潫鑰冭瘯
+        StartStopCarExam("");
+        stopCar = STOP_CAR_DOING;
+    } else if (stopCar == STOP_CAR_DOING) {
+        if (ExecuteStopCarExam(RoadMap.roads[currExamMapIndex], car, CarModelList, speed, moveDirect, rtkTime) < 0)
+            stopCar = STOP_CAR_DONE;
+    }
+
+
+    // 鎵ц鏌愪釜椤圭洰
     if (currRoadItem != NULL) {
         if (currRoadItem->active == ROAD_ITEM_CHANGE_LANE) {
             if (DistanceOf(car->basePoint, roadItemStartPoint) > CHANGE_LANE_RANGE) {
@@ -837,11 +888,20 @@
                 currRoadItem = NULL;
             }
         } else if (currRoadItem->active == ROAD_ITEM_OPERATE_GEAR) {
-            ExecuteOperateGearExam(rtkTime);
+            if (ExecuteOperateGearExam(rtkTime) < 0) {
+                currRoadItem = NULL;
+            }
+        } else if (currRoadItem->active == ROAD_ITEM_STRAIGHT) {
+            if (ExecuteDriveStraightExam(RoadMap.roads[currExamMapIndex], car, currRoadItem, rtkTime) < 0) {
+                currRoadItem = NULL;
+            }
         }
-    } else if (currExamMapIndex >= 0) {
-        currRoadItem = EntryItem(currExamMapIndex, RoadMap, car, CarModelList);
-        if (currRoadItem != NULL) {
+    } // 妫�娴嬬敱瑙﹀彂绾挎帶鍒剁殑椤圭洰
+    else if (currExamMapIndex >= 0) {
+        trigger_line_t *new_item = EntryItem(currExamMapIndex, RoadMap, car, CarModelList);
+
+        if (new_item != NULL && !new_item->cmp) {
+            currRoadItem = new_item;
             if (!currRoadItem->tts.empty())
                 PlayTTS(currRoadItem->tts.c_str());
 
@@ -853,6 +913,8 @@
                 overtake = false;
             } else if (currRoadItem->active == ROAD_ITEM_OPERATE_GEAR) {
                 StartOperateGearExam(rtkTime);
+            } else if (currRoadItem->active == ROAD_ITEM_STRAIGHT) {
+                StartDriveStraightExam(currRoadItem->tts);
             }
         }
     }
@@ -903,7 +965,7 @@
                 MakeLine(&rightExtLine, &car->carXY[car->axial[AXIAL_FRONT]], &vp);
                 goto RIGHT_EXT_CMP;
             } else {
-                DEBUG("鍙充晶涓嶅瀭鐐� %d p1(%f,%f) p2(%f,%f) (%f,%f)", j, p1.X, p1.Y, p2.X, p2.Y, vp.X, vp.Y);
+//                DEBUG("鍙充晶涓嶅瀭鐐� %d p1(%f,%f) p2(%f,%f) (%f,%f)", j, p1.X, p1.Y, p2.X, p2.Y, vp.X, vp.Y);
             }
             p1 = p2;
         }
@@ -946,7 +1008,6 @@
                         orthogonalInSegment = true;
                         intersection = true;
 
-//                        DEBUG("鍒嗛亾绾� %d 宸︽浜�", j);
                         break;
                     } else if (IntersectionOf(rightExtLine, sep) == GM_Intersection) {
                         vector<int> stor(4);
@@ -960,7 +1021,6 @@
                         orthogonalInSegment = true;
                         intersection = true;
 
-//                        DEBUG("鍒嗛亾绾� %d 鍙虫浜�", j);
                         break;
                     }
                     p1 = p2;
@@ -983,12 +1043,15 @@
                             lane.road = road.id;
                             lane.separate = i;
                             lane.lane = itx->first;
+
+//                            DEBUG("left_char %d second %d", left_char, itx->second[1]);
+
                             if ((left_char == LINE_SOLID || left_char == LINE_HALF_SOLID_RIGHT) &&
                                     (itx->second[1] == LINE_SOLID || itx->second[1] == LINE_HALF_SOLID_LEFT))    // 杞﹂亾宸﹀彸鍧囨槸瀹炵嚎
                                 lane.direct = itx->second[2];
                             else
                                 lane.direct = 0;
-//                            DEBUG("璺� %d 娈� %d 杞﹂亾 %d", lane.road, lane.separate, lane.lane);
+//                            DEBUG("璺� %d 娈� %d 杞﹂亾 %d 闄愬畾 %d", lane.road, lane.separate, lane.lane, lane.direct);
                             break;
                         } else {
                             right_direct = itx->second[3];
@@ -1000,12 +1063,15 @@
                     lane.road = road.id;
                     lane.separate = i;
                     lane.lane = orthogonal.size();
+
+//                    DEBUG("left_char %d right_direct %d", left_char, right_direct);
+
                     // 鏈�鍚庤溅閬撶殑鍙充晶闄愬畾
                     if (left_char == LINE_SOLID || left_char == LINE_HALF_SOLID_RIGHT)
                         lane.direct = right_direct;
                     else
                         lane.direct = 0;
-//                    DEBUG("璺� %d 娈� %d 杞﹂亾 %d", lane.road, lane.separate, lane.lane);
+//                    DEBUG("璺� %d 娈� %d 杞﹂亾 %d 闄愬畾 %d", lane.road, lane.separate, lane.lane, lane.direct);
                 }
                 out = lane;
                 return true;
@@ -1835,6 +1901,15 @@
     return NULL;
 }
 
+static bool AllCmp(road_exam_map &map)
+{
+    for (int i = 0; i < map.triggerLines.size(); ++i) {
+        if (!map.triggerLines[i].cmp)
+            return false;
+    }
+    return true;
+}
+
 /************************************************************************
  * 寮�濮嬫柊鐨勮�冭瘯鍚庯紝娓呴櫎鍦板浘鎵�鏈夌殑鍒硅溅銆佸仠杞﹁褰�
  * @param map
@@ -1849,6 +1924,9 @@
     for (int i = 0; i < map.specialAreas.size(); i++) {
         map.specialAreas[i].overSpeed = map.specialAreas[i].activeBreak = false;
     }
+    for (int i = 0; i < map.triggerLines.size(); ++i) {
+        map.triggerLines[i].cmp = false;
+    }
 }
 
 static void CheckBreakActive(road_exam_map &map, const car_model *car, LIST_CAR_MODEL &CarModelList,
diff --git a/lib/src/main/cpp/test_items2/stop_car.cpp b/lib/src/main/cpp/test_items2/stop_car.cpp
index 514b2e4..c52bcd8 100644
--- a/lib/src/main/cpp/test_items2/stop_car.cpp
+++ b/lib/src/main/cpp/test_items2/stop_car.cpp
@@ -69,7 +69,7 @@
     AppTimer_delete(PlayTTSTimeout);
 }
 
-int ExecuteStopCarExam(int index, road_t &road, const car_model *car,
+int ExecuteStopCarExam(road_t &road, const car_model *car,
                              LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime) {
     if (ttsPlayEnd == 1) {
         ttsPlayEnd = 2;
@@ -78,7 +78,7 @@
     }
 
     if (ttsPlayEnd != 2)
-        return index;
+        return 1;
 
     uint32_t diff = TimeGetDiff(rtkTime->hh, rtkTime->mm, rtkTime->ss,
                                 rtkTime->mss * 10,
@@ -220,7 +220,7 @@
         }
     }
 
-    return index;
+    return 1;
 }
 
 static void PlayTTSTimeout(union sigval sig)
diff --git a/lib/src/main/cpp/test_items2/stop_car.h b/lib/src/main/cpp/test_items2/stop_car.h
index 4b3f622..4519ef0 100644
--- a/lib/src/main/cpp/test_items2/stop_car.h
+++ b/lib/src/main/cpp/test_items2/stop_car.h
@@ -8,7 +8,7 @@
 #include "../driver_test.h"
 
 void StartStopCarExam(std::string tts);
-int ExecuteStopCarExam(int index, road_t &road, const car_model *car,
+int ExecuteStopCarExam(road_t &road, const car_model *car,
                        LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, const struct RtkTime *rtkTime);
 void TerminateStopCarExam(void);
 void StopCarTTSDone(int id);

--
Gitblit v1.8.0