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