From 46f56f26bfcc6ce26ffd8132ee11bf019eef3289 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期一, 13 四月 2020 11:48:28 +0800
Subject: [PATCH] 计算边距

---
 lib/src/main/cpp/test_items/park_bottom.cpp             |   19 +++
 lib/src/main/cpp/test_items/turn_a90.cpp                |   16 +++
 lib/src/main/cpp/test_items/driving_curve.cpp           |   26 +++++
 lib/src/main/cpp/test_items/park_edge.cpp               |   21 ++++
 lib/src/main/cpp/test_items/stop_and_start.cpp          |   11 +
 lib/src/main/cpp/test_items/area_exam.cpp               |   55 +++++++++++
 lib/src/main/cpp/test_items/area_exam.h                 |    3 
 lib/src/main/cpp/test_common/Geometry.h                 |    1 
 lib/src/main/cpp/test_common/Geometry.cpp               |   37 ++++++
 lib/src/main/java/com/anyun/exam/lib/RemoteService.java |   54 ++++++++++
 10 files changed, 238 insertions(+), 5 deletions(-)

diff --git a/lib/src/main/cpp/test_common/Geometry.cpp b/lib/src/main/cpp/test_common/Geometry.cpp
index db6deb5..3b80f09 100644
--- a/lib/src/main/cpp/test_common/Geometry.cpp
+++ b/lib/src/main/cpp/test_common/Geometry.cpp
@@ -245,6 +245,7 @@
 
 Relation IntersectionOf(Line line1, Line line2)
 {
+    //  Fail if either line segment is zero-length.
     if ((isEqual(line1.X1, line1.X2) && isEqual(line1.Y1, line1.Y2)) || (isEqual(line2.X1, line2.X2) && isEqual(line2.Y1, line2.Y2)))
         return GM_None;
 
@@ -254,14 +255,15 @@
     if ((isEqual(line1.X1, line2.X2) && isEqual(line1.Y1, line2.Y2)) || (isEqual(line1.X2, line2.X2) && isEqual(line1.Y2, line2.Y2)))
         return GM_Intersection;
 
-    //  鐩寸嚎鍧愭爣鍙樻崲閲嶅悎
+    //  (1) Translate the system so that point A is on the origin.
     line1.X2 -= line1.X1; line1.Y2 -= line1.Y1;
     line2.X1 -= line1.X1; line2.Y1 -= line1.Y1;
     line2.X2 -= line1.X1; line2.Y2 -= line1.Y1;
 
+    //  Discover the length of segment A-B.
     double distAB = sqrt(line1.X2 * line1.X2 + line1.Y2 * line1.Y2);
 
-    //  鏃嬭浆鍒癤杞�
+    //  (2) Rotate the system so that point B is on the positive X axis.
     double theCos = line1.X2 / distAB;
     double theSin = line1.Y2 / distAB;
     double newX = line2.X1 * theCos + line2.Y1 * theSin;
@@ -272,16 +274,19 @@
     line2.Y2 = line2.Y2 * theCos - line2.X2 * theSin;
     line2.X2 = newX;
 
+    //  Fail if segment C-D doesn't cross line A-B.
     if ((line2.Y1 < 0 && line2.Y2 < 0) || (line2.Y1 >= 0 && line2.Y2 >= 0)) {
         return GM_None;
     }
 
+    //  (3) Discover the position of the intersection point along line A-B.
     double posAB = line2.X2 + (line2.X1 - line2.X2) * line2.Y2 / (line2.Y2 - line2.Y1);
 
+    //  Fail if segment C-D crosses line A-B outside of segment A-B.
     if (posAB < 0 || posAB > distAB) {
         return GM_None;
     }
-
+    //  (4) Apply the discovered position to line A-B in the original coordinate system.
     return GM_Intersection;
 }
 
@@ -471,6 +476,32 @@
     return p4;
 }
 
+/**************************************************************
+ * p3浜� p1---p2鏋勬垚鐩寸嚎
+ * @param p1
+ * @param p2
+ * @param p3
+ * @return
+ */
+bool VerticalPointOnLine(PointF point, Line line)
+{
+    PointF p1, p2;
+
+    p1.X = line.X1;
+    p1.Y = line.Y1;
+
+    p2.X = line.X2;
+    p2.Y = line.Y2;
+
+    PointF pv = GetVerticalPoint(p1, p2, point);
+
+    if (isEqual2(pv.X, MIN(p1.X, p2.X)) || isEqual2(pv.X, MAX(p1.X, p2.X)) ||
+        (pv.X > MIN(p1.X, p2.X) && pv.X < MAX(p1.X, p2.X))) {
+        return true;
+    }
+    return false;
+}
+
 /****************************************************************
  *                      p3
  *                      |  'L'
diff --git a/lib/src/main/cpp/test_common/Geometry.h b/lib/src/main/cpp/test_common/Geometry.h
index aacdb54..ebfd47c 100644
--- a/lib/src/main/cpp/test_common/Geometry.h
+++ b/lib/src/main/cpp/test_common/Geometry.h
@@ -58,6 +58,7 @@
 bool OutsidePolygon(const Polygon *t1, const Polygon *t2);
 int IntersectionOfLine(PointF p1, PointF p2, PointF p3);
 PointF GetVerticalPoint(PointF p1, PointF p2, PointF p3);
+bool VerticalPointOnLine(PointF point, Line line);
 PointF Calc3Point(PointF p1, PointF p2, double L, char dir);
 
 #endif //GUI_GEOMETRY_H
diff --git a/lib/src/main/cpp/test_items/area_exam.cpp b/lib/src/main/cpp/test_items/area_exam.cpp
index e9bee0c..819910b 100644
--- a/lib/src/main/cpp/test_items/area_exam.cpp
+++ b/lib/src/main/cpp/test_items/area_exam.cpp
@@ -43,6 +43,61 @@
     ExecuteExam(CurrExamMapIndex, AreaMapList, car, CarModelList, speed, moveDirect, azimuth, rtkTime);
 }
 
+void DistanceOfTire2X(std::vector<double> &array, const car_model *car, std::vector<Line> line_set)
+{
+    double ld = 100, rd = 100;
+
+    array.clear();
+
+    for (auto line = line_set.begin(); line != line_set.end(); line++) {
+        double ld_t = 100, rd_t = 100;
+        double d;
+        if (VerticalPointOnLine(car->carXY[car->left_front_tire[TIRE_OUTSIDE]], *line)) {
+            d = DistanceOf(car->carXY[car->left_front_tire[TIRE_OUTSIDE]], *line);
+            if (d < ld_t) {
+                ld_t = d;
+            }
+        }
+        if (VerticalPointOnLine(car->carXY[car->left_rear_tire[TIRE_OUTSIDE]], *line)) {
+            d = DistanceOf(car->carXY[car->left_rear_tire[TIRE_OUTSIDE]], *line);
+            if (d < ld_t) {
+                ld_t = d;
+            }
+        }
+
+        if (VerticalPointOnLine(car->carXY[car->right_front_tire[TIRE_OUTSIDE]], *line)) {
+            d = DistanceOf(car->carXY[car->right_front_tire[TIRE_OUTSIDE]], *line);
+            if (d < rd_t) {
+                rd_t = d;
+            }
+        }
+        if (VerticalPointOnLine(car->carXY[car->right_rear_tire[TIRE_OUTSIDE]], *line)) {
+            d = DistanceOf(car->carXY[car->right_rear_tire[TIRE_OUTSIDE]], *line);
+            if (d < rd_t) {
+                rd_t = d;
+            }
+        }
+
+        if (isEqual2(ld_t, rd_t)) {
+            if (!isEqual(ld_t, 100)) {
+                if (rd_t < rd)
+                    rd = rd_t;
+                if (ld_t < ld)
+                    ld = ld_t;
+            }
+        } else if (ld_t > rd_t) {
+            if (rd_t < rd)
+                rd = rd_t;
+        } else {
+            if (ld_t < ld)
+                ld = ld_t;
+        }
+    }
+
+    array.push_back(ld);
+    array.push_back(rd);
+}
+
 static void DetectEnterOrExitMap(const car_model *car, LIST_CAR_MODEL &CarModelList, LIST_AREA_MAP &mapList)
 {
     if (CurrExamMapIndex < 0) {
diff --git a/lib/src/main/cpp/test_items/area_exam.h b/lib/src/main/cpp/test_items/area_exam.h
index fe00467..f87ffc5 100644
--- a/lib/src/main/cpp/test_items/area_exam.h
+++ b/lib/src/main/cpp/test_items/area_exam.h
@@ -5,9 +5,12 @@
 #ifndef MYAPPLICATION2_AREA_EXAM_H
 #define MYAPPLICATION2_AREA_EXAM_H
 
+#include <vector>
 #include "../driver_test.h"
 
 void InitAreaExam(void);
 void TerminateAreaExam(void);
 void TestAreaGeneral(LIST_AREA_MAP &AreaMapList, const car_model *car, LIST_CAR_MODEL &CarModelList, double speed, int moveDirect, double azimuth, const struct RtkTime *rtkTime);
+void DistanceOfTire2X(std::vector<double> &array, const car_model *car, std::vector<Line> line_set);
+
 #endif //MYAPPLICATION2_AREA_EXAM_H
diff --git a/lib/src/main/cpp/test_items/driving_curve.cpp b/lib/src/main/cpp/test_items/driving_curve.cpp
index 24ad383..e292326 100644
--- a/lib/src/main/cpp/test_items/driving_curve.cpp
+++ b/lib/src/main/cpp/test_items/driving_curve.cpp
@@ -9,6 +9,7 @@
 #include "../utils/xconvert.h"
 #include "../master/comm_if.h"
 #include "../native-lib.h"
+#include "area_exam.h"
 
 #include <vector>
 #include <cstdlib>
@@ -60,6 +61,10 @@
 {
     Polygon tireRect;
     int who = 0;
+    vector<double> dtox;
+    vector<Line> line_set;
+    int s;
+
     MakePolygon(&tireRect, {car->carXY[car->left_front_tire[TIRE_OUTSIDE]],
                             car->carXY[car->right_front_tire[TIRE_OUTSIDE]],
                             car->carXY[car->right_rear_tire[TIRE_OUTSIDE]],
@@ -75,6 +80,27 @@
     // 鏇存柊杞﹀熬鎵弿绾�
     UpdateEndLine(false, &scanWindow, map, map2, &tireRect);
 
+    // 璁$畻杈硅窛
+    s = scanWindow.leftStart;
+    for (int e = scanWindow.leftStart - 1; e >= scanWindow.leftEnd; --e) {
+        Line redLine;
+        MakeLine(&redLine, &map->point[s], &map->point[e]);
+        line_set.push_back(redLine);
+        s = e;
+    }
+
+    s = scanWindow.rightStart;
+    for (int e = scanWindow.rightStart - 1; e >= scanWindow.rightEnd; --e) {
+        Line redLine;
+        MakeLine(&redLine, &map2->point[s], &map2->point[e]);
+        line_set.push_back(redLine);
+        s = e;
+    }
+
+    DistanceOfTire2X(dtox, car, line_set);
+
+    MA_SendDistance(dtox[0], dtox[1]);
+
     DEBUG("scanWindow leftStart %d leftEnd %d rightStart %d rightEnd %d", scanWindow.leftStart, scanWindow.leftEnd, scanWindow.rightStart, scanWindow.rightEnd);
 
     if (CrashRedLine(map, map2, car, &scanWindow, who)) {
diff --git a/lib/src/main/cpp/test_items/park_bottom.cpp b/lib/src/main/cpp/test_items/park_bottom.cpp
index b4546f6..4e622a0 100644
--- a/lib/src/main/cpp/test_items/park_bottom.cpp
+++ b/lib/src/main/cpp/test_items/park_bottom.cpp
@@ -10,6 +10,7 @@
 #include "../driver_test.h"
 #include "../utils/xconvert.h"
 #include "../master/comm_if.h"
+#include "area_exam.h"
 #include <vector>
 #include <cstdlib>
 
@@ -74,6 +75,9 @@
     char crossCtrlLine = 0;
     uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
     int who = 0;
+    vector<double> dtox;
+    vector<Line> line_set;
+    Line distance_line;
 
     if (ExitParkArea(map, car)) {
         DEBUG("绂诲紑鍦哄湴");
@@ -88,6 +92,21 @@
         goto TEST_END;
     }
 
+    // 璺濈妫�娴�
+    MakeLine(&distance_line, &map->point[0], &map->point[7]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[1], &map->point[2]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[2], &map->point[3]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[3], &map->point[4]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[4], &map->point[5]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[5], &map->point[6]);
+    line_set.push_back(distance_line);
+    DistanceOfTire2X(dtox, car, line_set);
+    MA_SendDistance(dtox[0], dtox[1]);
 
     if (CrashRedLine(map, car, who)) {
         if (!occurCrashRedLine && reverseCar) {
diff --git a/lib/src/main/cpp/test_items/park_edge.cpp b/lib/src/main/cpp/test_items/park_edge.cpp
index 9387896..987dd0f 100644
--- a/lib/src/main/cpp/test_items/park_edge.cpp
+++ b/lib/src/main/cpp/test_items/park_edge.cpp
@@ -11,6 +11,7 @@
 #include "../utils/xconvert.h"
 #include "../test_common/car_sensor.h"
 #include "../master/comm_if.h"
+#include "area_exam.h"
 
 #include <vector>
 #include <cstdlib>
@@ -64,6 +65,10 @@
 
 int TestParkEdge(const Polygon *map, const car_model *car, const car_model *carPrev, double speed, int moveStatus, const struct RtkTime *rtkTime)
 {
+    vector<double> dtox;
+    vector<Line> line_set;
+    Line distance_line;
+
     if (CrashRedLine1(map, car)) {
         if (!occurCrashRedLine1 && occurMoveBack) {
             // 杞﹁疆鍘嬭竟绾匡紝姣忔鎵�10鍒�
@@ -97,6 +102,22 @@
         goto TEST_END;
     }
 
+    // 璺濈妫�娴�
+    MakeLine(&distance_line, &map->point[0], &map->point[7]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[1], &map->point[2]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[2], &map->point[3]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[3], &map->point[4]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[4], &map->point[5]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[5], &map->point[6]);
+    line_set.push_back(distance_line);
+    DistanceOfTire2X(dtox, car, line_set);
+    MA_SendDistance(dtox[0], dtox[1]);
+
     if (occurMoveBack) {
         uint32_t tp = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
 
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 3b904d6..81e1b92 100644
--- a/lib/src/main/cpp/test_items/stop_and_start.cpp
+++ b/lib/src/main/cpp/test_items/stop_and_start.cpp
@@ -13,6 +13,7 @@
 #include "../utils/xconvert.h"
 #include "../test_common/car_sensor.h"
 #include "../master/comm_if.h"
+#include "area_exam.h"
 
 #define DEBUG(fmt, args...)     LOGD("<stop_and_start> <%s>: " fmt, __func__, ##args)
 
@@ -87,10 +88,16 @@
         testing = false;
     }
 
+    // 璺濈妫�娴�
     {
-        double dis2 = DistanceOfTire2Edge(map, car);
+        vector<double> dtox;
+        vector<Line> line_set;
+        Line distance_line;
 
-        MA_SendDistance(DistanceOf(map->point[8], map->point[7]) - dis2, dis2);
+        MakeLine(&distance_line, &map->point[0], &map->point[8]);
+        line_set.push_back(distance_line);
+        DistanceOfTire2X(dtox, car, line_set);
+        MA_SendDistance(dtox[0], dtox[1]);
     }
 
     if (prevMoveDirect != moveDirect) {
diff --git a/lib/src/main/cpp/test_items/turn_a90.cpp b/lib/src/main/cpp/test_items/turn_a90.cpp
index 5f19758..b0777ea 100644
--- a/lib/src/main/cpp/test_items/turn_a90.cpp
+++ b/lib/src/main/cpp/test_items/turn_a90.cpp
@@ -11,6 +11,7 @@
 #include "../defs.h"
 #include "../test_common/car_sensor.h"
 #include "../master/comm_if.h"
+#include "area_exam.h"
 
 #include <vector>
 #include <cstdlib>
@@ -55,12 +56,27 @@
 int TestTurnA90(const Polygon *map, const car_model *car, const car_model *carPrev, double heading, double speed, int moveDirect, const struct RtkTime *rtkTime)
 {
     int az = (int) heading;
+    vector<double> dtox;
+    vector<Line> line_set;
+    Line distance_line;
 
     if (ExitTestArea(map, car)) {
         testing = false;
         goto TEST_END;
     }
 
+    // 璺濈妫�娴�
+    MakeLine(&distance_line, &map->point[0], &map->point[5]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[5], &map->point[4]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[1], &map->point[2]);
+    line_set.push_back(distance_line);
+    MakeLine(&distance_line, &map->point[2], &map->point[3]);
+    line_set.push_back(distance_line);
+    DistanceOfTire2X(dtox, car, line_set);
+    MA_SendDistance(dtox[0], dtox[1]);
+
     if (CrashRedLine(map, car)) {
         if (!crashRedLine) {
             crashRedLine = true;
diff --git a/lib/src/main/java/com/anyun/exam/lib/RemoteService.java b/lib/src/main/java/com/anyun/exam/lib/RemoteService.java
index 7b58c01..383c44a 100644
--- a/lib/src/main/java/com/anyun/exam/lib/RemoteService.java
+++ b/lib/src/main/java/com/anyun/exam/lib/RemoteService.java
@@ -1,8 +1,15 @@
 package com.anyun.exam.lib;
 
 import android.app.Service;
+import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.media.AudioManager;
+import android.media.MediaPlayer;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
+import android.net.Uri;
 import android.os.IBinder;
 import android.os.Process;
 import android.os.RemoteCallbackList;
@@ -18,6 +25,7 @@
 import androidx.annotation.Nullable;
 
 import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
@@ -84,6 +92,52 @@
         new Thread(new StartNative()).start();
 
         new Thread(new TestThread()).start();
+
+        PlayRing(this);
+    }
+
+    public void PlayRing(Context context) {
+        RingtoneManager ringtoneManager= new RingtoneManager(context); // 閾冨0绠$悊鍣�
+
+        for (int i = 0; i < ringtoneManager.getCursor().getCount(); i++) {
+            Log.i(TAG, "閾冨0鍚嶇О " + ringtoneManager.getRingtone(i).getTitle(context));
+
+            if (ringtoneManager.getRingtone(i).getTitle(this).equals("Carina")) {
+                Log.d(TAG, "鎾斁閾冨0");
+
+                final MediaPlayer mediaPlayer = new MediaPlayer();
+                Uri src = ringtoneManager.getRingtoneUri(i);
+
+                try {
+                    mediaPlayer.setDataSource(context, src);
+                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
+                    mediaPlayer.setLooping(false);
+                    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
+                        @Override
+                        public void onCompletion(MediaPlayer mp) {
+                            // 鍦ㄦ挱鏀惧畬姣曡鍥炶皟
+                            Log.d(TAG, "鎾斁瀹屾垚");
+                            mediaPlayer.stop();
+                            mediaPlayer.release();
+                        }
+                    });
+
+                    mediaPlayer.prepareAsync();
+                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
+                        @Override
+                        public void onPrepared(MediaPlayer mp) {
+                            // 瑁呰浇瀹屾瘯鍥炶皟
+                            Log.d(TAG, "瑁呰浇瀹屾瘯鍥炶皟");
+                            mediaPlayer.start();
+                        }
+                    });
+
+                } catch (Exception e) {
+
+                }
+                break;
+            }
+        }
     }
 
     class TestThread implements Runnable {

--
Gitblit v1.8.0