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