diff --git a/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml
index 5536384f8a..6186719077 100644
--- a/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml
+++ b/OCH/mogo-och-bus/src/main/res/layout/bus_base_fragment.xml
@@ -32,6 +32,27 @@
app:marginStart="@dimen/dp_640"
app:marginTop="@dimen/dp_80" />
+
+
+
+
+
+
+ package="com.mogo.och.noop">
- /
\ No newline at end of file
diff --git a/OCH/mogo-och-noop/src/main/java/com/mogo/och/noop/MoGoOCHNoopProvider.kt b/OCH/mogo-och-noop/src/main/java/com/mogo/och/noop/MoGoOCHNoopProvider.kt
index 9d04c6c036..1abf670a2e 100644
--- a/OCH/mogo-och-noop/src/main/java/com/mogo/och/noop/MoGoOCHNoopProvider.kt
+++ b/OCH/mogo-och-noop/src/main/java/com/mogo/och/noop/MoGoOCHNoopProvider.kt
@@ -4,6 +4,10 @@ import android.content.Context
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import com.alibaba.android.arouter.facade.annotation.Route
+import com.mogo.commons.module.status.IMogoStatusChangedListener
+import com.mogo.commons.module.status.MogoStatusManager
+import com.mogo.commons.module.status.StatusDescriptor
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
/**
* @author congtaowang
@@ -15,15 +19,70 @@ import com.alibaba.android.arouter.facade.annotation.Route
@Route(path = OCHConstants.PATH)
class MoGoOCHNoopProvider : IMogoOCH {
+ companion object {
+ private const val TAG = "MogoOCHNoopProvider"
+ }
+
override val functionName: String
- get() = "MogoOCHNoopProvider"
+ get() = TAG
+
+ private var fragment: OchNoopFragment? = null
+ private var containerId = 0
+ private var activity: FragmentActivity? = null
override fun init(context: Context) {
+ MogoStatusManager.getInstance().registerStatusChangedListener(
+ TAG, StatusDescriptor.VR_MODE, statusChangedListener
+ )
+ }
+ private val statusChangedListener =
+ IMogoStatusChangedListener { descriptor: StatusDescriptor, isTrue: Boolean ->
+ if (descriptor == StatusDescriptor.VR_MODE) {
+ // 进入vr模式默认显示网约车小巴fragment
+ if (isTrue) {
+ showFragment()
+ } else {
+ hideFragment()
+ }
+ }
+ }
+
+ private fun showFragment() {
+ activity?.let {
+ if (fragment == null) {
+ d(TAG, "准备add fragment======")
+ val fragmentByTag = it.supportFragmentManager.findFragmentByTag(TAG)
+ fragment = if (fragmentByTag is OchNoopFragment) {
+ fragmentByTag
+ } else {
+ OchNoopFragment()
+ }
+ if (!fragment!!.isAdded) {
+ it.supportFragmentManager.beginTransaction()
+ .add(containerId, fragment!!, TAG).commitAllowingStateLoss()
+ }
+ return
+ }
+ d(TAG, "准备show fragment")
+ fragment?.let { noopFragment ->
+ it.supportFragmentManager.beginTransaction().show(noopFragment)
+ .commitAllowingStateLoss()
+ }
+ }
+ }
+
+ private fun hideFragment() {
+ if (fragment != null) {
+ d(TAG, "准备hide fragment")
+ activity?.supportFragmentManager?.beginTransaction()?.hide(fragment!!)
+ ?.commitAllowingStateLoss()
+ }
}
override fun createCoverage(activity: FragmentActivity?, containerId: Int?): Fragment? {
-
+ this.containerId = containerId!!
+ this.activity = activity
return null
}
diff --git a/OCH/mogo-och-noop/src/main/java/com/mogo/och/noop/OchNoopFragment.kt b/OCH/mogo-och-noop/src/main/java/com/mogo/och/noop/OchNoopFragment.kt
index ac540cf7e9..3dcf55be4f 100644
--- a/OCH/mogo-och-noop/src/main/java/com/mogo/och/noop/OchNoopFragment.kt
+++ b/OCH/mogo-och-noop/src/main/java/com/mogo/och/noop/OchNoopFragment.kt
@@ -3,12 +3,9 @@ package com.mogo.och.noop
import android.view.View
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.data.config.FunctionBuildConfig
-import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
-import com.mogo.eagle.core.function.hmi.ui.setting.CameraLiveView.Companion.cameraLiveView
import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView
-import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView
import com.mogo.eagle.core.function.hmi.ui.widget.DemoModeView
import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView
import com.mogo.och.bus.R
@@ -33,7 +30,6 @@ class OchNoopFragment : MvpFragment(),
return OchNoopPresenter(this)
}
-
override fun initViews() {
//设置StatusBar初始状态
@@ -44,23 +40,6 @@ class OchNoopFragment : MvpFragment(),
DemoModeView(requireContext())
)
- ivCameraIcon?.setOnClickListener {
- cameraLiveView.showCameraList(
- context,
- CallerFuncBizManager.bizProvider.getCameraList
- ) { liveStatus ->
- if (liveStatus) {
- ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_selected)
- } else {
- ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_nor)
- }
- }
- }
-
- ivToolsView?.setOnClickListener {
- toolsView.showToolsFloat(context)
- }
-
viewShowDebugView.setOnLongClickListener {
ToggleDebugView.toggleDebugView.toggle(requireContext())
true
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperLimitingVelocityView.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperLimitingVelocityView.java
index a0ac193c03..b8831bae9f 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperLimitingVelocityView.java
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperLimitingVelocityView.java
@@ -22,8 +22,8 @@ public class SweeperLimitingVelocityView extends IViewLimitingVelocity {
initView(context);
}
@Override
- public void updateLimitingSpeed(int limitingSpeed) {
- super.updateLimitingSpeed(limitingSpeed);
+ public void updateLimitingSpeed(int limitingSpeed, int limitSource) {
+ super.updateLimitingSpeed(limitingSpeed, limitSource);
limitingVelocity.setText(String.valueOf(limitingSpeed));
}
private void initView(@NonNull Context context) {
diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.java
index 4be12b9e35..11aaf92603 100644
--- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.java
+++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.java
@@ -26,7 +26,11 @@ import com.mogo.och.sweeper.R;
import org.jetbrains.annotations.NotNull;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.ConstraintLayout;
import chassis.Chassis;
+import chassis.VehicleStateOuterClass;
public class SweeperTrafficDataView extends ConstraintLayout
implements IMoGoChassisLamplightListener,
@@ -147,7 +151,7 @@ public class SweeperTrafficDataView extends ConstraintLayout
@Override
public void onLimitingVelocityChange(int limitingVelocity) {
//设置限速
- sweeperLimitingVelocity.updateLimitingSpeed(limitingVelocity);
+ sweeperLimitingVelocity.updateLimitingSpeed(limitingVelocity, 0);
}
};
/**
diff --git a/OCH/mogo-och-taxi/src/main/res/layout/taxi_base_fragment.xml b/OCH/mogo-och-taxi/src/main/res/layout/taxi_base_fragment.xml
index abd64b352c..18d4ade230 100644
--- a/OCH/mogo-och-taxi/src/main/res/layout/taxi_base_fragment.xml
+++ b/OCH/mogo-och-taxi/src/main/res/layout/taxi_base_fragment.xml
@@ -90,6 +90,27 @@
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
+
+
+
+
+
+
def names = variant.flavors*.name
//要检查特定的构建类型,请使用variant.buildType.name ==“ ”
+ // region 过滤noop 的flavors 不带och业务的
+ if (names.contains("noop")&&!names.contains("fPadLenovo")) {
+ //Gradle会忽略满足上述条件的所有变体
+ setIgnore(true)
+ }
+ // endregion
// region 过滤sweper 的flavors
if (names.contains("sweeper")&&!names.contains("fPadLenovoOchSweeper")) {
//Gradle会忽略满足上述条件的所有变体
@@ -362,7 +370,6 @@ dependencies {
androidTestImplementation rootProject.ext.dependencies.androidx_runner
androidTestImplementation rootProject.ext.dependencies.androidx_espresso_core
androidTestImplementation rootProject.ext.dependencies.localbroadcastmanager
- androidTestImplementation rootProject.ext.dependencies.mogo_v2x
// if (isAndroidTestBuild()) {
// implementation "com.mogo.thread.opt:lib:${THREAD_OPT_VERSION}"
diff --git a/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt b/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt
index 2b282ce620..6f50da9ea0 100644
--- a/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt
+++ b/app/src/androidTest/java/com/mogo/functions/test/RoadAITest.kt
@@ -7,7 +7,10 @@ import androidx.test.filters.*
import com.mogo.eagle.core.function.hmi.ui.*
import com.mogo.eagle.core.function.main.*
import com.mogo.eagle.core.function.v2x.events.*
-import com.mogo.v2x.event.V2XEvent.RoadAI
+import com.mogo.eagle.core.function.v2x.internal.data.V2XRoadXData
+import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent
+import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent.RoadAI
+import com.mogo.eagle.core.utilcode.util.GsonUtils
import kotlinx.coroutines.*
import org.junit.*
import org.junit.runner.*
@@ -157,4 +160,22 @@ class RoadAITest {
}
}
+
+ @Test
+ fun testRoadAI() = runBlocking {
+ ensureMoGoHmiFragmentShow()
+ val shigu = "{\"poiType\":\"100321\",\"receiveTime\":1673506266967,\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[{\"lon\":112.57321291454436,\"lat\":26.823070465392494},{\"lon\":112.573215006931,\"lat\":26.8230675990919},{\"lon\":112.573219106955,\"lat\":26.823061914715},{\"lon\":112.573223182233,\"lat\":26.8230562153801},{\"lon\":112.573227231639,\"lat\":26.8230505007471},{\"lon\":112.573231254048,\"lat\":26.8230447704754},{\"lon\":112.573235248336,\"lat\":26.8230390242245},{\"lon\":112.573239213377,\"lat\":26.8230332616541},{\"lon\":112.573243148045,\"lat\":26.8230274824236},{\"lon\":112.573247051217,\"lat\":26.8230216861928},{\"lon\":112.573250921765,\"lat\":26.823015872621},{\"lon\":112.573254758566,\"lat\":26.823010041368},{\"lon\":112.573258560494,\"lat\":26.8230041920932},{\"lon\":112.573262326424,\"lat\":26.8229983244562},{\"lon\":112.573266055231,\"lat\":26.8229924381166},{\"lon\":112.573269779025,\"lat\":26.8229864802436},{\"lon\":112.573273466,\"lat\":26.8229805039295},{\"lon\":112.573277118207,\"lat\":26.8229745102999},{\"lon\":112.573280737695,\"lat\":26.8229685004807},{\"lon\":112.573284326516,\"lat\":26.8229624755973},{\"lon\":112.57328788672,\"lat\":26.8229564367755},{\"lon\":112.573291420358,\"lat\":26.822950385141},{\"lon\":112.573294929481,\"lat\":26.8229443218192},{\"lon\":112.573298416139,\"lat\":26.822938247936},{\"lon\":112.573301882384,\"lat\":26.822932164617},{\"lon\":112.573305330265,\"lat\":26.8229260729878},{\"lon\":112.573308761833,\"lat\":26.8229199741741},{\"lon\":112.57331217914,\"lat\":26.8229138693015},{\"lon\":112.573315584235,\"lat\":26.8229077594956},{\"lon\":112.573318940869,\"lat\":26.8229017005891},{\"lon\":112.57332227685,\"lat\":26.8228956326057},{\"lon\":112.573325593901,\"lat\":26.8228895563037},{\"lon\":112.573328893742,\"lat\":26.8228834724414},{\"lon\":112.573332178097,\"lat\":26.8228773817772},{\"lon\":112.573335448685,\"lat\":26.8228712850694},{\"lon\":112.573338707228,\"lat\":26.8228651830762},{\"lon\":112.573341955449,\"lat\":26.822859076556},{\"lon\":112.573345195068,\"lat\":26.8228529662671},{\"lon\":112.573348427807,\"lat\":26.8228468529679},{\"lon\":112.573351655387,\"lat\":26.8228407374165},{\"lon\":112.57335487953,\"lat\":26.8228346203714},{\"lon\":112.573358101958,\"lat\":26.8228285025908},{\"lon\":112.573361324391,\"lat\":26.8228223848331},{\"lon\":112.573364548551,\"lat\":26.8228162678566},{\"lon\":112.573367776161,\"lat\":26.8228101524196},{\"lon\":112.57337100894,\"lat\":26.8228040392803},{\"lon\":112.573374248612,\"lat\":26.8227979291972},{\"lon\":112.573377570805,\"lat\":26.8227916708447},{\"lon\":112.573380890942,\"lat\":26.8227854119249},{\"lon\":112.573384209049,\"lat\":26.8227791523835},{\"lon\":112.573387525157,\"lat\":26.8227728921664},{\"lon\":112.573390839291,\"lat\":26.8227666312191},{\"lon\":112.573394151482,\"lat\":26.8227603694874},{\"lon\":112.573397461756,\"lat\":26.8227541069172},{\"lon\":112.573400770143,\"lat\":26.822747843454},{\"lon\":112.573404076669,\"lat\":26.8227415790437},{\"lon\":112.573407381363,\"lat\":26.822735313632},{\"lon\":112.573410684254,\"lat\":26.8227290471645},{\"lon\":112.57341398537,\"lat\":26.8227227795872},{\"lon\":112.573417284738,\"lat\":26.8227165108456},{\"lon\":112.573420582386,\"lat\":26.8227102408855},{\"lon\":112.573423878344,\"lat\":26.8227039696526},{\"lon\":112.573427172639,\"lat\":26.8226976970928},{\"lon\":112.573430465298,\"lat\":26.8226914231516},{\"lon\":112.5736541921437,\"lat\":26.822260937315143},{\"lon\":112.57362367177457,\"lat\":26.822244991227713},{\"lon\":112.573399937477,\"lat\":26.822675492918},{\"lon\":112.573396691977,\"lat\":26.8226816946351},{\"lon\":112.573393403264,\"lat\":26.8226879586397},{\"lon\":112.573390112889,\"lat\":26.8226942213535},{\"lon\":112.573386820836,\"lat\":26.8227004828209},{\"lon\":112.573383527072,\"lat\":26.822706742987},{\"lon\":112.573380231507,\"lat\":26.8227130021005},{\"lon\":112.573376934206,\"lat\":26.8227192599775},{\"lon\":112.573373635113,\"lat\":26.8227255169308},{\"lon\":112.573370334197,\"lat\":26.8227317727439},{\"lon\":112.573367031403,\"lat\":26.8227380276418},{\"lon\":112.573363726739,\"lat\":26.822744281759},{\"lon\":112.573360420141,\"lat\":26.8227505349933},{\"lon\":112.573357111541,\"lat\":26.8227567875221},{\"lon\":112.573353801054,\"lat\":26.8227630392523},{\"lon\":112.573350488563,\"lat\":26.8227692902611},{\"lon\":112.573347174021,\"lat\":26.8227755406808},{\"lon\":112.573343849991,\"lat\":26.8227818018286},{\"lon\":112.57334059532,\"lat\":26.8227879346295},{\"lon\":112.573337344447,\"lat\":26.8227940752481},{\"lon\":112.57333410391,\"lat\":26.8228002103548},{\"lon\":112.573330872,\"lat\":26.8228063391622},{\"lon\":112.573327646909,\"lat\":26.8228124609577},{\"lon\":112.573324426983,\"lat\":26.8228185749099},{\"lon\":112.573321210588,\"lat\":26.8228246801823},{\"lon\":112.573317995803,\"lat\":26.8228307762173},{\"lon\":112.573314781099,\"lat\":26.8228368621259},{\"lon\":112.573311564666,\"lat\":26.8228429372788},{\"lon\":112.573308344862,\"lat\":26.822849000878},{\"lon\":112.573305119998,\"lat\":26.8228550522037},{\"lon\":112.573301888377,\"lat\":26.8228610905445},{\"lon\":112.573298648327,\"lat\":26.8228671151949},{\"lon\":112.573295398165,\"lat\":26.8228731254473},{\"lon\":112.573292136233,\"lat\":26.822879120603},{\"lon\":112.573288860863,\"lat\":26.8228850999821},{\"lon\":112.573285560822,\"lat\":26.8228910767817},{\"lon\":112.573282199005,\"lat\":26.822897124157},{\"lon\":112.573278821808,\"lat\":26.8229031714324},{\"lon\":112.573275437073,\"lat\":26.8229092033326},{\"lon\":112.573272042813,\"lat\":26.8229152188038},{\"lon\":112.573268637042,\"lat\":26.8229212167948},{\"lon\":112.573265217788,\"lat\":26.8229271962611},{\"lon\":112.573261783086,\"lat\":26.8229331561851},{\"lon\":112.573258330982,\"lat\":26.8229390955283},{\"lon\":112.573254859519,\"lat\":26.8229450132931},{\"lon\":112.573251366753,\"lat\":26.8229509084733},{\"lon\":112.573247850743,\"lat\":26.8229567800818},{\"lon\":112.57324430955,\"lat\":26.8229626271411},{\"lon\":112.573240741245,\"lat\":26.8229684486883},{\"lon\":112.573237142704,\"lat\":26.8229742453022},{\"lon\":112.573233541124,\"lat\":26.8229799700034},{\"lon\":112.573229900299,\"lat\":26.8229856807403},{\"lon\":112.573226220729,\"lat\":26.8229913784753},{\"lon\":112.573222503466,\"lat\":26.8229970634612},{\"lon\":112.573218749581,\"lat\":26.8230027359391},{\"lon\":112.573214960128,\"lat\":26.8230083961865},{\"lon\":112.573211136192,\"lat\":26.8230140444302},{\"lon\":112.573207278832,\"lat\":26.8230196809522},{\"lon\":112.573203389132,\"lat\":26.8230253060135},{\"lon\":112.573199468169,\"lat\":26.8230309198603},{\"lon\":112.573195517033,\"lat\":26.8230365227693},{\"lon\":112.573191536797,\"lat\":26.8230421150085},{\"lon\":112.573187548559,\"lat\":26.8230476745161},{\"lon\":112.57318546455338,\"lat\":26.823050549063097}],\"polygonRoads\":[{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-1,\"bearing\":152,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-2,\"bearing\":152,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-3,\"bearing\":152,\"roadName\":\"雁鸣路\"}],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"roadId\":\"130372\",\"laneNo\":-2,\"bearing\":152,\"roadName\":\"雁鸣路\"},\"obstacles\":[{\"id\":0,\"type\":1,\"score\":95,\"polygon\":[{\"lon\":112.57321361221982,\"lat\":26.823054701276522},{\"lon\":112.57321254435868,\"lat\":26.823070134384093},{\"lon\":112.57320704440468,\"lat\":26.823066238995114},{\"lon\":112.57320772757787,\"lat\":26.823050237509577}],\"boundBox\":[{\"x\":2979.852783203125,\"y\":929.4248657226562},{\"x\":3031.54296875,\"y\":929.4248657226562},{\"x\":3031.54296875,\"y\":977.5980834960938},{\"x\":2979.852783203125,\"y\":977.5980834960938}],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599}}],\"imgUrl\":\"http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/roadwork_image/2023-01-12/f7b1df85-895a-41c1-b05d-7356955c1c91_172_18_24_62.jpg?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDCWfcNwD5PXVWLxwejccR3Tiz5zhIkx0T%26q-sign-time%3D1673506267%3B1673513467%26q-key-time%3D1673506267%3B1673513467%26q-header-list%3D%26q-url-param-list%3D%26q-signature%3Db6b2911110c9941471cfc447d7704b9caa57a0e1\",\"ip\":\"172.18.24.62\",\"score\":95,\"radius\":0,\"type\":2,\"trianglePolygon\":[[{\"lon\":112.57321291454436,\"lat\":26.823070465392494},{\"lon\":112.573215006931,\"lat\":26.8230675990919},{\"lon\":112.573219106955,\"lat\":26.823061914715},{\"lon\":112.573223182233,\"lat\":26.8230562153801},{\"lon\":112.573227231639,\"lat\":26.8230505007471},{\"lon\":112.573231254048,\"lat\":26.8230447704754},{\"lon\":112.573235248336,\"lat\":26.8230390242245},{\"lon\":112.573239213377,\"lat\":26.8230332616541},{\"lon\":112.573243148045,\"lat\":26.8230274824236},{\"lon\":112.573247051217,\"lat\":26.8230216861928},{\"lon\":112.573250921765,\"lat\":26.823015872621},{\"lon\":112.573254758566,\"lat\":26.823010041368},{\"lon\":112.573258560494,\"lat\":26.8230041920932},{\"lon\":112.573262326424,\"lat\":26.8229983244562},{\"lon\":112.573266055231,\"lat\":26.8229924381166},{\"lon\":112.573269779025,\"lat\":26.8229864802436},{\"lon\":112.573273466,\"lat\":26.8229805039295},{\"lon\":112.573277118207,\"lat\":26.8229745102999},{\"lon\":112.573280737695,\"lat\":26.8229685004807},{\"lon\":112.573284326516,\"lat\":26.8229624755973},{\"lon\":112.57328788672,\"lat\":26.8229564367755},{\"lon\":112.573291420358,\"lat\":26.822950385141},{\"lon\":112.573294929481,\"lat\":26.8229443218192},{\"lon\":112.573298416139,\"lat\":26.822938247936},{\"lon\":112.573301882384,\"lat\":26.822932164617},{\"lon\":112.573305330265,\"lat\":26.8229260729878},{\"lon\":112.573308761833,\"lat\":26.8229199741741},{\"lon\":112.57331217914,\"lat\":26.8229138693015},{\"lon\":112.573315584235,\"lat\":26.8229077594956},{\"lon\":112.573318940869,\"lat\":26.8229017005891},{\"lon\":112.57332227685,\"lat\":26.8228956326057},{\"lon\":112.573325593901,\"lat\":26.8228895563037},{\"lon\":112.573328893742,\"lat\":26.8228834724414},{\"lon\":112.573332178097,\"lat\":26.8228773817772},{\"lon\":112.573335448685,\"lat\":26.8228712850694},{\"lon\":112.573338707228,\"lat\":26.8228651830762},{\"lon\":112.573341955449,\"lat\":26.822859076556},{\"lon\":112.573345195068,\"lat\":26.8228529662671},{\"lon\":112.573348427807,\"lat\":26.8228468529679},{\"lon\":112.573351655387,\"lat\":26.8228407374165},{\"lon\":112.57335487953,\"lat\":26.8228346203714},{\"lon\":112.573358101958,\"lat\":26.8228285025908},{\"lon\":112.573361324391,\"lat\":26.8228223848331},{\"lon\":112.573364548551,\"lat\":26.8228162678566},{\"lon\":112.573367776161,\"lat\":26.8228101524196},{\"lon\":112.57337100894,\"lat\":26.8228040392803},{\"lon\":112.573374248612,\"lat\":26.8227979291972},{\"lon\":112.573377570805,\"lat\":26.8227916708447},{\"lon\":112.573380890942,\"lat\":26.8227854119249},{\"lon\":112.573384209049,\"lat\":26.8227791523835},{\"lon\":112.573387525157,\"lat\":26.8227728921664},{\"lon\":112.573390839291,\"lat\":26.8227666312191},{\"lon\":112.573394151482,\"lat\":26.8227603694874},{\"lon\":112.573397461756,\"lat\":26.8227541069172},{\"lon\":112.573400770143,\"lat\":26.822747843454},{\"lon\":112.573404076669,\"lat\":26.8227415790437},{\"lon\":112.573407381363,\"lat\":26.822735313632},{\"lon\":112.573410684254,\"lat\":26.8227290471645},{\"lon\":112.57341398537,\"lat\":26.8227227795872},{\"lon\":112.573417284738,\"lat\":26.8227165108456},{\"lon\":112.573420582386,\"lat\":26.8227102408855},{\"lon\":112.573423878344,\"lat\":26.8227039696526},{\"lon\":112.573427172639,\"lat\":26.8226976970928},{\"lon\":112.573430465298,\"lat\":26.8226914231516},{\"lon\":112.5736541921437,\"lat\":26.822260937315143},{\"lon\":112.57362367177457,\"lat\":26.822244991227713},{\"lon\":112.573399937477,\"lat\":26.822675492918},{\"lon\":112.573396691977,\"lat\":26.8226816946351},{\"lon\":112.573393403264,\"lat\":26.8226879586397},{\"lon\":112.573390112889,\"lat\":26.8226942213535},{\"lon\":112.573386820836,\"lat\":26.8227004828209},{\"lon\":112.573383527072,\"lat\":26.822706742987},{\"lon\":112.573380231507,\"lat\":26.8227130021005},{\"lon\":112.573376934206,\"lat\":26.8227192599775},{\"lon\":112.573373635113,\"lat\":26.8227255169308},{\"lon\":112.573370334197,\"lat\":26.8227317727439},{\"lon\":112.573367031403,\"lat\":26.8227380276418},{\"lon\":112.573363726739,\"lat\":26.822744281759},{\"lon\":112.573360420141,\"lat\":26.8227505349933},{\"lon\":112.573357111541,\"lat\":26.8227567875221},{\"lon\":112.573353801054,\"lat\":26.8227630392523},{\"lon\":112.573350488563,\"lat\":26.8227692902611},{\"lon\":112.573347174021,\"lat\":26.8227755406808},{\"lon\":112.573343849991,\"lat\":26.8227818018286},{\"lon\":112.57334059532,\"lat\":26.8227879346295},{\"lon\":112.573337344447,\"lat\":26.8227940752481},{\"lon\":112.57333410391,\"lat\":26.8228002103548},{\"lon\":112.573330872,\"lat\":26.8228063391622},{\"lon\":112.573327646909,\"lat\":26.8228124609577},{\"lon\":112.573324426983,\"lat\":26.8228185749099},{\"lon\":112.573321210588,\"lat\":26.8228246801823},{\"lon\":112.573317995803,\"lat\":26.8228307762173},{\"lon\":112.573314781099,\"lat\":26.8228368621259},{\"lon\":112.573311564666,\"lat\":26.8228429372788},{\"lon\":112.573308344862,\"lat\":26.822849000878},{\"lon\":112.573305119998,\"lat\":26.8228550522037},{\"lon\":112.573301888377,\"lat\":26.8228610905445},{\"lon\":112.573298648327,\"lat\":26.8228671151949},{\"lon\":112.573295398165,\"lat\":26.8228731254473},{\"lon\":112.573292136233,\"lat\":26.822879120603},{\"lon\":112.573288860863,\"lat\":26.8228850999821},{\"lon\":112.573285560822,\"lat\":26.8228910767817},{\"lon\":112.573282199005,\"lat\":26.822897124157},{\"lon\":112.573278821808,\"lat\":26.8229031714324},{\"lon\":112.573275437073,\"lat\":26.8229092033326},{\"lon\":112.573272042813,\"lat\":26.8229152188038},{\"lon\":112.573268637042,\"lat\":26.8229212167948},{\"lon\":112.573265217788,\"lat\":26.8229271962611},{\"lon\":112.573261783086,\"lat\":26.8229331561851},{\"lon\":112.573258330982,\"lat\":26.8229390955283},{\"lon\":112.573254859519,\"lat\":26.8229450132931},{\"lon\":112.573251366753,\"lat\":26.8229509084733},{\"lon\":112.573247850743,\"lat\":26.8229567800818},{\"lon\":112.57324430955,\"lat\":26.8229626271411},{\"lon\":112.573240741245,\"lat\":26.8229684486883},{\"lon\":112.573237142704,\"lat\":26.8229742453022},{\"lon\":112.573233541124,\"lat\":26.8229799700034},{\"lon\":112.573229900299,\"lat\":26.8229856807403},{\"lon\":112.573226220729,\"lat\":26.8229913784753},{\"lon\":112.573222503466,\"lat\":26.8229970634612},{\"lon\":112.573218749581,\"lat\":26.8230027359391},{\"lon\":112.573214960128,\"lat\":26.8230083961865},{\"lon\":112.573211136192,\"lat\":26.8230140444302},{\"lon\":112.573207278832,\"lat\":26.8230196809522},{\"lon\":112.573203389132,\"lat\":26.8230253060135},{\"lon\":112.573199468169,\"lat\":26.8230309198603},{\"lon\":112.573195517033,\"lat\":26.8230365227693},{\"lon\":112.573191536797,\"lat\":26.8230421150085},{\"lon\":112.573187548559,\"lat\":26.8230476745161},{\"lon\":112.57318546455338,\"lat\":26.823050549063097}]],\"obstaclePoint\":[{\"lon\":112.573443,\"lat\":26.822538},{\"lon\":112.573691,\"lat\":26.822676},{\"lon\":112.573021,\"lat\":26.823149},{\"lon\":112.572974,\"lat\":26.823199}],\"createTime\":1673506267760,\"createTimeStr\":\"2023-01-12 14:51:07\"}"
+ val road1 = "{\"poiType\":\"100061\",\"receiveTime\":1673509755649,\"detectTime\":1673509755637,\"id\":\"86447e30-2dfc-4a27-8d01-41ffe9a9a7fe\",\"index\":\"636136931493457343\",\"polygon\":[{\"lon\":112.57337137520945,\"lat\":26.822950000610152},{\"lon\":112.5733703998375,\"lat\":26.82294943400411},{\"lon\":112.57336923793872,\"lat\":26.82294944578748},{\"lon\":112.57336827709125,\"lat\":26.82295003202963},{\"lon\":112.57336786590433,\"lat\":26.822950822795498},{\"lon\":112.57332583348149,\"lat\":26.823144415135413},{\"lon\":112.57332583904886,\"lat\":26.823145130116597},{\"lon\":112.57332615359141,\"lat\":26.82314578706645},{\"lon\":112.57332672775591,\"lat\":26.823146282906478},{\"lon\":112.57332747145331,\"lat\":26.823146539837108},{\"lon\":112.57332807078356,\"lat\":26.823146549872188},{\"lon\":112.57332882464814,\"lat\":26.82314631801647},{\"lon\":112.57332941903356,\"lat\":26.823145841742402},{\"lon\":112.57332970267485,\"lat\":26.82314536795171},{\"lon\":112.57339652767452,\"lat\":26.82297757920771},{\"lon\":112.57339644737766,\"lat\":26.82297673161999},{\"lon\":112.57339607387638,\"lat\":26.822976136665098},{\"lon\":112.57337137520945,\"lat\":26.822950000610152}],\"polygonRoads\":[{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-1,\"bearing\":330,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-2,\"bearing\":330,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-3,\"bearing\":330,\"roadName\":\"雁鸣路\"},{\"tileId\":556834853,\"roadId\":\"130583\",\"laneNo\":-1,\"bearing\":278}],\"center\":{\"lon\":112.57336404707121,\"lat\":26.823024407262803},\"centerRoad\":{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-2,\"bearing\":330,\"roadName\":\"雁鸣路\"},\"obstacles\":[{\"id\":0,\"type\":1,\"score\":88,\"polygon\":[{\"lon\":112.57334137965555,\"lat\":26.82313245733589},{\"lon\":112.573329020958,\"lat\":26.823145531571242},{\"lon\":112.57332663570918,\"lat\":26.823144025991855},{\"lon\":112.57333875695714,\"lat\":26.823130823353114}],\"boundBox\":[{\"x\":1439.8624267578125,\"y\":893.4229736328125},{\"x\":1474.45361328125,\"y\":893.4229736328125},{\"x\":1474.45361328125,\"y\":966.433837890625},{\"x\":1439.8624267578125,\"y\":966.433837890625}],\"center\":{\"lon\":112.57332779256919,\"lat\":26.823144756804734}},{\"id\":1,\"type\":1,\"score\":87,\"polygon\":[{\"lon\":112.57339986657128,\"lat\":26.822898951544797},{\"lon\":112.5733716620538,\"lat\":26.822952992001163},{\"lon\":112.57336786188131,\"lat\":26.822949186370185},{\"lon\":112.57339561566401,\"lat\":26.822894141465785}],\"boundBox\":[{\"x\":2085.054443359375,\"y\":503.0662841796875},{\"x\":2116.11865234375,\"y\":503.0662841796875},{\"x\":2116.11865234375,\"y\":559.9113159179688},{\"x\":2085.054443359375,\"y\":559.9113159179688}],\"center\":{\"lon\":112.5733698249888,\"lat\":26.822951164464232}},{\"id\":2,\"type\":1,\"score\":71,\"polygon\":[{\"lon\":112.57342641528835,\"lat\":26.82293191667262},{\"lon\":112.57339610867105,\"lat\":26.82297860774548},{\"lon\":112.5733928192764,\"lat\":26.822975877911627},{\"lon\":112.57342270277888,\"lat\":26.822928610829003}],\"boundBox\":[{\"x\":1873.2490234375,\"y\":507.2391357421875},{\"x\":1900.5283203125,\"y\":507.2391357421875},{\"x\":1900.5283203125,\"y\":562.299560546875},{\"x\":1873.2490234375,\"y\":562.299560546875}],\"center\":{\"lon\":112.57339452365564,\"lat\":26.822977300519444}}],\"imgUrl\":\"http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/roadwork_image/2023-01-12/86447e30-2dfc-4a27-8d01-41ffe9a9a7fe_172_18_24_62.jpg?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDCWfcNwD5PXVWLxwejccR3Tiz5zhIkx0T%26q-sign-time%3D1673509757%3B1673516957%26q-key-time%3D1673509757%3B1673516957%26q-header-list%3D%26q-url-param-list%3D%26q-signature%3D557de14ddfb999d35ddef9e23b3532d9d299c62f\",\"ip\":\"172.18.24.62\",\"score\":82,\"radius\":0,\"type\":1,\"createTime\":1673509757496,\"createTimeStr\":\"2023-01-12 15:49:17\"}"
+ val road2 = "{\"poiType\":\"100061\",\"receiveTime\":1673509756306,\"detectTime\":1673509756290,\"id\":\"be6a2000-a96c-42c8-a7ef-f83388d84858\",\"index\":\"636136931493532287\",\"polygon\":[{\"lon\":112.5733515539896,\"lat\":26.823143145432386},{\"lon\":112.57335140084462,\"lat\":26.823142454672727},{\"lon\":112.57335096472467,\"lat\":26.823141869074952},{\"lon\":112.57335031202503,\"lat\":26.82314147779103},{\"lon\":112.57334954211333,\"lat\":26.82314134039038},{\"lon\":112.57334877220161,\"lat\":26.82314147779103},{\"lon\":112.573348119502,\"lat\":26.823141869074952},{\"lon\":112.57334768338202,\"lat\":26.823142454672727},{\"lon\":112.57334753023707,\"lat\":26.823143145432386},{\"lon\":112.57334768338202,\"lat\":26.82314383619207},{\"lon\":112.57334811950196,\"lat\":26.82314442178987},{\"lon\":112.5733487722016,\"lat\":26.823144813073792},{\"lon\":112.57334954211333,\"lat\":26.823144950474443},{\"lon\":112.57335031202504,\"lat\":26.823144813073792},{\"lon\":112.57335096472468,\"lat\":26.82314442178987},{\"lon\":112.57335140084464,\"lat\":26.82314383619207},{\"lon\":112.5733515539896,\"lat\":26.823143145432386}],\"polygonRoads\":[{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-4,\"bearing\":332,\"roadName\":\"雁鸣路\"}],\"center\":{\"lon\":112.57334952644263,\"lat\":26.823143141971546},\"centerRoad\":{\"tileId\":556834853,\"roadId\":\"130314\",\"laneNo\":-4,\"bearing\":332,\"roadName\":\"雁鸣路\"},\"obstacles\":[{\"id\":0,\"type\":1,\"score\":72,\"polygon\":[{\"lon\":112.57341760772391,\"lat\":26.823104379136176},{\"lon\":112.57335121413183,\"lat\":26.82314367391432},{\"lon\":112.57334751791018,\"lat\":26.823142500693834},{\"lon\":112.57341321183773,\"lat\":26.82310322131963}],\"boundBox\":[{\"x\":1551.2252197265625,\"y\":352.58837890625},{\"x\":1562.4649658203125,\"y\":352.58837890625},{\"x\":1562.4649658203125,\"y\":376.17327880859375},{\"x\":1551.2252197265625,\"y\":376.17327880859375}],\"center\":{\"lon\":112.57334952644263,\"lat\":26.823143141971546}}],\"imgUrl\":\"http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/roadwork_image/2023-01-12/be6a2000-a96c-42c8-a7ef-f83388d84858_172_18_24_42.jpg?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKIDCWfcNwD5PXVWLxwejccR3Tiz5zhIkx0T%26q-sign-time%3D1673509758%3B1673516958%26q-key-time%3D1673509758%3B1673516958%26q-header-list%3D%26q-url-param-list%3D%26q-signature%3Db2682464078ae53eae6e87f924abe17fa7c04ac8\",\"ip\":\"172.18.24.42\",\"score\":72,\"radius\":0,\"type\":1,\"createTime\":1673509758511,\"createTimeStr\":\"2023-01-12 15:49:18\"}"
+ val jingzhi1 = "{\"poiType\":\"100321\",\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"laneNo\":-2,\"bearing\":152},\"score\":95,\"radius\":0,\"type\":2}"
+ val jingzhi2 = "{\"poiType\":\"100321\",\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"laneNo\":-2,\"bearing\":152},\"score\":95,\"radius\":0,\"type\":2}"
+ val jingzhi3 = "{\"poiType\":\"100321\",\"detectTime\":1673506266924,\"id\":\"f7b1df85-895a-41c1-b05d-7356955c1c91\",\"index\":\"636136931493454271\",\"polygon\":[],\"center\":{\"lon\":112.57320982521519,\"lat\":26.82306821019599},\"centerRoad\":{\"tileId\":556834853,\"laneNo\":-2,\"bearing\":152},\"score\":95,\"radius\":0,\"type\":2}"
+ while (true) {
+ delay(1000)
+ V2XEventManager.onAck(V2XEvent.RoadEventX(data = GsonUtils.fromJson(shigu, V2XRoadXData::class.java)))
+ V2XEventManager.onAck(V2XEvent.RoadEventX(data = GsonUtils.fromJson(road1, V2XRoadXData::class.java)))
+ V2XEventManager.onAck(V2XEvent.RoadEventX(data = GsonUtils.fromJson(road2, V2XRoadXData::class.java)))
+ }
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java
index 422a345196..65a865e4a1 100644
--- a/app/src/main/java/com/mogo/launcher/MogoApplication.java
+++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java
@@ -13,6 +13,7 @@ import com.mogo.launcher.stageone.APMStartup;
import com.mogo.launcher.stageone.ARouterStartUp;
import com.mogo.launcher.stageone.ConfigStartUp;
import com.mogo.launcher.stageone.HttpDnsStartUp;
+import com.mogo.launcher.stageone.ThreadOptStartup;
import com.rousetime.android_startup.StartupListener;
import com.rousetime.android_startup.StartupManager;
import com.rousetime.android_startup.model.LoggerLevel;
@@ -63,52 +64,13 @@ public class MogoApplication extends MainMoGoApplication {
.addStartup(new APMStartup())
.addStartup(new ConfigStartUp())
.addStartup(new ARouterStartUp())
+ .addStartup(new ThreadOptStartup())
.setConfig(config)
.build(this)
.start()
.await();
}
-
- @Override
- protected void attachBaseContext(Context base) {
- super.attachBaseContext(base);
-// ThreadConfig.Builder builder = new ThreadConfig.Builder().listener(new ThreadConfig.TaskExecuteListener() {
-// @Override
-// public boolean isEnabled() {
-// return true; // 如果返回true,会有后续的回调;如果返回false, 不会有后续的回调
-// }
-//
-// @Override
-// public void onExecutorBefore(@NonNull Runnable runnable, @NonNull ThreadConfig.TaskType type) {
-// //每个任务执行前回调
-//// if (type == ThreadConfig.TaskType.HandlerThread) {
-////
-////
-//// }
-// }
-//
-// @Override
-// public void onExecutorAfter(@NonNull Runnable runnable, @NonNull ThreadConfig.TaskType type) {
-// //每个任务执行后回调
-// }
-//
-// /**
-// * @param core 线程池的核心数
-// * @param max 线程池的最大线程数
-// * @param active 线程池正在活跃的任务数
-// * @param completed 线程池已完成的任务数
-// */
-// @Override
-// public void onExecutorStateChanged(@NonNull ThreadPoolExecutor pool, int core, int max, int active, long completed) {
-// //线程池在执行过程,状态变化回调
-// //Log.d("POOL", "core:" + core + ";max:" + max + ";active:" + active + ";completed:" + completed);
-// }
-// });
-// builder.loggable(false);
-// ThreadManager.INSTANCE.init(builder);
- }
-
@Override
protected void initCrashConfig() {
CrashSystem crashSystem = CrashSystem.getInstance(this);
@@ -122,4 +84,4 @@ public class MogoApplication extends MainMoGoApplication {
super.initLogConfig();
Logger.init(BuildConfig.DEBUG ? LogLevel.DEBUG : LogLevel.OFF);
}
-}
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt b/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt
new file mode 100644
index 0000000000..09ae7d1c42
--- /dev/null
+++ b/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt
@@ -0,0 +1,32 @@
+package com.mogo.launcher.lancet
+
+import android.content.ComponentName
+import android.content.Intent
+import androidx.annotation.*
+import com.knightboost.lancet.api.Origin
+import com.knightboost.lancet.api.Scope.ALL
+import com.knightboost.lancet.api.Scope.LEAF
+import com.knightboost.lancet.api.annotations.*
+
+@Keep
+@Weaver
+@Group("crash_fix")
+class CrashFix {
+
+ /**
+ * 修正Android8.0及之后,后台启动Service引起的崩溃
+ * java.lang.IllegalStateException: Not allowed to start service Intent {
+ * act=com.zhidao.cosupload.service.UPLOAD_ACTION cmp=com.mogo.launcher.f/com.zhidao.cosupload.service.UploadService }: app is in background uid UidRecord{6443b7b u0a404 LAST bg:+1m15s362ms idle change:idle procs:1 seq(0,0,0)}
+ */
+ @Insert(mayCreateSuper = true)
+ @TargetClass("android.content.Context", scope = LEAF)
+ @TargetMethod(methodName = "startService")
+ fun fixStartServiceCrash(intent: Intent): ComponentName? {
+ return try {
+ Origin.call() as ComponentName?
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ null
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/mogo/launcher/stageone/APMStartup.kt b/app/src/main/java/com/mogo/launcher/stageone/APMStartup.kt
index 00d7da6b9e..3e812b590e 100644
--- a/app/src/main/java/com/mogo/launcher/stageone/APMStartup.kt
+++ b/app/src/main/java/com/mogo/launcher/stageone/APMStartup.kt
@@ -22,6 +22,6 @@ class APMStartup : AndroidStartup() {
}
override fun dependenciesByName(): List {
- return listOf("com.mogo.launcher.stageone.ARouterStartUp", "com.mogo.launcher.stageone.ConfigStartUp")
+ return listOf("com.mogo.launcher.stageone.ARouterStartUp", "com.mogo.launcher.stageone.ThreadOptStartup")
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/mogo/launcher/stageone/ARouterStartUp.kt b/app/src/main/java/com/mogo/launcher/stageone/ARouterStartUp.kt
index 1cab03977a..15c913da9b 100644
--- a/app/src/main/java/com/mogo/launcher/stageone/ARouterStartUp.kt
+++ b/app/src/main/java/com/mogo/launcher/stageone/ARouterStartUp.kt
@@ -31,4 +31,8 @@ class ARouterStartUp : AndroidStartup() {
}
override fun waitOnMainThread() = false
+
+ override fun dependenciesByName(): List? {
+ return listOf("com.mogo.launcher.stageone.ThreadOptStartup")
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt b/app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt
index 32ee2e910f..2350e3440c 100644
--- a/app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt
+++ b/app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt
@@ -93,18 +93,9 @@ class ConfigStartUp : AndroidStartup() {
// 配置BuglyAppID:MoGoEagleEye
CrashReportConstants.buglyAppID = "ac71228f85"
- if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) ||
- AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
- || AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) {
- //控制HMI展示元素 将不用手动调用setXXXXXViewVisibility
- HmiBuildConfig.isShowAutopilotStatusView = false
- HmiBuildConfig.isShowPerspectiveSwitchView = false
- }
-
if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) {
HdMapBuildConfig.currentCarVrIconRes = R.raw.chuzuche
- } else if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
- || AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) {
+ } else if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaobache
// HmiBuildConfig.isShowBrakeLightView = false
// HmiBuildConfig.isShowTurnLightView = false
@@ -113,23 +104,14 @@ class ConfigStartUp : AndroidStartup() {
}
if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
- if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
- || AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)) {
- //是否显示 红绿等
- HmiBuildConfig.isShowTrafficLightView = false
+ if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
//是否显示 限速UI
HmiBuildConfig.isShowLimitingVelocityView = false
- //是否显示 路侧监控
- HmiBuildConfig.isShowCameraView = false
//白天模式
FunctionBuildConfig.skinMode = 1
} else if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) {
- //是否显示 红绿等
- HmiBuildConfig.isShowTrafficLightView = false
//是否显示 限速UI
HmiBuildConfig.isShowLimitingVelocityView = false
- //是否显示 路侧监控
- HmiBuildConfig.isShowCameraView = false
}
}
@@ -171,4 +153,8 @@ class ConfigStartUp : AndroidStartup() {
MapAutoApi.init(context, mapParams)
}
+
+ override fun dependenciesByName(): List {
+ return listOf("com.mogo.launcher.stageone.ThreadOptStartup")
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt
index 7429cdc0cb..a189438325 100644
--- a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt
+++ b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt
@@ -70,7 +70,8 @@ class HttpDnsStartUp : AndroidStartup() {
override fun dependenciesByName(): List {
return listOf(
- "com.mogo.launcher.stageone.APMStartup"
+ "com.mogo.launcher.stageone.APMStartup",
+ "com.mogo.launcher.stageone.ThreadOptStartup"
)
}
@@ -377,5 +378,4 @@ class HttpDnsStartUp : AndroidStartup() {
MogoAiCloudSocketManager.getInstance(context)
.init(context, DebugConfig.getSocketAppId(), lat, lon)
}
-
}
\ No newline at end of file
diff --git a/app/src/main/java/com/mogo/launcher/stageone/ThreadOptStartup.kt b/app/src/main/java/com/mogo/launcher/stageone/ThreadOptStartup.kt
new file mode 100644
index 0000000000..d0043384b8
--- /dev/null
+++ b/app/src/main/java/com/mogo/launcher/stageone/ThreadOptStartup.kt
@@ -0,0 +1,33 @@
+package com.mogo.launcher.stageone
+
+import android.content.*
+import com.mogo.thread.ext.core.*
+import com.mogo.thread.ext.core.config.*
+import com.rousetime.android_startup.*
+import java.io.*
+import java.text.SimpleDateFormat
+import java.util.*
+import java.util.concurrent.TimeUnit.SECONDS
+
+class ThreadOptStartup: AndroidStartup() {
+
+ override fun create(context: Context): Boolean {
+ ThreadManager
+ .init(ThreadConfig.Builder()
+ .maxKeepAliveTime(5, SECONDS)
+ /*.dump(DumpConfig.Builder()
+ .dumpLogFilePath(File(context.getExternalFilesDir(null), "thread_dump_log_${ SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.ROOT).format(Date()) }.txt").absolutePath)
+ .dumpPeriod(5, SECONDS)
+ .threadRunThreshold(10, SECONDS)
+ .build())*/)
+ return true
+ }
+
+ override fun callCreateOnMainThread(): Boolean {
+ return true
+ }
+
+ override fun waitOnMainThread(): Boolean {
+ return true
+ }
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index b3c135a6a2..66ec9a72f2 100644
--- a/build.gradle
+++ b/build.gradle
@@ -31,7 +31,7 @@ buildscript {
classpath "com.mogo.cloud:hook:${HOOK_LOG_VERSION}"
classpath "com.mogo.cloud:bizconfig:${BIZCONFIG_VERSION}"
classpath 'com.volcengine:apm_insight_plugin:1.4.1'
-// classpath "com.mogo.thread.opt:plg:${THREAD_OPT_VERSION}"
+ classpath "com.mogo.thread.opt:plg:${THREAD_OPT_VERSION}"
classpath 'com.mogo.cloud:systrace:1.0.1'
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18'
classpath 'com.mogo.sticky:service:1.0.8'
diff --git a/config.gradle b/config.gradle
index 3433f36bc9..9c6fdcf353 100644
--- a/config.gradle
+++ b/config.gradle
@@ -183,8 +183,6 @@ ext {
mogo_core_utils : "com.mogo.eagle.core:utils:${MOGO_CORE_UTILS_VERSION}",
mogo_core_network : "com.mogo.eagle.core:network:${MOGO_CORE_NETWORK_VERSION}",
- //========================= V2X SDK =========================
- mogo_v2x : "com.mogo.v2x:v2x:${MOGO_V2X_SDK_VERSION}",
life_cycle_scope : "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0",
view_model_scope : "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0",
diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt
index f0ba86b92a..528509bea4 100644
--- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt
+++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/FuncBizProvider.kt
@@ -11,6 +11,7 @@ import com.mogo.eagle.function.biz.monitoring.CronTaskManager.Companion.cronTask
import com.mogo.eagle.function.biz.notice.NoticeSocketManager.Companion.noticeSocketManager
import com.mogo.eagle.function.biz.notice.network.NoticeNetWorkManager
import com.mogo.eagle.function.biz.v2x.speedlimit.SpeedLimitDataManager
+import com.mogo.eagle.function.biz.v2x.speedlimit.SpeedLimitDispatcher
import com.mogo.eagle.function.biz.v2x.trafficlight.core.MogoTrafficLightManager
import com.mogo.eagle.function.biz.v2x.trafficlight.core.TrafficLightDispatcher
import com.mogo.eagle.function.biz.v2x.vip.VipCarManager
@@ -30,6 +31,7 @@ class FuncBizProvider : IMoGoFuncBizProvider {
TrafficLightDispatcher.INSTANCE.initServer(context) //todo 红绿灯中心模块放入dataCenter
VipCarManager.INSTANCE.initServer(context)
SpeedLimitDataManager.getInstance().start()
+ SpeedLimitDispatcher.INSTANCE.initLimit(context)
// RedLightWarningManager.INSTANCE.listenTrafficLight()
}
diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/speedlimit/SpeedLimitDataManager.java b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/speedlimit/SpeedLimitDataManager.java
index 6c00429fd9..c3e3ffedb3 100644
--- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/speedlimit/SpeedLimitDataManager.java
+++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/speedlimit/SpeedLimitDataManager.java
@@ -61,15 +61,16 @@ public class SpeedLimitDataManager implements IMoGoChassisLocationGCJ02Listener
@BizConfig(biz = V2I, dependentBizNode = "", bizNode = BIZ_SLW)
private void getSpeedLimit() {
- if (!isShowObuLimitSpeedView) {
+// if (!isShowObuLimitSpeedView) {
int speedLimit = CallerMapUIServiceManager.INSTANCE.getMapUIController().getLimitSpeed(mLocation.getLongitude(), mLocation.getLatitude(), (float) mLocation.getHeading());
UiThreadHandler.post(() -> {
if (speedLimit > 0) {
- CallerHmiManager.INSTANCE.showLimitingVelocity(speedLimit);
+// CallerHmiManager.INSTANCE.showLimitingVelocity(speedLimit, 1);
CallLimitingVelocityListenerManager.INSTANCE.invokeOnLimitingVelocityChange(speedLimit);
+
}
});
- }
+// }
}
}
diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/speedlimit/SpeedLimitDispatcher.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/speedlimit/SpeedLimitDispatcher.kt
new file mode 100644
index 0000000000..c236c2ed0e
--- /dev/null
+++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/speedlimit/SpeedLimitDispatcher.kt
@@ -0,0 +1,70 @@
+package com.mogo.eagle.function.biz.v2x.speedlimit
+
+import android.content.Context
+import com.mogo.eagle.core.function.api.v2x.LimitingVelocityListener
+import com.mogo.eagle.core.function.api.v2x.ObuLimitingSpeedListener
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager
+import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
+import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager
+import com.mogo.eagle.core.function.call.v2x.CallLimitingVelocityListenerManager
+import com.mogo.eagle.core.function.call.v2x.CallObuLimitingSpeedListenerManager
+
+/**
+ * @author lixiaopeng
+ * @description 对多个限速进行调度(map,rsu ...)
+ * @since: 2023/1/12
+ */
+class SpeedLimitDispatcher : LimitingVelocityListener, ObuLimitingSpeedListener {
+ companion object {
+ const val TAG = "SpeedLimitDispatcher"
+ val INSTANCE: SpeedLimitDispatcher by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
+ SpeedLimitDispatcher()
+ }
+ }
+
+ private var mContext: Context? = null
+
+ //是否有AI获取红绿灯灯态
+ private var hasObuStatus: Boolean = false
+
+
+ fun initLimit(context: Context) {
+ mContext = context
+ //注册监听MAP的限速
+ CallLimitingVelocityListenerManager.addListener(TAG, this)
+ //注册监听OBU的限速
+ CallObuLimitingSpeedListenerManager.addListener(TAG, this)
+ }
+
+ /**
+ * 地图限速数据
+ */
+ override fun onLimitingVelocityChange(limitingVelocity: Int) {
+// CallerHmiManager.disableLimitingVelocity()
+ if (!hasObuStatus) {
+ CallerHmiManager.showLimitingVelocity(limitingVelocity, 1)
+ }
+ }
+
+ /**
+ * obu限速
+ */
+ override fun onObuLimitingSpeedChange(limitingSpeed: Int) {
+// CallerHmiManager.disableLimitingVelocity()
+ if (limitingSpeed > 0) {
+ hasObuStatus = true
+ CallerHmiManager.showLimitingVelocity(limitingSpeed, 2)
+ } else {
+ hasObuStatus = false
+ CallerHmiManager.disableLimitingVelocity()
+ }
+ }
+
+ fun destroy() {
+ //取消注册监听AI云获取红绿灯状态
+ CallerTrafficLightListenerManager.removeListener(TAG)
+ //取消注册监听工控机感知红绿灯
+ CallerAutopilotIdentifyListenerManager.removeListener(TAG)
+ }
+
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/core/TrafficLightDispatcher.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/core/TrafficLightDispatcher.kt
index 2b9099ee0f..2e65445525 100644
--- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/core/TrafficLightDispatcher.kt
+++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/core/TrafficLightDispatcher.kt
@@ -4,9 +4,11 @@ import android.content.Context
import android.os.Handler
import com.mogo.eagle.core.data.trafficlight.TrafficLightResult
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener
+import com.mogo.eagle.core.function.api.obu.IMoGoObuTrafficLightListener
import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
+import com.mogo.eagle.core.function.call.obu.CallerObuTrafficLightListenerManager
import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager
import com.mogo.eagle.function.biz.v2x.trafficlight.TrafficLightHMIManager
import perception.TrafficLightOuterClass
@@ -17,26 +19,36 @@ import perception.TrafficLightOuterClass.TrafficLight
* @description 对多个红绿灯信号来源进行统一调度(AI云、工控机)
* @since: 2022/4/28
*/
-class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener , IMoGoTrafficLightListener {
+class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLightListener,
+ IMoGoObuTrafficLightListener {
- companion object{
+ companion object {
const val TAG = "TrafficLightDispatcher"
- val INSTANCE: TrafficLightDispatcher by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED){
+ val INSTANCE: TrafficLightDispatcher by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
TrafficLightDispatcher()
}
}
private var mContext: Context? = null
+
//是否有AI获取红绿灯灯态
private var hasAiLightStatus: Boolean = false
+ //obu数据
+ private var hasObuLightStatus: Boolean = false
- fun initServer(context: Context){
+ fun initServer(context: Context) {
mContext = context
- //注册监听AI云获取红绿灯状态,注册监听AI云进入路口,注册监听红绿灯请求失败
+ //注册监听AI云获取红绿灯状态
+ CallerTrafficLightListenerManager.addListener(TAG, this)
+ //注册监听AI云进入路口
+ CallerTrafficLightListenerManager.addListener(TAG, this)
+ //注册监听红绿灯请求失败
CallerTrafficLightListenerManager.addListener(TAG, this)
//注册监听工控机感知红绿灯
CallerAutopilotIdentifyListenerManager.addListener(TAG, this)
+ //obu红绿灯数据
+ CallerObuTrafficLightListenerManager.addListener(TAG, this)
}
/**
@@ -44,46 +56,48 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener , IMoGoTrafficLigh
* @param trafficLights 感知红绿灯
*/
override fun onAutopilotPerceptionTrafficLight(trafficLights: TrafficLightOuterClass.TrafficLights?) {
- if(!hasAiLightStatus){
- trafficLights?.let { it ->
- var light :TrafficLight?= null
- if(it.hasStraight()){
- light = it.straight
- }else if(it.hasLeft()){
- light = it.left
- }else if(it.hasRight()){
- light = it.right
- }else if(it.hasUTurn()){
- light = it.uTurn
- }
- if(light == null){
- //隐藏红绿灯显示
- TrafficLightHMIManager.INSTANCE.hideTrafficLight()
- }else{
- when (light.state) {
- TrafficLightOuterClass.LightState.STATE_RED -> {
- //红灯
- CallerHmiManager.showWarningTrafficLight(1,2)
- CallerHmiManager.changeCountdownGreen(0)
- }
- TrafficLightOuterClass.LightState.STATE_YELLOW -> {
- //黄灯
- CallerHmiManager.showWarningTrafficLight(2,2)
- CallerHmiManager.changeCountdownGreen(0)
- }
- TrafficLightOuterClass.LightState.STATE_GREEN -> {
- //绿灯
- CallerHmiManager.showWarningTrafficLight(3,2)
- CallerHmiManager.changeCountdownGreen(0)
- }
- TrafficLightOuterClass.LightState.STATE_OFF -> {
- //黑灯,隐藏红绿灯显示
- TrafficLightHMIManager.INSTANCE.hideTrafficLight()
- }
- else -> {}
+ if (!hasObuLightStatus) {
+ if (!hasAiLightStatus) {
+ trafficLights?.let { it ->
+ var light: TrafficLight? = null
+ if (it.hasStraight()) {
+ light = it.straight
+ } else if (it.hasLeft()) {
+ light = it.left
+ } else if (it.hasRight()) {
+ light = it.right
+ } else if (it.hasUTurn()) {
+ light = it.uTurn
+ }
+ if (light == null) {
+ //隐藏红绿灯显示
+ TrafficLightHMIManager.INSTANCE.hideTrafficLight()
+ } else {
+ when (light.state) {
+ TrafficLightOuterClass.LightState.STATE_RED -> {
+ //红灯
+ CallerHmiManager.showWarningTrafficLight(1, 2)
+ CallerHmiManager.changeCountdownGreen(0)
+ }
+ TrafficLightOuterClass.LightState.STATE_YELLOW -> {
+ //黄灯
+ CallerHmiManager.showWarningTrafficLight(2, 2)
+ CallerHmiManager.changeCountdownGreen(0)
+ }
+ TrafficLightOuterClass.LightState.STATE_GREEN -> {
+ //绿灯
+ CallerHmiManager.showWarningTrafficLight(3, 2)
+ CallerHmiManager.changeCountdownGreen(0)
+ }
+ TrafficLightOuterClass.LightState.STATE_OFF -> {
+ //黑灯,隐藏红绿灯显示
+ TrafficLightHMIManager.INSTANCE.hideTrafficLight()
+ }
+ else -> {}
+ }
}
- }
+ }
}
}
}
@@ -92,21 +106,28 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener , IMoGoTrafficLigh
* AI云获取红绿灯状态
*/
override fun onTrafficLightStatus(trafficLightResult: TrafficLightResult) {
- TrafficLightHMIManager.INSTANCE.updateTrafficLight(trafficLightResult)
- hasAiLightStatus = true
+ if (!hasObuLightStatus) {
+ TrafficLightHMIManager.INSTANCE.updateTrafficLight(trafficLightResult)
+ hasAiLightStatus = true
+ }
}
/**
- * 车辆进入路口
+ * 车辆进入路口回调
+ * @param enter true:进入路口;false:离开路口
*/
override fun onEnterCrossRoad(enter: Boolean) {
- if(!enter){
+ if (!enter) {
Handler().postDelayed({
hasAiLightStatus = false
+ hasObuLightStatus = false
}, 5000)
+ CallerTrafficLightListenerManager.resetTrafficLightData()
+ //如果没有OBU灯态则进行隐藏,如果有OBU灯态,则交由OBU管理
+ if(!hasObuLightStatus){
+ TrafficLightHMIManager.INSTANCE.hideTrafficLight()
+ }
}
-
-
}
/**
@@ -114,14 +135,32 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener , IMoGoTrafficLigh
*/
override fun onTrafficRequestError() {
hasAiLightStatus = false
+ CallerTrafficLightListenerManager.resetTrafficLightData()
+ if(!hasObuLightStatus){
+ if (TrafficLightHMIManager.INSTANCE.isWarningTrafficLightShow()) {
+ TrafficLightHMIManager.INSTANCE.hideTrafficLight()
+ }
+ }
}
+ /**
+ * obu 红绿灯数据
+ */
+ override fun onObuTrafficLight(light: Int) {
+ super.onObuTrafficLight(light)
+ hasObuLightStatus = true
+ CallerHmiManager.showWarningTrafficLight(light, 3)
+ }
- fun destroy(){
- //取消注册监听AI云获取红绿灯状态,取消注册监听红绿灯请求失败,取消注册监听AI云进入路口
+ fun destroy() {
+ //取消注册监听AI云获取红绿灯状态
CallerTrafficLightListenerManager.removeListener(TAG)
//取消注册监听工控机感知红绿灯
CallerAutopilotIdentifyListenerManager.removeListener(TAG)
+ //取消注册监听红绿灯请求失败
+ CallerTrafficLightListenerManager.removeListener(TAG)
+ //取消注册监听AI云进入路口
+ CallerTrafficLightListenerManager.removeListener(TAG)
}
}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt
index f311626dca..73a16dfd68 100644
--- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt
+++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt
@@ -52,6 +52,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListener
import com.mogo.eagle.core.function.call.autopilot.CallerPlanningTrajectoryListenerManager.invokeAutopilotTrajectory
import com.mogo.eagle.core.function.call.autopilot.CallerStartAutopilotFailedListenerManager.invokeStartAutopilotFailed
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
+import com.mogo.eagle.core.function.call.obucombine.CallerObuDcCombineListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.zhidao.support.adas.high.AdasManager
@@ -533,8 +534,9 @@ class MoGoAdasListenerImpl : OnAdasListener {
* @param obuWarningData 数据
*/
override fun onObuWarningData(header: MessagePad.Header?, obuWarningData: ObuWarningEvent.ObuWarningData?) {
-
+ CallerObuDcCombineListenerManager.invokeObuDcData(obuWarningData)
}
+
/**
* 重构后的功能状态
*
diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt
index c394ba105c..4e0cb392df 100644
--- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt
+++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt
@@ -3,7 +3,6 @@ package com.mogo.eagle.core.function.msgbox
import android.content.Context
import android.os.Looper
import com.mogo.eagle.core.data.msgbox.*
-import com.mogo.eagle.core.data.notice.NoticeNormalData
import com.mogo.eagle.core.data.report.ReportEntity
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
import com.mogo.eagle.core.function.msgbox.db.MsgBoxDb
diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt
index 6888a1fde6..62501383b7 100644
--- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt
+++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt
@@ -11,10 +11,19 @@ import androidx.lifecycle.LifecycleCoroutineScope
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
+import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
+import com.mogo.eagle.core.data.msgbox.MsgBoxType
+import com.mogo.eagle.core.data.msgbox.RecordBagMsg
+import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager
+import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner
+import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA
+import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
import com.mogo.eagle.core.utilcode.util.*
import com.zhjt.mogo_core_function_devatools.badcase.biz.*
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
@@ -27,7 +36,7 @@ import record_cache.RecordPanelOuterClass
import java.lang.ref.WeakReference
import java.util.concurrent.TimeUnit
-internal object BadCaseManager : LifecycleEventObserver {
+internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener {
const val TAG = "BadCase"
@@ -96,6 +105,8 @@ internal object BadCaseManager : LifecycleEventObserver {
* 主动采集BadCase
*/
fun initBadCase(view: View) {
+ CallerAutopilotRecordListenerManager.addListener(TAG, this)
+
val activity = view.context as? FragmentActivity
?: throw IllegalStateException("please ensure context is FragmentActivity.")
view.setOnClickListener {
@@ -193,24 +204,62 @@ internal object BadCaseManager : LifecycleEventObserver {
}
}
+ override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) {
+ super.onAutopilotRecordResult(recordPanel)
+ CallerLogger.d("$M_DEVA$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat}")
+ if (BadCaseConfig.recordKeyList.contains(recordPanel.key)) {
+ if (recordPanel.stat == 100 || recordPanel.stat == 101) {
+ //成功结束录制
+ TipToast.shortTip(
+ "${
+ TimeUtils.millis2String(
+ System.currentTimeMillis(),
+ TimeUtils.getHourMinSecondFormat()
+ )
+ } bag录制成功"
+ )
+ }
+ if (recordPanel.stat == 200) {
+ //录制失败
+ TipToast.shortTip(
+ "${
+ TimeUtils.millis2String(
+ System.currentTimeMillis(),
+ TimeUtils.getHourMinSecondFormat()
+ )
+ } bag录制失败"
+ )
+ }
+ return
+ }
+ //在工控机taxi2.3.0版本和Bus2.4.0版本上不支持被动录包,不进行被动录包的弹窗
+ BadCaseConfig.dockerVersion?.let {
+ if (it.contains("taxi") && it.contains("2.3.0")) {
+ return
+ }
+ if (it.contains("bus") && it.contains("2.4.0")) {
+ return
+ }
+ }
+ //处于非美化模式下弹窗;是地图数据采集任务时即type=2时,不弹窗
+ if (!FunctionBuildConfig.isDemoMode && (recordPanel.stat == 100 || recordPanel.stat == 101) && recordPanel.type != 2) {
+ //只在司机屏生效,乘客屏不生效
+ if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
+ CallerMsgBoxManager.saveMsgBox(
+ MsgBoxBean(
+ MsgBoxType.RECORD, RecordBagMsg(
+ recordPanel.key, recordPanel.stat, recordPanel.id,
+ recordPanel.type, recordPanel.filename, recordPanel.note
+ )
+ )
+ )
+ }
+ }
+ }
+
override fun onStateChanged(source: LifecycleOwner, event: Event) {
}
}
-
-
-internal fun RecordPanelOuterClass.RecordPanel.toRecord(): AutoPilotRecord =
- AutoPilotRecord().also {
- it.id = this.id
- it.stat = this.stat
- it.key = this.key.toString()
- it.note = this.note
- it.type = this.type
- it.total = this.totalSize
- it.fileName = this.filename
- it.duration = this.duration.toDouble()
- it.diskFree = this.diskFree
- it.consumed = false
- }
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt
index 4ab9e49463..ed8dc2da88 100644
--- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt
+++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt
@@ -373,6 +373,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) {
CallerLogger.d("${M_DEVA}${TAG}", "-- 收到工控机录制任务回调 -- $recordPanel")
+
ThreadUtils.runOnUiThread {
if (recordKey == null) {
recordKey = recordPanel.key.toString()
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XLimitingVelocityBroadcastReceiver.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XLimitingVelocityBroadcastReceiver.kt
index e8d3961a3e..1395d3578f 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XLimitingVelocityBroadcastReceiver.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XLimitingVelocityBroadcastReceiver.kt
@@ -57,7 +57,7 @@ class V2XLimitingVelocityBroadcastReceiver : BroadcastReceiver() {
* @param limitingVelocitySpeed 限速速度
*/
private fun dispatchShowWaring(limitingVelocitySpeed: Int) {
- CallerHmiManager.showLimitingVelocity(limitingVelocitySpeed)
+ CallerHmiManager.showLimitingVelocity(limitingVelocitySpeed, 1)
}
/**
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt
index 6207e5eb1b..3a60406e12 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/receiver/V2XWarningBroadcastReceiver.kt
@@ -76,7 +76,7 @@ class V2XWarningBroadcastReceiver : BroadcastReceiver() {
tag: String?
) {
if (EventTypeEnum.TYPE_USECASE_ID_IVP.poiType == v2xType.toString()) {
- CallerHmiManager.showLimitingVelocity(1)
+ CallerHmiManager.showLimitingVelocity(1, 1)
}
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
Log.d("MsgBox-V2XWarningBR", "alertContent或ttsContent为空!")
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt
index d73c20c9c1..a0ac521b3a 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt
@@ -3,12 +3,12 @@ package com.mogo.eagle.core.function.hmi.ui
import android.content.Context
import android.os.Bundle
import android.text.TextUtils
+import android.util.*
import android.view.View
import android.view.ViewGroup
import android.view.animation.AlphaAnimation
import android.view.animation.Animation
import android.view.animation.LinearInterpolator
-import android.widget.FrameLayout
import androidx.lifecycle.lifecycleScope
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter
@@ -40,6 +40,7 @@ import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.PerspectiveSwitchView_TAG
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.SpeedPanelView_TAG
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.ToolsView_TAG
+import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.TrafficLightView_TAG
import com.mogo.eagle.core.function.api.hmi.view.IViewLimitingVelocity
import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoHmiProvider
@@ -86,12 +87,9 @@ import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.service_biz.BizConfig
import kotlinx.android.synthetic.main.fragment_hmi.*
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.suspendCancellableCoroutine
+import kotlinx.coroutines.*
import record_cache.RecordPanelOuterClass
-
+import java.util.concurrent.atomic.AtomicReference
/**
* @author xiaoyuzhou
@@ -102,8 +100,7 @@ import record_cache.RecordPanelOuterClass
class MoGoHmiFragment : MvpFragment(),
IMoGoHmiProvider,
IMoGoHmiViewProxy,
- MoGoHmiContract.View,
- IMoGoAutopilotRecordListener {
+ MoGoHmiContract.View{
companion object {
private const val TAG = "MoGoHmiFragment"
@@ -116,36 +113,16 @@ class MoGoHmiFragment : MvpFragment(),
// todo 需要统一数据源 限速 View代理
private var mViewLimitingVelocity: IViewLimitingVelocity? = null
- private var lastSpeakJob: Job? = null
-
+ private val lastSpeakJob by lazy { AtomicReference() }
private var lastShowV2XJob: Job? = null
private var showingV2XTip: IReminder? = null
override fun initViews() {
- initViewShowWithConfig()
//设置StatusBar初始状态
CallerHmiViewControlListenerManager.updateStatusBarRightView(StatusBarView.TAG,FunctionBuildConfig.isDemoMode, "demoMode", DemoModeView(requireContext()))
- ivCameraIcon?.setOnClickListener {
- cameraLiveView.showCameraList(
- context,
- CallerFuncBizManager.bizProvider.getCameraList
- ) { liveStatus ->
- if (liveStatus) {
- ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_selected)
- } else {
- ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_nor)
- }
- }
- }
-
- viewShowDebugView.setOnLongClickListener {
- toggleDebugView.toggle(requireContext())
- true
- }
-
//todo 新超,封装至消息盒子
cbMsgBoxDriver.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
@@ -208,14 +185,10 @@ class MoGoHmiFragment : MvpFragment(),
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- CallerAutopilotRecordListenerManager.addListener(TAG, this)
-
- // 首次初始化使用默认视图
- setProxyTrafficLightView(viewTrafficLightVr)
+ //todo 确认使用方 taxi bus 乘客/司机
setProxyLimitingSpeedView(viewLimitingVelocity)
}
-
/** todo ----------------------------------------------**/
/**
* 设置 红绿灯 代理View
@@ -231,109 +204,6 @@ class MoGoHmiFragment : MvpFragment(),
mViewLimitingVelocity = view
}
- /**
- * 根据配置文件初始化视图显示
- */
- private fun initViewShowWithConfig() {
- // 控制 自动驾驶状态 展示
- if (HmiBuildConfig.isShowAutopilotStatusView) {
- setAutopilotStatusViewVisibility(View.VISIBLE)
- } else {
- setAutopilotStatusViewVisibility(View.GONE)
- }
-
- // 控制 切换视角 展示
- if (HmiBuildConfig.isShowPerspectiveSwitchView) {
- setPerspectiveSwitchViewVisibility(View.VISIBLE)
- } else {
- setPerspectiveSwitchViewVisibility(View.GONE)
- }
-
- // 控制 红绿灯 展示
- if (HmiBuildConfig.isShowTrafficLightView) {
- setTrafficLightVrVisibility(View.VISIBLE)
- } else {
- setTrafficLightVrVisibility(View.GONE)
- }
-
- // 控制 远程摄像头图标 展示
- if (HmiBuildConfig.isShowCameraView) {
- setCameraViewVisibility(View.VISIBLE)
- } else {
- setCameraViewVisibility(View.GONE)
- }
- }
-
- /** todo----------------------------------------------- **/
-
- override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) {
- CallerLogger.d("$M_HMI$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat}")
- if (BadCaseConfig.recordKeyList.contains(recordPanel.key)) { //todo InitiativeBadCaseWindow
- if (recordPanel.stat == 100 || recordPanel.stat == 101) {
- //成功结束录制
- TipToast.shortTip(
- "${
- millis2String(
- System.currentTimeMillis(),
- TimeUtils.getHourMinSecondFormat()
- )
- } bag录制成功"
- )
- }
- if (recordPanel.stat == 200) {
- //录制失败
- TipToast.shortTip(
- "${
- millis2String(
- System.currentTimeMillis(),
- TimeUtils.getHourMinSecondFormat()
- )
- } bag录制失败"
- )
- }
- return
- }
- //在工控机taxi2.3.0版本和Bus2.4.0版本上不支持被动录包,不进行被动录包的弹窗
- BadCaseConfig.dockerVersion?.let {
- if (it.contains("taxi") && it.contains("2.3.0")) {
- return
- }
- if (it.contains("bus") && it.contains("2.4.0")) {
- return
- }
- }
- //处于非美化模式下弹窗;是地图数据采集任务时即type=2时,不弹窗
- if (!FunctionBuildConfig.isDemoMode && (recordPanel.stat == 100 || recordPanel.stat == 101) && recordPanel.type != 2) {
- //只在司机屏生效,乘客屏不生效
- if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { //todo 数据中心控制来源
- CallerMsgBoxManager.saveMsgBox(
- MsgBoxBean(
- MsgBoxType.RECORD, RecordBagMsg(
- recordPanel.key, recordPanel.stat, recordPanel.id,
- recordPanel.type, recordPanel.filename, recordPanel.note
- )
- )
- )
- }
- }
- if (!FunctionBuildConfig.isDemoMode && recordPanel.type == 2 && ( //todo CallerMapDataCollectorManager
- recordPanel.stat == 101 || //工控机采集完成-被动完成
- recordPanel.stat == 100 || //工控机采集完成-主动完成
- recordPanel.stat == 102 || //工控机达到最大采集时长
- recordPanel.stat == 103) //工控机磁盘满了
- ) {
- CallerMapDataCollectorManager.finish(
- recordPanel.id, recordPanel.stat, "", recordPanel.filename
- ?: "", recordPanel.note ?: ""
- )
- }
- }
-
- override fun onDestroyView() {
- super.onDestroyView()
- CallerAutopilotRecordListenerManager.removeListener(TAG)
- }
-
/**
* ok
* 工控机重启返回结果
@@ -414,9 +284,8 @@ class MoGoHmiFragment : MvpFragment(),
DisplayEffectsHelper.getInstance().display()
}
- /** todo----------------------------------------------- **/
override fun setTrafficLightVrVisibility(visibility: Int) {
- mViewTrafficLight?.visibility = visibility
+ CallerHmiViewControlListenerManager.invokeVisible(TrafficLightView_TAG,visibility)
}
override fun setToolsViewVisibility(visibility: Int) {
@@ -482,10 +351,7 @@ class MoGoHmiFragment : MvpFragment(),
"$M_HMI$TAG",
"--- show v2x dialog 1 ---: info -> v2x-type: $v2xType : expireTime: $expireTime"
)
-
lastShowV2XJob?.safeCancel()
- lastSpeakJob?.safeCancel()
-
lifecycleScope.launch {
delay(expireTime)
}.also { itx ->
@@ -496,10 +362,18 @@ class MoGoHmiFragment : MvpFragment(),
}
if (ttsContent != null && !TextUtils.isEmpty(ttsContent) && playTTS) {
- lifecycleScope.launch {
+ val last = lastSpeakJob.get()
+ Log.d("CODE", "---- 0 ------: last: $last")
+ if (last != null && !last.isCompleted) {
+ Log.d("CODE", "---- 1 ------")
+ return
+ }
+ lifecycleScope.launch(Dispatchers.Default) {
+ Log.d("CODE", "---- 2 ------")
speak(it, ttsContent)
+ Log.d("CODE", "---- 3 ------")
}.also { itx ->
- lastSpeakJob = itx
+ lastSpeakJob.set(itx)
}
}
}
@@ -594,18 +468,26 @@ class MoGoHmiFragment : MvpFragment(),
/**
* 控制展示限速标志及内容
*/
- override fun showLimitingVelocity(limitingSpeed: Int) {
+ override fun showLimitingVelocity(limitingSpeed: Int, limitSpeedSource: Int) {
// 控制 限速UI 展示
if (HmiBuildConfig.isShowLimitingVelocityView) {
if (limitingSpeed > 0) {
mViewLimitingVelocity?.visibility = View.VISIBLE
- mViewLimitingVelocity?.updateLimitingSpeed(limitingSpeed)
+ mViewLimitingVelocity?.updateLimitingSpeed(limitingSpeed, limitSpeedSource)
+ tvLimitingSource?.visibility = View.VISIBLE
+ if (limitSpeedSource == 1) {
+ tvLimitingSource.text = "MAP"
+ } else if (limitSpeedSource == 2) {
+ tvLimitingSource.text = "RSU"
+ }
} else {
mViewLimitingVelocity?.visibility = View.INVISIBLE
- mViewLimitingVelocity?.updateLimitingSpeed(0)
+ mViewLimitingVelocity?.updateLimitingSpeed(0, limitSpeedSource)
+ tvLimitingSource?.visibility = View.INVISIBLE
}
} else {
disableLimitingVelocity()
+ tvLimitingSource?.visibility = View.GONE
}
}
@@ -614,7 +496,7 @@ class MoGoHmiFragment : MvpFragment(),
*/
override fun disableLimitingVelocity() {
mViewLimitingVelocity?.visibility = View.GONE
- mViewLimitingVelocity?.updateLimitingSpeed(0)
+ mViewLimitingVelocity?.updateLimitingSpeed(0, 1)
}
/**
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt
index 2c1610c20b..cb59e84424 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt
@@ -82,7 +82,9 @@ import mogo_msg.MogoReportMsg
import java.text.SimpleDateFormat
import java.util.*
import kotlin.math.abs
-
+import androidx.lifecycle.lifecycleScope
+import kotlinx.coroutines.launch
+import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner
/**
* @author xiaoyuzhou
@@ -215,7 +217,7 @@ internal class DebugSettingView @JvmOverloads constructor(
logInfoView!!.onEnterForeground()
}
// 开启定时查询速度
- Timer().schedule(timerTaskRefresh, Date(), 100)
+ Timer().schedule(timerTaskRefresh, Date(), 300)
if (AppConfigInfo.isConnectAutopilot && (AppConfigInfo.plateNumber.isNullOrEmpty() || AppConfigInfo.iPCMacAddress.isNullOrEmpty())) {
//查询工控机基础配置信息
CallerAutoPilotManager.getCarConfig()
@@ -1686,10 +1688,10 @@ internal class DebugSettingView @JvmOverloads constructor(
}"
)
-
- tvAutopilotInfo.text = GsonUtils.toJson(mAutoPilotStatusInfo)
- tvIpcInfo.text = GsonUtils.toJson(mAutoPilotStatusInfo)
- tvIpcInfoKey.text = GsonUtils.toJson(mAutoPilotStatusInfo)
+ val autopilotJson = GsonUtils.toJson(mAutoPilotStatusInfo)
+ tvAutopilotInfo.text = autopilotJson
+ tvIpcInfo.text = autopilotJson
+ tvIpcInfoKey.text = autopilotJson
tvCarInfo.text =
"GPS时间:${(mGnssInfo?.satelliteTime?.times(1000))?.toLong()}\n" +
@@ -1734,18 +1736,20 @@ internal class DebugSettingView @JvmOverloads constructor(
* OBU状态回调
*/
override fun onObuStatusResponse(obuStatusInfo: ObuStatusInfo) {
- tvObuInfo.text = GsonUtils.toJson(obuStatusInfo)
+ lifecycleOwner.lifecycleScope.launch {
+ tvObuInfo.text = GsonUtils.toJson(obuStatusInfo)
- AppConfigInfo.obuSdkVersion = obuStatusInfo.obuSdkVersion
- AppConfigInfo.isConnectObu = obuStatusInfo.obuStatus
+ AppConfigInfo.obuSdkVersion = obuStatusInfo.obuSdkVersion
+ AppConfigInfo.isConnectObu = obuStatusInfo.obuStatus
- if (obuStatusInfo.obuStatus) {
- obuConnectStatus = true
- }
- //OBU断开连接,提示异常
- if (obuConnectStatus && !obuStatusInfo.obuStatus) {
- obuConnectStatus = false
- toastMsg("OBU连接状态异常")
+ if (obuStatusInfo.obuStatus) {
+ obuConnectStatus = true
+ }
+ //OBU断开连接,提示异常
+ if (obuConnectStatus && !obuStatusInfo.obuStatus) {
+ obuConnectStatus = false
+ toastMsg("OBU连接状态异常")
+ }
}
}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt
index 0227d92b75..e6afb2b7b2 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt
@@ -78,6 +78,7 @@ internal class SOPSettingView @JvmOverloads constructor(
/**
* obu弱势交通控制
*/
+ tbObuWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowObuWeaknessTrafficView
tbObuWeaknessTrafficSop.setOnCheckedChangeListener { _, isChecked ->
if (!isChecked) { //默认开启
CallerHmiManager.setObuWeaknessTraffic(true)
@@ -89,6 +90,7 @@ internal class SOPSettingView @JvmOverloads constructor(
/**
* 云端弱势交通控制
*/
+ tbCloudWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowCloudWeaknessTrafficView
tbCloudWeaknessTrafficSop.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) { //默认关闭
CallerHmiManager.setCloudWeaknessTraffic(true)
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/ToolsImageView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/ToolsImageView.kt
index 6d89368329..84400ca732 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/ToolsImageView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/ToolsImageView.kt
@@ -6,6 +6,7 @@ import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.ToolsView_TAG
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.hmi.R
+import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView
class ToolsImageView(context: Context, attrs: AttributeSet?) :
androidx.appcompat.widget.AppCompatImageView(context, attrs), IViewControlListener {
@@ -15,6 +16,9 @@ class ToolsImageView(context: Context, attrs: AttributeSet?) :
setBackgroundResource(R.drawable.module_ext_check)
setImageResource(R.drawable.icon_tools_nor)
scaleType = ScaleType.CENTER
+ setOnClickListener{
+ toolsView.showToolsFloat(context)
+ }
CallerHmiViewControlListenerManager.addListener(ToolsView_TAG, this)
}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CameraView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CameraView.kt
index 8e90c54e8c..70e5ae0f35 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CameraView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/CameraView.kt
@@ -4,8 +4,10 @@ import android.content.Context
import android.util.AttributeSet
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.CameraView_TAG
+import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.hmi.R
+import com.mogo.eagle.core.function.hmi.ui.setting.CameraLiveView.Companion.cameraLiveView
class CameraView(context: Context, attrs: AttributeSet?) :
androidx.appcompat.widget.AppCompatImageView(context, attrs), IViewControlListener {
@@ -13,6 +15,19 @@ class CameraView(context: Context, attrs: AttributeSet?) :
override fun onAttachedToWindow() {
super.onAttachedToWindow()
setBackgroundResource(R.drawable.icon_camera_nor)
+ setOnClickListener {
+ cameraLiveView.showCameraList(
+ context,
+ CallerFuncBizManager.bizProvider.getCameraList
+ ) { liveStatus ->
+ if (liveStatus) {
+ setBackgroundResource(R.drawable.icon_camera_selected)
+ } else {
+ setBackgroundResource(R.drawable.icon_camera_nor)
+ }
+ }
+ }
+
CallerHmiViewControlListenerManager.addListener(CameraView_TAG, this)
}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/LimitingVelocityView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/LimitingVelocityView.kt
index b1c509d6f2..c766f7a029 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/LimitingVelocityView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/LimitingVelocityView.kt
@@ -20,8 +20,8 @@ class LimitingVelocityView @JvmOverloads constructor(
LayoutInflater.from(context).inflate(R.layout.view_limiting_speed_vr, this, true)
}
- override fun updateLimitingSpeed(limitingSpeed: Int) {
- super.updateLimitingSpeed(limitingSpeed)
+ override fun updateLimitingSpeed(limitingSpeed: Int, limitSource: Int) {
+ super.updateLimitingSpeed(limitingSpeed, limitSource)
tvLimitingVelocity.text = "$limitingSpeed"
}
}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SingleTrafficLightView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SingleTrafficLightView.kt
index 12842094df..36af0aad3d 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SingleTrafficLightView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SingleTrafficLightView.kt
@@ -8,7 +8,10 @@ import android.widget.ImageView
import android.widget.TextView
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
+import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
+import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.TrafficLightView_TAG
import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight
+import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
@@ -20,7 +23,7 @@ class SingleTrafficLightView @JvmOverloads constructor(
context: Context?,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
-) : IViewTrafficLight(context, attrs, defStyleAttr) {
+) : IViewTrafficLight(context, attrs, defStyleAttr), IViewControlListener {
private var mLightIconIV: ImageView? = null
private var mLightIconBG: ImageView? = null
private var mLightTimeTV: GradientTextView? = null
@@ -28,17 +31,26 @@ class SingleTrafficLightView @JvmOverloads constructor(
private var mLightSourceDivider: View? = null
private var mCurrentLightId = 0
- init {
- init(context)
- }
-
- private fun init(context: Context?) {
+ override fun onAttachedToWindow() {
+ super.onAttachedToWindow()
LayoutInflater.from(context).inflate(R.layout.hmi_view_traffic_light, this, true)
mLightIconIV = findViewById(R.id.hmi_traffic_light_iv)
mLightIconBG = findViewById(R.id.hmi_traffic_light_bg)
mLightTimeTV = findViewById(R.id.hmi_traffic_light_time_tv)
mLightSourceTV = findViewById(R.id.hmi_traffic_light_source)
mLightSourceDivider = findViewById(R.id.hmi_traffic_light_divider)
+
+ CallerHmiViewControlListenerManager.addListener(TrafficLightView_TAG, this)
+ }
+
+ override fun visible(v: Int) {
+ super.visible(v)
+ visibility = v
+ }
+
+ override fun onDetachedFromWindow() {
+ super.onDetachedFromWindow()
+ CallerHmiViewControlListenerManager.removeListener(TrafficLightView_TAG)
}
/**
@@ -47,11 +59,11 @@ class SingleTrafficLightView @JvmOverloads constructor(
* @param checkLightId 0-都是默认,1-红,2-黄,3-绿
* @param lightSource 1:云端下发;2:自车感知
*/
- override fun showWarningTrafficLight(checkLightId: Int,lightSource: Int) {
- super.showWarningTrafficLight(checkLightId,lightSource)
+ override fun showWarningTrafficLight(checkLightId: Int, lightSource: Int) {
+ super.showWarningTrafficLight(checkLightId, lightSource)
mCurrentLightId = checkLightId
- if(!HmiBuildConfig.isShowTrafficLightView){
- updateTrafficLightIcon(checkLightId,lightSource)
+ if (!HmiBuildConfig.isShowTrafficLightView) {
+ updateTrafficLightIcon(checkLightId, lightSource)
}
}
@@ -70,24 +82,28 @@ class SingleTrafficLightView @JvmOverloads constructor(
super.disableCountdown()
UiThreadHandler.post {
// 小巴车的司机端需要展示红绿灯信号来源
- if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
- && AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)){
+ if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
+ && AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
+ ) {
val lp = this.layoutParams as MarginLayoutParams
lp.width = context.resources.getDimension(R.dimen.dp_325).toInt()
this.layoutParams = lp
mLightSourceTV!!.visibility = VISIBLE
mLightSourceDivider!!.visibility = VISIBLE
mLightTimeTV!!.visibility = GONE
- mLightSourceTV!!.setPadding(0,0,75,0)
- mLightIconBG!!.layoutParams.width = context.resources.getDimension(R.dimen.dp_310).toInt()
- }else{
+ mLightSourceTV!!.setPadding(0, 0, 75, 0)
+ mLightIconBG!!.layoutParams.width =
+ context.resources.getDimension(R.dimen.dp_310).toInt()
+ } else {
val lp = this.layoutParams as MarginLayoutParams
- lp.width = context.resources.getDimension(R.dimen.hmi_traffic_light_icon_size).toInt()
+ lp.width =
+ context.resources.getDimension(R.dimen.hmi_traffic_light_icon_size).toInt()
this.layoutParams = lp
mLightTimeTV!!.visibility = GONE
mLightSourceDivider!!.visibility = View.GONE
mLightSourceTV!!.visibility = View.GONE
- mLightIconBG!!.layoutParams.width = context.resources.getDimension(R.dimen.dp_124).toInt()
+ mLightIconBG!!.layoutParams.width =
+ context.resources.getDimension(R.dimen.dp_124).toInt()
}
}
}
@@ -176,7 +192,7 @@ class SingleTrafficLightView @JvmOverloads constructor(
* @param lightId 0-都是默认,1-红,2-黄,3-绿
* @param lightSource 1:云端下发;2:自车感知
*/
- private fun updateTrafficLightIcon(lightId: Int,lightSource: Int) {
+ private fun updateTrafficLightIcon(lightId: Int, lightSource: Int) {
UiThreadHandler.post {
when (lightId) {
1 -> {
@@ -193,7 +209,7 @@ class SingleTrafficLightView @JvmOverloads constructor(
}
else -> this@SingleTrafficLightView.visibility = GONE
}
- when(lightSource){
+ when (lightSource) {
1 -> {
mLightSourceTV!!.text = "云端下发"
}
@@ -207,26 +223,31 @@ class SingleTrafficLightView @JvmOverloads constructor(
}
}
- private fun resetView(){
+ private fun resetView() {
// 小巴车的司机端需要展示红绿灯信号来源
- if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
- && AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)){
+ if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
+ && AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
+ ) {
val lp = this.layoutParams as MarginLayoutParams
- lp.width = context.resources.getDimension(R.dimen.hmi_traffic_light_bus_layout_width).toInt()
+ lp.width =
+ context.resources.getDimension(R.dimen.hmi_traffic_light_bus_layout_width).toInt()
this.layoutParams = lp
mLightTimeTV!!.visibility = View.VISIBLE
mLightSourceDivider!!.visibility = View.VISIBLE
mLightSourceTV!!.visibility = View.VISIBLE
- mLightSourceTV!!.setPadding(0,0,0,0)
- mLightIconBG!!.layoutParams.width = context.resources.getDimension(R.dimen.hmi_traffic_light_bus_bg_width).toInt()
- }else{
+ mLightSourceTV!!.setPadding(0, 0, 0, 0)
+ mLightIconBG!!.layoutParams.width =
+ context.resources.getDimension(R.dimen.hmi_traffic_light_bus_bg_width).toInt()
+ } else {
val lp = this.layoutParams as MarginLayoutParams
- lp.width = context.resources.getDimension(R.dimen.hmi_traffic_light_layout_width).toInt()
+ lp.width =
+ context.resources.getDimension(R.dimen.hmi_traffic_light_layout_width).toInt()
this.layoutParams = lp
mLightTimeTV!!.visibility = View.VISIBLE
mLightSourceDivider!!.visibility = View.GONE
mLightSourceTV!!.visibility = View.GONE
- mLightIconBG!!.layoutParams.width = context.resources.getDimension(R.dimen.hmi_traffic_light_bg_width).toInt()
+ mLightIconBG!!.layoutParams.width =
+ context.resources.getDimension(R.dimen.hmi_traffic_light_bg_width).toInt()
}
}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedChartView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedChartView.java
index f6d69a53ee..47a53c4ce8 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedChartView.java
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedChartView.java
@@ -178,7 +178,7 @@ public class SpeedChartView extends View {
setAnimation(lastAngle, currentAngle, 1000);
lastAngle = currentAngle;
//重新绘制
- postInvalidate();
+ invalidate();
}
}
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt
index 3d5b7cac37..46dda6467e 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SpeedPanelView.kt
@@ -80,7 +80,7 @@ class SpeedPanelView @JvmOverloads constructor(
}
}
this.timerTask = task
- timer.schedule(task, Date(), 100)
+ timer.schedule(task, Date(), 200)
}
override fun onChassisLocationGCJ02(gnssInfo: MessagePad.GnssInfo?) {
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java
index 075c51f3b5..9be0248578 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java
+++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java
@@ -122,7 +122,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
}).start();
}
- // TODO 李小鹏 这里需要将逻辑抽离出去,单独使用更新服务控制
private void upgradeProgressListener() {
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
// builder.setSmallIcon(R.mipmap.icon1001);//todo emArrow 更换图标,去除地图下载图标的依赖关系
diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml
index 2a527c3329..b2dd4a6f0a 100644
--- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml
+++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml
@@ -6,14 +6,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
-
-
-
-
-
-
-
+
+
+
+
+
+ app:layout_constraintTop_toTopOf="parent"/>
+
+
itx.init(it,
@@ -64,13 +73,27 @@ class MoGoMapDataCollectProvider : IMoGoMapDataCollectProvider, OnTaskListener,
}
override fun onDestroy() {
- CallerMapLocationListenerManager.removeListener("$M_MAP$TAG", false)
CallerLogger.d("$M_MAP$TAG", "--------- onDestroy --------")
+ CallerMapLocationListenerManager.removeListener(TAG, false)
+ CallerAutopilotRecordListenerManager.removeListener(TAG)
executor.get()?.setOnTaskListener(null)
listeners.clear()
map.clear()
}
+ override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) {
+ super.onAutopilotRecordResult(recordPanel)
+ CallerLogger.d("$M_MAP$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat}")
+ if (!FunctionBuildConfig.isDemoMode && recordPanel.type == 2 && (
+ recordPanel.stat == 101 || //工控机采集完成-被动完成
+ recordPanel.stat == 100 || //工控机采集完成-主动完成
+ recordPanel.stat == 102 || //工控机达到最大采集时长
+ recordPanel.stat == 103) //工控机磁盘满了
+ ) {
+ finish(recordPanel.id, recordPanel.stat, "", recordPanel.filename ?: "", recordPanel.note ?: "")
+ }
+ }
+
override fun registerOnMapCollectTaskListener(listener: IMoGoMapDataCollectProvider.OnMapCollectCmdListener?) {
CallerLogger.d("$M_MAP$TAG", "--------- registerOnMapCollectTaskListener --------")
listener ?: return
diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/remote/V2XEventResult.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/remote/V2XEventResult.kt
index e57241ae53..e9138cb04e 100644
--- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/remote/V2XEventResult.kt
+++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/remote/V2XEventResult.kt
@@ -38,8 +38,11 @@ data class V2XEvent(
@SerializedName("radius")
var radius: Double,
- @SerializedName("type")
- var type: Int
+ @SerializedName("poiType")
+ var poiType: String?,
+
+ @SerializedName("coordinateType")
+ var coordinateType:Int? = null
)
@Keep
diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt
index eb67733969..9250e8fd6e 100644
--- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt
+++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/overview/vm/OverViewModel.kt
@@ -8,6 +8,8 @@ import com.mogo.eagle.core.function.overview.OverviewDao
import com.mogo.eagle.core.function.overview.remote.OverViewServiceApi
import com.mogo.eagle.core.function.overview.remote.V2XEvent
import com.mogo.eagle.core.network.MoGoRetrofitFactory
+import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
+import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@@ -22,6 +24,10 @@ class OverViewModel(
private val _V2XEvents = MutableLiveData>()
private var disposable: Disposable? = null
+ companion object {
+ const val TAG = "OverViewModel"
+ }
+
val infStructures
get() = _infStructures
@@ -90,8 +96,10 @@ class OverViewModel(
.queryAllV2XEventsByLineId(lineId.toString(), sn)
.map {
if (it.code == 200 || it.code == 0) {
+ CallerLogger.d(SceneConstant.M_MAP + TAG, "请求成功,size为:${it.result?.v2XEventList?.size}")
return@map it.result?.v2XEventList
} else {
+ CallerLogger.d(SceneConstant.M_MAP + TAG, "请求失败,code为:${it.code}")
return@map ArrayList()
}
}
@@ -121,7 +129,12 @@ class OverViewModel(
if (parameter != null) {
if (parameter.autoPilotLine != null) {
lineId = parameter.autoPilotLine!!.lineId
+ CallerLogger.d(SceneConstant.M_MAP + TAG, "lineId为:$lineId")
+ } else {
+ CallerLogger.d(SceneConstant.M_MAP + TAG, "parameter.autoPilotLine为null")
}
+ } else {
+ CallerLogger.d(SceneConstant.M_MAP + TAG, "parameter为null")
}
return lineId
}
diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/AMapCustomView.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/AMapCustomView.java
index 18134d8151..c8f97d3f25 100644
--- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/AMapCustomView.java
+++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/AMapCustomView.java
@@ -260,10 +260,16 @@ public class AMapCustomView
if (center != null) {
center.getLon();
MarkerOptions markerOption = new MarkerOptions();
- LatLng latLng = MarkerDrawerManager.INSTANCE.coordinateConverterWgsToGcj(mContext, center.getLat(), center.getLon());
+ LatLng latLng;
+ if (event.getCoordinateType() == null || event.getCoordinateType() == 0) {
+ latLng = new LatLng(center.getLat(), center.getLon());
+ } else {
+ // wgs84坐标系需转成高德坐标系
+ latLng = MarkerDrawerManager.INSTANCE.coordinateConverterWgsToGcj(mContext, center.getLat(), center.getLon());
+ }
markerOption.position(latLng);
markerOption.anchor(0.13f, 1f);
- markerOption.icon(BitmapDescriptorFactory.fromBitmap(getV2XBitmap()));
+ markerOption.icon(BitmapDescriptorFactory.fromBitmap(getV2XBitmap(event.getPoiType())));
markerOptionsList.add(markerOption);
}
}
@@ -276,8 +282,8 @@ public class AMapCustomView
currMarkerList = mAMap.addMarkers(markerOptionsList, false);
}
- private Bitmap getV2XBitmap() {
- V2XMarkerView marker = new V2XMarkerView(getContext());
+ private Bitmap getV2XBitmap(String poiType) {
+ V2XMarkerView marker = new V2XMarkerView(getContext(), null, 0, poiType);
marker.measure(View.MeasureSpec.makeMeasureSpec(AutoSizeUtils.dp2px(mContext, 229), View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(AutoSizeUtils.dp2px(mContext, 96), View.MeasureSpec.EXACTLY));
marker.layout(0, 0, marker.getMeasuredWidth(), marker.getMeasuredHeight());
diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/V2XMarkerView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/V2XMarkerView.kt
index a776a29073..687ec34f1b 100644
--- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/V2XMarkerView.kt
+++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/V2XMarkerView.kt
@@ -3,14 +3,16 @@ package com.mogo.eagle.core.function.smp
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
+import android.widget.ImageView
+import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.map.R
-import kotlinx.android.synthetic.main.view_maker_with_count.view.*
class V2XMarkerView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
- defStyleAttr: Int = 0
+ defStyleAttr: Int = 0,
+ private val poiType: String? = ""
) : ConstraintLayout (
context,
attrs,
@@ -19,5 +21,33 @@ class V2XMarkerView @JvmOverloads constructor(
init {
LayoutInflater.from(context).inflate(R.layout.layout_v2x_maker, this, true)
+ initView()
+ }
+
+ private fun initView() {
+ val iconView = findViewById(R.id.ivIcon)
+ val contentView = findViewById(R.id.tvContent)
+ when (poiType) {
+ "10006" -> {
+ iconView.setBackgroundResource(R.drawable.icon_small_v2x_road_construction)
+ contentView.text = "道路施工"
+ }
+ "10007" -> {
+ iconView.setBackgroundResource(R.drawable.icon_v2x_road_congestion)
+ contentView.text = "道路拥堵"
+ }
+ "10032" -> {
+ iconView.setBackgroundResource(R.drawable.icon_v2x_road_accidents)
+ contentView.text = "道路事故"
+ }
+ "10025" -> {
+ iconView.setBackgroundResource(R.drawable.icon_v2x_obstacle)
+ contentView.text = "障碍车辆"
+ }
+// "10031" -> {
+// iconView.setBackgroundResource(R.drawable.icon_small_v2x_road_construction)
+// contentView.text = "弱势预警"
+// }
+ }
}
}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_v2x_maker.xml b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_v2x_maker.xml
index 8a5ee087ea..d105f5057d 100644
--- a/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_v2x_maker.xml
+++ b/core/function-impl/mogo-core-function-map/src/main/res/layout/layout_v2x_maker.xml
@@ -19,7 +19,7 @@
/>
{ //rsiEvent
+ onMogoObuDcRsiWarning(obuWarningData.rsiEvent)
+ }
+
+ 2 -> { //RsmEvent
+ onMogoObuDcRsmWarning(obuWarningData.rsmEvent)
+ }
+
+ 3 -> { //SpatEvent
+ onMogoObuDcSpatWarning(obuWarningData.spatEvent)
+ }
+
+ 4 -> { //map
+ onMogoObuMapMath(obuWarningData.mapMatchData)
+ }
+ }
+ }
+
+ }
+
+ /**
+ * RSI预警信息 CvxRtiThreatIndInfo(交通标志预警(前方限速、前方学校等等),交通事件预警(前方拥堵、前方积水等等))
+ */
+ fun onMogoObuDcRsiWarning(rsiWarningData: RsiWarningData?) {
+ CallerLogger.d(
+ "${M_OBU}${TAG}",
+ "MogoObuDcCombineManager onMogoObuRsiWarning ------> ${rsiWarningData.toString()}"
+ )
+ if (rsiWarningData != null && rsiWarningData.warningMsgList != null && rsiWarningData.warningMsgList.size > 0) {
+ var alertContent = ""
+ var ttsContent = "" //列表只有一项
+ var appId = rsiWarningData.warningMsgList[0].sceneType.toString()
+ val status = rsiWarningData.status
+ val level = rsiWarningData.warningMsgList[0].warningLevel
+ val direction = getMessageDirection(rsiWarningData.warningMsgList[0].targetPosition)
+ CallerLogger.d("${M_OBU}${TAG}",
+ "MogoObuDcCombineManager onMogoObuDcRsiWarning appId = $appId --status = $status --level = $level -- eventSerialNum = ${rsiWarningData.warningMsgList[0].eventSerialNum} ---signSerialNum = ${rsiWarningData.warningMsgList[0].signSerialNum} --- direction = $direction -- targetPosition = ${rsiWarningData.warningMsgList[0].targetPosition}"
+ )
+
+ when (appId) {
+ // 道路危险情况预警
+ MogoObuConstants.RSI_SCENE_TYPE.HLW.toString() -> {
+ when (rsiWarningData.warningMsgList[0].eventSerialNum) {
+ MogoObuConstants.RTE.RTI_TYPE_BREAKDOWN -> {//车辆故障
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_BREAKDOWN_WARNING.poiType
+ }
+ MogoObuConstants.RTE.RTI_TYPE_ROAD_WATER -> { //道路积水
+ appId = EventTypeEnumNew.FOURS_PONDING.poiType
+ }
+ MogoObuConstants.RTE.RTI_TYPE_PARKING_VIOLATION -> { //异常停车
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_PARKING.poiType
+ }
+// MogoObuConstants.RTE.RTI_TYPE_CONSTRUCTION_RTE -> { //施工占道,和标牌重复
+// appId = EventTypeEnumNew.FOURS_ROAD_WORK.poiType
+// }
+ MogoObuConstants.RTE.RTI_TYPE_SPEEDING -> { //超速行驶
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_SLW.poiType
+ }
+ MogoObuConstants.RTE.RTI_TYPE_RETRIGRADE -> { //车辆逆行
+ appId =
+ EventTypeEnumNew.TYPE_USECASE_ID_ROAD_VEHICLE_RETROGRADE.poiType
+ }
+ }
+ alertContent = EventTypeEnumNew.getWarningContent(appId)
+ ttsContent = EventTypeEnumNew.getWarningTts(appId)
+ alertContent = String.format( //事件才有影响范围
+ alertContent,
+ Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(),
+ Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString()
+ )
+ ttsContent = String.format(
+ ttsContent,
+ Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(),
+ Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString()
+ )
+ }
+
+ //车内标牌
+ MogoObuConstants.RSI_SCENE_TYPE.IVS.toString() -> {
+ when (rsiWarningData.warningMsgList[0].signSerialNum) {
+// MogoObuConstants.RTS.RTI_TYPE_INTERSECTION -> { //十字路口
+// appId = V2iEventTypeEnum.TYPE_ID_NTERSECTION.poiType
+// }
+ MogoObuConstants.RTS.RTI_TYPE_SHAPR_TURNS -> { //急转弯
+ appId = EventTypeEnumNew.TYPE_ID_SHAPR_TURNS.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_BRIDGE -> { //桥梁
+ appId = EventTypeEnumNew.TYPE_ID_BRIDGE.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_PEDESTRIAN -> { //行人
+ appId = EventTypeEnumNew.TYPE_ID_PEDESTRIAN.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_SLIPPERY_ROAD -> { //路滑
+ appId = EventTypeEnumNew.TYPE_ID_SLIPPERY_ROAD.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_TUNNEL -> { //隧道
+ appId = EventTypeEnumNew.TYPE_ID_TUNNEL.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_FERRY -> { //渡轮
+ appId = EventTypeEnumNew.TYPE_ID_FERRY.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_UNEVEN_ROAD -> { //路面不平
+ appId = EventTypeEnumNew.TYPE_ID_UNEVEN_ROAD.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_NON_MOTOR_VEHICLE -> { //非机动车
+ appId = EventTypeEnumNew.TYPE_ID_NON_MOTOR_VEHICLE.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_OBSTACLE -> { //障碍
+ appId = EventTypeEnumNew.TYPE_ID_OBSTACLE.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_CONSTRUCTION -> { //施工
+ appId = EventTypeEnumNew.TYPE_FOURS_ROAD_WORK.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_VEHICLE_QUEUE -> { //车队
+ appId = EventTypeEnumNew.TYPE_VEHICLE_QUEUE.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_NO_PASSING -> { //不通
+ appId = EventTypeEnumNew.TYPE_NO_PASSING.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_NO_TURNING_AROUND -> { //禁止掉头
+ appId = EventTypeEnumNew.TYPE_NO_TURNING_AROUND.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_NO_STOPPING -> { //禁止停车
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_NO_PARKING.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_NO_TOOTING -> { //禁止鸣笛
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_NO_TOOTING.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_SPEED_LIMIT -> { //限速
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_SPEED_LIMIT.poiType
+ }
+// MogoObuConstants.RTS.RTI_TYPE_GO_STRAIGHT_TURN_RIGHT -> { //直行或右转
+// appId =
+// EventTypeEnumNew.TYPE_USECASE_ID_GO_STRAIGHT_TURN_RIGHT.poiType
+// }
+ MogoObuConstants.RTS.RTI_TYPE_BUS_WARNING -> { //公交提醒
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_BUS_WARNING.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_NARROW_RIGHT -> { //右侧变窄/车道数减少
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_NARROW_RIGHT.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_GAS_STATION -> { //加油站
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_GAS_STATION.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_SCHOOL -> { //学校
+ appId =
+ EventTypeEnumNew.TYPE_USECASE_ID_ROAD_PEDESTRIAN_SCHOOL.poiType
+ }
+ MogoObuConstants.RTS.RTI_TYPE_ACCIDENT -> { //事故
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_ACCIDENT.poiType
+ }
+ }
+
+ alertContent = EventTypeEnumNew.getWarningContent(appId)
+ ttsContent = EventTypeEnumNew.getWarningTts(appId)
+ alertContent = String.format( //标牌是没有影响范围的
+ alertContent,
+ Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString()
+ )
+ ttsContent = String.format(
+ ttsContent,
+ Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString()
+ )
+ }
+
+ // 拥堵
+ MogoObuConstants.RSI_SCENE_TYPE.TJW.toString() -> {
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_TJW.poiType
+ alertContent = EventTypeEnumNew.getWarningContent(appId)
+ ttsContent = EventTypeEnumNew.getWarningTts(appId)
+ alertContent = String.format( //事件才有影响范围
+ alertContent,
+ Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(),
+ Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString()
+ )
+ ttsContent = String.format(
+ ttsContent,
+ Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(),
+ Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString()
+ )
+ }
+
+ //限速预警, ADD处理一次
+ MogoObuConstants.RSI_SCENE_TYPE.SLW.toString() -> {
+ alertContent = EventTypeEnumNew.getWarningContent(appId)
+ ttsContent = EventTypeEnumNew.getWarningTts(appId)
+ }
+ }
+
+ CallerLogger.d(
+ "${M_OBU}${TAG}",
+ "MogoObuDcCombineManager ttsContent = $ttsContent --alertContent = $alertContent --appId = $appId ---direction = ${direction.direction} --distance = ${rsiWarningData.warningMsgList[0].distance} ---eventRadius = ${rsiWarningData.warningMsgList[0].eventRadius} --speedMaxLimit = ${rsiWarningData.warningMsgList[0].speedMaxLimit}"
+ )
+ when (status) {
+ // 添加
+ MogoObuConstants.STATUS.ADD -> {
+ //显示警告红边
+ CallerHmiManager.showWarning(direction)
+ CallerMsgBoxManager.saveMsgBox(
+ MsgBoxBean(
+ MsgBoxType.V2X,
+ V2XMsg(
+ appId,
+ alertContent,
+ ttsContent
+ )
+ ).apply {
+ sourceType = DataSourceType.TELEMATIC
+ }
+ )
+ CallerHmiManager.warningV2X(
+ appId,
+ alertContent,
+ ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒
+ (appId + direction.direction),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的
+ object : IMoGoWarningStatusListener {
+ override fun onDismiss() {
+ // 关闭警告红边
+ CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
+ }
+ },
+ true,
+ 5000L
+ )
+
+ // 更新数据,是否需要
+// TrafficDataConvertUtilsNew.cvxRtiThreatIndInfo2TrafficData(rsiWarningData)?.let {
+// CallerMapUIServiceManager.getMarkerService()
+// ?.updateITrafficThreatLevelInfo(it)
+// }
+ }
+
+ MogoObuConstants.STATUS.UPDATE -> { // 更新
+ }
+
+ // 删除
+ MogoObuConstants.STATUS.DELETE -> {
+ // 关闭警告红边
+// CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
+ // 移除顶部弹窗
+ CallerHmiManager.disableWarningV2X((appId + direction.direction))
+ // 更新数据,删除标牌?
+// TrafficDataConvertUtilsNew.cvxRtiThreatIndInfo2TrafficData(rsiWarningData)
+// ?.let {
+// // 事件结束,还原车辆颜色
+// it.threatLevel = 0x01
+// CallerMapUIServiceManager.getMarkerService()
+// ?.updateITrafficInfo(it)
+// }
+ }
+ }
+ }
+ }
+
+ /**
+ * RSM预警信息 CvxPtcThreatIndInfo CvxPtcInfoIndInfo(主车与弱势交通参与者之间的预警(如:弱势交通参与者碰撞预警))
+ */
+ fun onMogoObuDcRsmWarning(rsmWarningData: RsmWarningData?) {
+ if (HmiBuildConfig.isShowObuWeaknessTrafficView) {
+ CallerLogger.d(
+ "${M_OBU}${TAG}",
+ "MogoObuDcCombineManager onMogoObuRsmWarning ------> ${rsmWarningData.toString()}"
+ )
+ // 交通参与者类型 0x0:未知 UNKNOWN | 1机动车 2:非机动车 NON_MOTOR | 3:行人 PEDESTRIAN 4:obu
+ if (rsmWarningData != null && rsmWarningData.participantOfOne != null) {
+ var v2xType = ""
+ if (rsmWarningData.participantOfOne.ptcType == 1) { //机动车
+ v2xType =
+ EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.poiType
+ } else if (rsmWarningData.participantOfOne.ptcType == 2) { //非机动车
+ v2xType =
+ EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_NOT_MOTOR_VEHICLES.poiType
+ } else if (rsmWarningData.participantOfOne.ptcType == 3) { //行人
+ v2xType =
+ EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_PERSON.poiType
+ } else { //未知
+ v2xType = EventTypeEnumNew.TYPE_ERROR.poiType
+ }
+ val ttsContent = EventTypeEnumNew.getWarningTts(v2xType)
+ val alertContent =
+ EventTypeEnumNew.getWarningContent(v2xType)
+ var level = -1
+ val direction =
+ getMessageDirection(rsmWarningData.participantOfOne.targetPosition) //TODO 只有一个
+ if (rsmWarningData.warningMsg != null && rsmWarningData.warningMsg.warningDataList != null && rsmWarningData.warningMsg.warningDataList.size > 0) {
+ level = rsmWarningData.warningMsg.warningDataList[0].warningLevel
+ CallerLogger.d(
+ "${M_OBU}${TAG}",
+ "MogoObuDcCombineManager onMogoObuRsmWarning ---status---> ${rsmWarningData.status} --list status----> ${rsmWarningData.warningMsg.warningDataList.get(0).status} --v2xType--- $v2xType ---alertContent = $alertContent ---ttsContent= $ttsContent"
+ )
+
+ when (rsmWarningData.warningMsg.warningDataList.get(0).status) {
+ MogoObuConstants.STATUS.ADD -> { // 添加
+ //显示警告红边
+ CallerHmiManager.showWarning(direction)
+ CallerMsgBoxManager.saveMsgBox(
+ MsgBoxBean(
+ MsgBoxType.V2X,
+ V2XMsg(
+ v2xType,
+ alertContent,
+ ttsContent
+ )
+ ).apply {
+ sourceType = DataSourceType.TELEMATIC
+ }
+ )
+ CallerHmiManager.warningV2X(
+ v2xType,
+ alertContent,
+ ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒
+ (v2xType + direction.direction),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的
+ object : IMoGoWarningStatusListener {
+ override fun onDismiss() {
+ // 关闭警告红边
+ CallerHmiManager.showWarning(
+ WarningDirectionEnum.ALERT_WARNING_NON
+ )
+ }
+ },
+ true,
+ 5000L
+ )
+
+ // 更新数据 TODO
+// TrafficDataConvertUtils.cvxPtcThreatIndInfo2TrafficData(rsmWarningData)?.let {
+//// TrafficMarkerDrawer.updateITrafficThreatLevelInfo(it)
+// CallerMapUIServiceManager.getMarkerService()
+// ?.updateITrafficThreatLevelInfo(it)
+// }
+ }
+
+ MogoObuConstants.STATUS.UPDATE -> {// 更新
+ }
+
+ // 删除
+ MogoObuConstants.STATUS.DELETE -> {
+ // 关闭警告红边
+ CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
+ // 更新数据 TODO 由于obu通过域控需要转换单位,这里临时转换,后面3.0不需要转换
+// TrafficDataConvertUtils.cvxPtcThreatIndInfo2TrafficData(rsmWarningData)?.let {
+// // 事件结束,还原交通参与者颜色
+// it.threatLevel = 0x01
+//// TrafficMarkerDrawer.updateITrafficThreatLevelInfo(it)
+// CallerMapUIServiceManager.getMarkerService()
+// ?.updateITrafficThreatLevelInfo(it)
+// }
+ //删除弱势交通元素
+ CallerMapUIServiceManager.getMarkerService()
+ ?.removeCvxRvInfoIndInfo(rsmWarningData.participantOfOne.ptcID.toString())
+// TrafficMarkerDrawer.removeCvxRvInfoIndInfo(rsmWarningData.participantOfOne.ptcID.toString())
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ /**
+ * 红绿灯预警信息
+ */
+ fun onMogoObuDcSpatWarning(spatWarningData: SpatWarningData?) {
+ CallerLogger.d("${M_OBU}${TAG}", "onMogoObuDcSpatWarning warningType = ${spatWarningData!!.warningType} --status = ${spatWarningData?.status} --lightsList = ${spatWarningData.lightsList}")
+ handlerTrafficLight(
+ spatWarningData!!.warningType,
+ spatWarningData?.status,
+ spatWarningData?.lightsList
+ )
+ }
+
+ /**
+ * 地图匹配 是OBU算法输出地图匹配结果,主车匹配道路哪条路或者哪条车道
+ */
+ fun onMogoObuMapMath(data: MapMatchData?) {
+ CallerLogger.d("${M_OBU}${TAG}", "MogoObuDcCombineManager onMogoObuMapMath HmiBuildConfig.isShowObuLimitSpeedView = " + HmiBuildConfig.isShowObuLimitSpeedView)
+ if(HmiBuildConfig.isShowObuLimitSpeedView) {
+ if (data != null) {
+ CallerLogger.d("${M_OBU}${TAG}",
+ "MogoObuDcCombineManager onMogoObuMapMath = ${data.status} --speedMaxLimit = ${Math.round((data.speedMaxLimit*0.02*3.6))} --- data.speedMaxLimit = ${data.speedMaxLimit}")
+ when (data.status) {
+ MogoObuConstants.STATUS.ADD -> { // 添加 TODO
+ CallerHmiManager.showLimitingVelocity(Math.round((data.speedMaxLimit*0.02*3.6)).toInt(), 2)
+ }
+
+ MogoObuConstants.STATUS.UPDATE -> { // 更新
+ }
+
+ MogoObuConstants.STATUS.DELETE -> { // 删除
+ CallerHmiManager.disableLimitingVelocity()
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * 获取消息的方位 车辆相关
+ */
+ private fun getMessageDirection(targetClassification: Int): WarningDirectionEnum {
+ return when (targetClassification) {
+ MogoObuConstants.VEH_TARGET_POSITION.AHEAD_IN_LANE,
+ MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_IN_LANE -> WarningDirectionEnum.ALERT_WARNING_TOP //正前方
+
+ MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_IN_LANE -> WarningDirectionEnum.ALERT_WARNING_BOTTOM //正后方
+
+ MogoObuConstants.VEH_TARGET_POSITION.INTERSECTION_RIGHT -> WarningDirectionEnum.ALERT_WARNING_RIGHT //正右方
+
+ MogoObuConstants.VEH_TARGET_POSITION.INTERSECTION_LEFT -> WarningDirectionEnum.ALERT_WARNING_LEFT //正左方
+
+ MogoObuConstants.VEH_TARGET_POSITION.AHEAD_LEFT, MogoObuConstants.VEH_TARGET_POSITION.AHEAD_FAR_LEFT,
+ MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_LEFT, MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_FAR_LEFT
+ -> WarningDirectionEnum.ALERT_WARNING_TOP_LEFT //左前方
+
+ MogoObuConstants.VEH_TARGET_POSITION.AHEAD_RIGHT, MogoObuConstants.VEH_TARGET_POSITION.AHEAD_FAR_RIGHT,
+ MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_RIGHT, MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_FAT_RIGHT
+ -> WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT //右前方
+
+ MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_LEFT, MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_FAR_LEFT,
+ -> WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT //左后方
+
+ MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_RIGHT, MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_FAR_RIGHT,
+ -> WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT //右后方
+
+ MogoObuConstants.VEH_TARGET_POSITION.UNCLASSIFIED -> WarningDirectionEnum.ALERT_WARNING_NON //未知
+ else -> WarningDirectionEnum.ALERT_WARNING_ALL
+ }
+ }
+
+ /**
+ * 处理红绿灯
+ */
+ private fun handlerTrafficLight(appId: Int, status: Int, lights: List) {
+ CallerLogger.d(
+ "${M_OBU}${TAG}",
+ "MogoObuDcCombineManager handlerTrafficLight --- status = $status ---lights.size = ${lights.size} ---lights = $lights ---appId = $appId"
+ )
+ when (status) {
+ // 添加
+ MogoObuConstants.STATUS.ADD,
+ MogoObuConstants.STATUS.UPDATE
+ -> {
+ if (lights != null && lights.isNotEmpty()) {
+ changeTrafficLightStatus(appId, lights)
+ }
+ }
+ // 删除
+ MogoObuConstants.STATUS.DELETE -> {
+ // 移除顶部弹窗,当收不到信号的时候触发一次
+ CallerHmiManager.disableWarningTrafficLight()
+ CallerHmiManager.disableWarningV2X(appId.toString())
+ isShowGreenWave = false
+ isShowRunRedLight = false
+ }
+ }
+ }
+
+ private var isRedLight = false
+ private var isGreenLight = false
+ private var isShowGreenWave = false
+ private var isShowRunRedLight = false
+
+ /**
+ * 修改红绿灯
+ */
+ @Synchronized
+ private fun changeTrafficLightStatus(
+ appId: Int,
+ lights: List
+ ) {
+ var ttsContent = ""
+ var alertContent = ""
+ //这里需要根据真实数据确定 index 取值方式
+ val currentLight = lights[0]
+ CallerLogger.e(
+ "${M_OBU}${TAG}",
+ "MogoObuDcCombineManager currentLight = $currentLight ---currentLight.phaseID = ${currentLight.phaseID} ---appId = $appId ---isShowRunRedLight = $isShowRunRedLight ---isShowGreenWave = $isShowGreenWave"
+ )
+
+ // 闯红灯预警和绿波通行底层是互斥的
+ when (appId) {
+ 0 -> {//不可用 V2I_RLVW_VIOLATION_TYPE_UNAVAILABLE 无效
+
+ }
+ 1 -> { //闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT 一个红灯周期只显示一次
+ if (!isShowRunRedLight) {
+ isShowRunRedLight = true
+ CallerHmiManager.disableWarningV2X(1667.toString())
+ ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType)
+ alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType)
+ CallerLogger.d("${M_OBU}${TAG}","MogoObuDcCombineManager changeTrafficLightStatus 闯红灯 --------> ttsContent = $ttsContent ---alertContent = $alertContent ")
+ CallerMsgBoxManager.saveMsgBox(
+ MsgBoxBean(
+ MsgBoxType.V2X,
+ V2XMsg(
+ EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType,
+ alertContent,
+ ttsContent
+ )
+ ).apply {
+ sourceType = DataSourceType.TELEMATIC
+ }
+ )
+
+ CallerHmiManager.warningV2X(
+ EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType, alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒
+ EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType, null, true, 5000L)
+ }
+ }
+
+ 2 -> { //绿波通行引导 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION 一个绿灯周期只显示一次
+ if (!isShowGreenWave) {
+ isShowGreenWave = true
+ CallerHmiManager.disableWarningV2X(1666.toString())
+ CallerLogger.d(
+ "${M_OBU}${TAG}",
+ "MogoObuDcCombineManager 绿波通行引导 --------> speed_min = ${currentLight.suggestMinSpeed} --speed_max = ${currentLight.suggestMaxSpeed}")
+ val adviceSpeed =
+ "${Math.round(currentLight.suggestMinSpeed*3.6*0.02)} - ${Math.round(currentLight.suggestMaxSpeed*3.6*0.02)}"
+ val adviceSpeedTts =
+ "${Math.round(currentLight.suggestMinSpeed*3.6*0.02)} - ${Math.round(currentLight.suggestMaxSpeed*3.6*0.02)}"
+
+ ttsContent =
+ String.format(
+ EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType),
+ adviceSpeedTts
+ )
+ alertContent =
+ String.format(
+ EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType),
+ adviceSpeed
+ )
+ val maxSpeed = currentLight.suggestMaxSpeed*3.6
+ if (maxSpeed > 0) {
+ CallerMsgBoxManager.saveMsgBox(
+ MsgBoxBean(
+ MsgBoxType.V2X,
+ V2XMsg(
+ EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType,
+ alertContent,
+ ttsContent
+ )
+ ).apply {
+ sourceType = DataSourceType.TELEMATIC
+ }
+ )
+
+ CallerHmiManager.warningV2X(
+ EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType,
+ alertContent,
+ ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒
+ appId.toString(),
+ null,
+ true,
+ 5000L
+ )
+ }
+ }
+ }
+ }
+
+ when (currentLight.light) {
+ // 灯光不可用
+ 0 -> {
+ CallerHmiManager.showWarningTrafficLight(0, 2)
+ }
+
+ // 红灯
+ 2, 3 -> {
+ if (!isRedLight) {
+ CallerHmiManager.disableWarningV2X(appId.toString())
+ isRedLight = true
+ }
+ isGreenLight = false
+ CallerHmiManager.showWarningTrafficLight(1, 2)
+ val red = currentLight.countDown / 10
+ CallerHmiManager.changeCountdownRed(red)
+ }
+
+ // 绿灯
+ 4, 5, 6 -> {
+ if (!isGreenLight) {
+ CallerHmiManager.disableWarningV2X(appId.toString())
+ isGreenLight = true
+ }
+ isRedLight = false
+ CallerHmiManager.showWarningTrafficLight(3, 2)
+ val green = currentLight.countDown / 10
+ CallerHmiManager.changeCountdownGreen(green)
+ }
+
+ // 黄灯
+ 7, 8 -> {
+ CallerHmiManager.disableWarningV2X(appId.toString())
+ CallerHmiManager.showWarningTrafficLight(2, 2)
+ val yellow = currentLight.countDown / 10
+ CallerHmiManager.changeCountdownYellow(yellow)
+ }
+ }
+ }
+
+}
diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt
index 973c7da6ee..a942a7556e 100644
--- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt
+++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt
@@ -2,13 +2,15 @@ package com.mogo.eagle.core.function.obu.mogo
import android.content.Context
import android.util.Log
-import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
-import com.mogo.eagle.core.data.config.HmiBuildConfig
-import com.mogo.eagle.core.data.constants.MogoServicePaths
+import com.mogo.eagle.core.data.enums.EventTypeEnum
+import com.mogo.eagle.core.data.enums.EventTypeHelper
import com.mogo.eagle.core.data.enums.WarningDirectionEnum
+import com.mogo.eagle.core.data.msgbox.MsgBoxBean
+import com.mogo.eagle.core.data.msgbox.MsgBoxType
+import com.mogo.eagle.core.data.msgbox.V2XMsg
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
@@ -16,18 +18,12 @@ import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.Default
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.TooClose
+import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.call.obu.CallerObuListenerManager
import com.mogo.eagle.core.function.obu.mogo.utils.TrafficDataConvertUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OBU
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
-import com.mogo.eagle.core.data.enums.EventTypeEnum
-import com.mogo.eagle.core.data.enums.EventTypeHelper
-import com.mogo.eagle.core.data.msgbox.MsgBoxBean
-import com.mogo.eagle.core.data.msgbox.MsgBoxType
-import com.mogo.eagle.core.data.msgbox.V2XMsg
-import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
-//import com.mogo.service.IMogoServiceApis
import com.zhidao.support.obu.MogoObuManager
import com.zhidao.support.obu.OnMogoObuListener
import com.zhidao.support.obu.constants.ObuConstants
@@ -48,14 +44,11 @@ class MogoPrivateObuManager private constructor() {
}
}
-// private var mMogoServiceApis: IMogoServiceApis? = null
private var mContext: Context? = null
private var mObuStatusInfo = CallerObuListenerManager.getObuStatusInfo()
fun init(context: Context, ipAddress: String) {
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "obuManager初始化--")
-// mMogoServiceApis = ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS)
-// .navigation(context) as IMogoServiceApis
mContext = context
//连接obu设备
connectObu(context, ipAddress)
diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt
index 897a9432fe..93706d2adc 100644
--- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt
+++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt
@@ -1,11 +1,10 @@
package com.mogo.eagle.core.function.obu.mogo
import android.content.Context
-import android.util.Log
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
-import com.mogo.eagle.core.data.config.HmiBuildConfig.isShowObuLimitSpeedView
import com.mogo.eagle.core.data.enums.*
+import com.mogo.eagle.core.data.msgbox.DataSourceType
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.V2XMsg
@@ -18,6 +17,8 @@ import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.Defa
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.TooClose
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.call.obu.CallerObuListenerManager
+import com.mogo.eagle.core.function.call.obu.CallerObuTrafficLightListenerManager
+import com.mogo.eagle.core.function.call.v2x.CallObuLimitingSpeedListenerManager
import com.mogo.eagle.core.function.obu.mogo.utils.TrafficDataConvertUtilsNew
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OBU
@@ -93,7 +94,6 @@ class MogoPrivateObuNewManager private constructor() {
*/
override fun onConnectStatus(connectStatus: Int) {
if (connectStatus == 0) { //断开连接
- CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "onConnectFail ------> ")
mObuStatusInfo.obuStatus = false
mObuStatusInfo.obuHvStatus = false
mObuStatusInfo.obuRvStatus = false
@@ -102,7 +102,6 @@ class MogoPrivateObuNewManager private constructor() {
mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU_HV", false) }
mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU_RV", false) }
} else if (connectStatus == 1) { //连接成功
- CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "onConnected ------> ")
mObuStatusInfo.obuStatus = true
CallerObuListenerManager.invokeListener(mObuStatusInfo)
mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU", true) }
@@ -170,47 +169,47 @@ class MogoPrivateObuNewManager private constructor() {
*/
override fun onMogoObuRvWarning(data: MogoObuRvWarningData) {
super.onMogoObuRvWarning(data)
- if (HmiBuildConfig.isShowObuV2vView) {
- mObuStatusInfo.obuRvStatus = true
- CallerObuListenerManager.invokeListener(mObuStatusInfo)
+// if (HmiBuildConfig.isShowObuV2vView) { //TODO 临时需要关闭v2v开关
+ mObuStatusInfo.obuRvStatus = true
+ CallerObuListenerManager.invokeListener(mObuStatusInfo)
+ if (!data.warningMsg.warningData.isNullOrEmpty()) {
+ // 更新数据,远车数据,之前要匹配uuid
+ TrafficDataConvertUtilsNew.cvxRvInfoIndInfo2TrafficData(data)?.let {
+ CallerMapUIServiceManager.getMarkerService()?.updateITrafficLocationInfo(it)
+ }
- if (!data.warningMsg.warningData.isNullOrEmpty()) {
- // 更新数据,远车数据,之前要匹配uuid
- TrafficDataConvertUtilsNew.cvxRvInfoIndInfo2TrafficData(data)?.let {
- CallerMapUIServiceManager.getMarkerService()?.updateITrafficLocationInfo(it)
- }
-
- CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", data.toString())
- data.let {
- //预警信息,预警类型 threat_level 2、3
- var status = data.status
- data.vehBasicsMsg?.let {
- //预警方位
- val direction = getMessageDirection(data.vehBasicsMsg.targetPosition)
- //处理预警类型
- var appId = ""
- var level = -1
- data.warningMsg?.let {
- if (data.warningMsg.warningData != null && data.warningMsg.warningData.size > 0) {
- level = data.warningMsg.warningData[0].warningLevel
- appId = data.warningMsg.warningData[0].warningType.toString()
+ CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", data.toString())
+ data.let {
+ //预警信息,预警类型 threat_level 2、3
+ data.vehBasicsMsg?.let {
+ //预警方位
+ val direction = getMessageDirection(data.vehBasicsMsg.targetPosition)
+ //处理预警类型
+ var appId = ""
+ var level = -1
+ var status = -1
+ data.warningMsg?.let {
+ if (data.warningMsg.warningData != null && data.warningMsg.warningData.size > 0) {
+ level = data.warningMsg.warningData[0].warningLevel
+ appId = data.warningMsg.warningData[0].warningType.toString()
+ status = data.warningMsg.warningData[0].status
+ //拼凑数据
+ if (appId != null) {
+ handleSdkObu(appId, direction, status, level, data)
}
}
-
- CallerLogger.d(
- "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
- "onMogoObuRvWarning target_classification = ${
- getMessageDirection(data.vehBasicsMsg.targetPosition)
- } --- direction = $direction --- appId = $appId ---level = $level -- status = $status"
- )
- //拼凑数据
- if (appId != null) {
- handleSdkObu(appId, direction, status, level, data)
- }
}
+
+ CallerLogger.d(
+ "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
+ "onMogoObuRvWarning target_classification = ${
+ getMessageDirection(data.vehBasicsMsg.targetPosition)
+ } --- direction = $direction --- appId = $appId ---level = $level -- status = $status"
+ )
}
}
}
+// }
}
/**
@@ -218,46 +217,43 @@ class MogoPrivateObuNewManager private constructor() {
*/
override fun onMogoObuSpatWarning(data: MogoObuSpatWarningData) {
super.onMogoObuSpatWarning(data)
- if (data?.lights != null && data.lights.isNotEmpty()
- ) {
- if (HmiBuildConfig.isShowObuV2iView) {
- handlerTrafficLight(
- data.warningType,
- data.status,
- data.lights
- )
- }
+ if (data != null) {
+// if (HmiBuildConfig.isShowObuV2iView) {
+ handlerTrafficLight(
+ data.warningType,
+ data.status,
+ data.lights
+ )
+// }
}
}
/**
- * RSI预警信息 CvxRtiThreatIndInfo(交通标志预警(前方限速、前方学校等等),交通事件预警(前方拥堵、前方积水等等))
+ * RSI预警信息 onMogoObuRsiWarning(交通标志预警(前方限速、前方学校等等),交通事件预警(前方拥堵、前方积水等等))
*/
override fun onMogoObuRsiWarning(data: MogoObuRsiWarningData) {
super.onMogoObuRsiWarning(data)
- if (HmiBuildConfig.isShowObuV2iView) {
+// if (HmiBuildConfig.isShowObuV2iView) {
+ if (data != null && data.warningMsg != null && data.warningMsg.size > 0) {
+ var alertContent = ""
+ var ttsContent = ""
+ var appId = data.warningMsg[0].sceneType.toString()
+ val status = data.status
+ val level = data.warningMsg[0].warningLevel
+ val direction = getMessageDirection(data.warningMsg[0].targetPosition)
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
- "onMogoObuRsiWarning ------> $data"
+ "onMogoObuRsiWarning appId = $appId --status = $status --level = $level -- eventSerialNum = ${data.warningMsg[0].eventSerialNum} ---signSerialNum = ${data.warningMsg[0].signSerialNum} --- direction = $direction -- targetPosition = ${data.warningMsg[0].targetPosition}"
)
- if (data != null && data.warningMsg != null && data.warningMsg.size > 0) {
- var alertContent = ""
- var ttsContent = ""
- var appId = data.warningMsg[0].sceneType.toString()
- val status = data.status
- val level = data.warningMsg[0].warningLevel
- val direction = getMessageDirection(data.warningMsg[0].targetPosition)
- CallerLogger.d(
- "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
- "onCvxRtiThreatIndInfo appId = $appId --status = $status --level = $level -- eventSerialNum = ${data.warningMsg[0].eventSerialNum} ---signSerialNum = ${data.warningMsg[0].signSerialNum} --- direction = $direction -- targetPosition = ${data.warningMsg[0].targetPosition}"
- )
+ if (appId != "0") {
when (appId) {
// 道路危险情况预警
MogoObuConstants.RSI_SCENE_TYPE.HLW.toString() -> {
when (data.warningMsg[0].eventSerialNum) {
MogoObuConstants.RTE.RTI_TYPE_BREAKDOWN -> {//车辆故障
- appId = EventTypeEnumNew.TYPE_USECASE_ID_BREAKDOWN_WARNING.poiType
+ appId =
+ EventTypeEnumNew.TYPE_USECASE_ID_BREAKDOWN_WARNING.poiType
}
MogoObuConstants.RTE.RTI_TYPE_ROAD_WATER -> { //道路积水
appId = EventTypeEnumNew.FOURS_PONDING.poiType
@@ -341,9 +337,11 @@ class MogoPrivateObuNewManager private constructor() {
MogoObuConstants.RTS.RTI_TYPE_NO_TOOTING -> { //禁止鸣笛
appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_NO_TOOTING.poiType
}
- MogoObuConstants.RTS.RTI_TYPE_SPEED_LIMIT -> { //限速
- appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_SPEED_LIMIT.poiType
- }
+// MogoObuConstants.RTS.RTI_TYPE_SPEED_LIMIT -> { //限速
+// appId =
+// EventTypeEnumNew.TYPE_USECASE_ID_ROAD_SPEED_LIMIT.poiType
+// }
+
// MogoObuConstants.RTS.RTI_TYPE_GO_STRAIGHT_TURN_RIGHT -> { //直行或右转
// appId =
// EventTypeEnumNew.TYPE_USECASE_ID_GO_STRAIGHT_TURN_RIGHT.poiType
@@ -381,7 +379,6 @@ class MogoPrivateObuNewManager private constructor() {
// 拥堵
MogoObuConstants.RSI_SCENE_TYPE.TJW.toString() -> {
appId = EventTypeEnumNew.TYPE_USECASE_ID_TJW.poiType
-
alertContent = EventTypeEnumNew.getWarningContent(appId)
ttsContent = EventTypeEnumNew.getWarningTts(appId)
alertContent = String.format( //事件才有影响范围
@@ -398,6 +395,7 @@ class MogoPrivateObuNewManager private constructor() {
//限速预警, ADD处理一次
MogoObuConstants.RSI_SCENE_TYPE.SLW.toString() -> {
+ appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_SPEED_LIMIT.poiType
alertContent = EventTypeEnumNew.getWarningContent(appId)
ttsContent = EventTypeEnumNew.getWarningTts(appId)
}
@@ -405,25 +403,30 @@ class MogoPrivateObuNewManager private constructor() {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
- "new onMogoObuRsiWarning ttsContent = $ttsContent --alertContent = $alertContent --appId = $appId ---direction = ${direction.direction} --distance = ${Math.round(data.warningMsg[0].distance)} ---eventRadius = ${Math.round(data.warningMsg[0].eventRadius)} --speedMaxLimit = ${data.warningMsg[0].speedMaxLimit.toInt()}"
+ "new onMogoObuRsiWarning appId = $appId ---status = $status --- ttsContent = $ttsContent --alertContent = $alertContent -- eventSerialNum = ${data.warningMsg[0].eventSerialNum} ---signSerialNum = ${data.warningMsg[0].signSerialNum} ---direction = ${direction.direction} --distance = ${
+ Math.round(data.warningMsg[0].distance)
+ } ---eventRadius = ${Math.round(data.warningMsg[0].eventRadius)} --speedMaxLimit = ${data.warningMsg[0].speedMaxLimit.toInt()}"
)
+
when (status) {
MogoObuConstants.STATUS.ADD -> { // 添加
//显示警告红边
// CallerHmiManager.showWarning(direction)
//不显示弹框,语音提示,数据在消息盒子里面展示,此处不在处理弹框
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
- Log.d("MsgBox-PriObuNewMana1", "alertContent或ttsContent为空!")
+ return
}
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
- MsgBoxType.OBU,
+ MsgBoxType.V2X,
V2XMsg(
appId,
alertContent,
ttsContent
)
- )
+ ).apply {
+ sourceType = DataSourceType.OBU
+ }
)
CallerHmiManager.warningV2X(
appId,
@@ -437,7 +440,7 @@ class MogoPrivateObuNewManager private constructor() {
}
},
true,
- 3000L
+ 5000L
)
// 更新数据
@@ -451,10 +454,6 @@ class MogoPrivateObuNewManager private constructor() {
}
MogoObuConstants.STATUS.DELETE -> { // 删除
- // 关闭警告红边
-// CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
- // 移除顶部弹窗
-// CallerHmiManager.disableWarningV2X((appId + direction.direction))
// 更新数据
TrafficDataConvertUtilsNew.cvxRtiThreatIndInfo2TrafficData(data)
?.let {
@@ -467,7 +466,7 @@ class MogoPrivateObuNewManager private constructor() {
}
}
}
-
+// }
}
/**
@@ -483,106 +482,146 @@ class MogoPrivateObuNewManager private constructor() {
data: MogoObuRsmWarningData?
) {
super.onMogoObuRsmWarning(data)
- if (HmiBuildConfig.isShowObuV2iView) {
- if (HmiBuildConfig.isShowObuWeaknessTrafficView) {
+ CallerLogger.d(
+ "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
+ "onMogoObuRsmWarning ------> ${data.toString()}"
+ )
+// if (HmiBuildConfig.isShowObuV2iView) {
+ if (HmiBuildConfig.isShowObuWeaknessTrafficView) {
+ // 交通参与者类型 0x0:未知 UNKNOWN | 1机动车 2:非机动车 NON_MOTOR | 3:行人 PEDESTRIAN 4:obu
+ if (data != null && data.participant != null) {
+ var v2xType = ""
+ if (data.participant.ptcType == 1) { //机动车
+ v2xType =
+ EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.poiType
+ } else if (data.participant.ptcType == 2) { //非机动车
+ v2xType =
+ EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_NOT_MOTOR_VEHICLES.poiType
+ } else if (data.participant.ptcType == 3) { //行人
+ v2xType =
+ EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_PERSON.poiType
+ } else { //未知
+ v2xType = EventTypeEnumNew.TYPE_ERROR.poiType
+ }
+
+ val ttsContent = EventTypeEnumNew.getWarningTts(v2xType)
+ val alertContent =
+ EventTypeEnumNew.getWarningContent(v2xType)
+ var level = -1
+ val direction = getMessageDirection(data.participant.targetPosition)
+
+ //物体数据绘制
CallerLogger.d(
- "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
- "onMogoObuRsmWarning ------> ${data.toString()}"
- )
- // 交通参与者类型 0x0:未知 UNKNOWN | 1机动车 2:非机动车 NON_MOTOR | 3:行人 PEDESTRIAN 4:obu
- if (data != null && data.participant != null) {
- var v2xType = ""
- if (data.participant.ptcType == 1) { //机动车
- v2xType =
- EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.poiType
- } else if (data.participant.ptcType == 2) { //非机动车
- v2xType =
- EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_NOT_MOTOR_VEHICLES.poiType
- } else if (data.participant.ptcType == 3) { //行人
- v2xType =
- EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_PERSON.poiType
- } else { //未知
- v2xType = EventTypeEnumNew.TYPE_ERROR.poiType
+ "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "onMogoObuRsmWarning ---- data.status = ${data.status} ---data.participant.ptcId = ${data.participant.ptcId} ---data.participant.ptcType = ${data.participant.ptcType} ---data.warningMsg = ${data.warningMsg} -----data = ${data.toString()}")
+ when (data.status) {
+ MogoObuConstants.STATUS.ADD -> { // 添加
+ // 更新数据,模型变色的时候是不是update,如果不是更新,可能导致模型不变色,(add的时候,是否有level高的) TODO
+ TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data)
+ ?.let {
+ CallerMapUIServiceManager.getMarkerService()
+ ?.updateITrafficThreatLevelInfo(it)
+ }
}
- val ttsContent = EventTypeEnumNew.getWarningTts(v2xType)
- val alertContent =
- EventTypeEnumNew.getWarningContent(v2xType)
- var level = -1
- val direction = getMessageDirection(data.participant.targetPosition)
- if (data.warningMsg != null && data.warningMsg.warningData != null && data.warningMsg.warningData.size > 0) {
- level = data.warningMsg.warningData[0].warningLevel //默认是1个
- CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
- "new onMogoObuRsmWarning ---status---> ${data.status} ---data.warningMsg.warningData[0].status = ${data.warningMsg.warningData[0].status} ---v2xType = $v2xType ---alertContent = $alertContent ---ttsContent = $ttsContent "
- )
- when (data.warningMsg.warningData[0].status) {
- MogoObuConstants.STATUS.ADD -> { // 添加
-// if (level == 2 || level == 3) { //不考虑level
- //显示警告红边
- CallerHmiManager.showWarning(direction)
- if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
- Log.d("MsgBox-PriObuNewMana2", "alertContent或ttsContent为空!")
- }
- CallerMsgBoxManager.saveMsgBox(
- MsgBoxBean(
- MsgBoxType.OBU,
- V2XMsg(
- v2xType,
- alertContent,
- ttsContent
- )
- )
- )
- CallerHmiManager.warningV2X(
- v2xType,
- alertContent,
- ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒
- (v2xType + direction.direction),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的
- object : IMoGoWarningStatusListener {
- override fun onDismiss() {
- // 关闭警告红边
- CallerHmiManager.showWarning(
- WarningDirectionEnum.ALERT_WARNING_NON
- )
- }
- },
- true,
- 5000L
- )
-// }
+ MogoObuConstants.STATUS.UPDATE -> { // 更新
+ //处理删除逻辑,
+// if (rsmPtcIdMap.containsKey(data.participant.ptcId.toString())) {
+// var oldTime = rsmPtcIdMap[data.participant.ptcId.toString()]
+// var timeDiff = (System.currentTimeMillis() - oldTime!!) / 1000
+// if (timeDiff > 3) { //超过3秒,删除对应弱势交通元素
+// CallerMapUIServiceManager.getMarkerService()
+// ?.removeCvxRvInfoIndInfo(data.participant.ptcId.toString())
+// }
+// rsmPtcIdMap.remove(data.participant.ptcId.toString())
+// rsmPtcIdMap[data.participant.ptcId.toString()] = System.currentTimeMillis()
+// } else {
+// rsmPtcIdMap[data.participant.ptcId.toString()] = System.currentTimeMillis()
+// }
+ }
- // 更新数据
- TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data)?.let {
- CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "add cvxPtcThreatIndInfo2TrafficData ---it---> $it")
+ MogoObuConstants.STATUS.DELETE -> { // 删除
+ // 更新数据 TODO 删除原来的,改变颜色,删除marker。不影响别的模型添加
+ TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data)
+ ?.let {
+ // 事件结束,还原交通参与者颜色
+ it.threatLevel = 0x01
+ CallerMapUIServiceManager.getMarkerService()
+ ?.updateITrafficThreatLevelInfo(it)
+ }
+
+ //删除弱势交通元素
+ CallerMapUIServiceManager.getMarkerService()
+ ?.removeCvxRvInfoIndInfo(data.participant.ptcId.toString())
+ }
+ }
+
+ //预警status
+ if (data.warningMsg != null && data.warningMsg.warningData != null && data.warningMsg.warningData.size > 0) {
+ level = data.warningMsg.warningData[0].warningLevel //默认是1个
+ CallerLogger.d(
+ "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
+ "onMogoObuRsmWarning ---status---> ${data.status} ---data.warningMsg.warningData[0].status = ${data.warningMsg.warningData[0].status} ---v2xType = $v2xType ---alertContent = $alertContent ---ttsContent = $ttsContent ---level = $level"
+ )
+ when (data.warningMsg.warningData[0].status) {
+ MogoObuConstants.STATUS.ADD -> { // 添加
+ //更新模型的颜色
+ TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data)
+ ?.let {
CallerMapUIServiceManager.getMarkerService()
?.updateITrafficThreatLevelInfo(it)
}
- }
- MogoObuConstants.STATUS.UPDATE -> {// 更新
+ if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
+ return
}
+ //显示警告红边
+ CallerHmiManager.showWarning(direction)
+ CallerMsgBoxManager.saveMsgBox(
+ MsgBoxBean(
+ MsgBoxType.V2X,
+ V2XMsg(
+ v2xType,
+ alertContent,
+ ttsContent
+ )
+ ).apply {
+ sourceType = DataSourceType.OBU
+ }
+ )
- // 删除
- MogoObuConstants.STATUS.DELETE -> {
- // 关闭警告红边
- CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
- // 更新数据 TODO 删除原来的,改变颜色,删除marker。不影响别的模型添加
- TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data)
- ?.let {
- // 事件结束,还原交通参与者颜色
- it.threatLevel = 0x01
- CallerMapUIServiceManager.getMarkerService()
- ?.updateITrafficThreatLevelInfo(it)
+ CallerHmiManager.warningV2X(
+ v2xType,
+ alertContent,
+ ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒
+ (v2xType + direction.direction),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的
+ object : IMoGoWarningStatusListener {
+ override fun onDismiss() {
+ // 关闭警告红边
+ CallerHmiManager.showWarning(
+ WarningDirectionEnum.ALERT_WARNING_NON
+ )
}
+ },
+ true,
+ 5000L
+ )
+ }
- //删除弱势交通元素
- CallerMapUIServiceManager.getMarkerService()?.removeCvxRvInfoIndInfo(data.participant.ptcId.toString())
- }
+ MogoObuConstants.STATUS.UPDATE -> {// 更新
+ }
+
+ MogoObuConstants.STATUS.DELETE -> { // 删除
+ // 关闭警告红边
+ CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
+ //删除弱势交通元素
+ CallerMapUIServiceManager.getMarkerService()
+ ?.removeCvxRvInfoIndInfo(data.participant.ptcId.toString())
}
}
}
}
}
+// }
}
/**
@@ -590,16 +629,19 @@ class MogoPrivateObuNewManager private constructor() {
*/
override fun onMogoObuMapMath(data: MogoObuMapMathData?) {
super.onMogoObuMapMath(data)
- if(isShowObuLimitSpeedView) {
+// if (isShowObuLimitSpeedView) {
if (data != null) {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
- "onMogoObuMapMathstatus = ${data.status} --speedMaxLimit = ${Math.round((data.speedMaxLimit*3.6))}")
+ "onMogoObuMapMath = ${data.status} --speedMaxLimit = ${Math.round((data.speedMaxLimit * 3.6))}"
+ )
when (data.status) {
MogoObuConstants.STATUS.ADD -> { // 添加
UiThreadHandler.post {
- if(data.speedMaxLimit > 0) {
- CallerHmiManager.showLimitingVelocity(Math.round((data.speedMaxLimit*3.6)).toInt())
+ if (data.speedMaxLimit > 0) {
+// CallerHmiManager.showLimitingVelocity(
+// Math.round((data.speedMaxLimit * 3.6)).toInt(), 2)
+ CallObuLimitingSpeedListenerManager.invokeOnObuLimitingSpeedChange(Math.round((data.speedMaxLimit * 3.6)).toInt())
}
}
}
@@ -609,22 +651,23 @@ class MogoPrivateObuNewManager private constructor() {
MogoObuConstants.STATUS.DELETE -> { // 删除
UiThreadHandler.post {
- CallerHmiManager.disableLimitingVelocity()
+// CallerHmiManager.disableLimitingVelocity()
+ CallObuLimitingSpeedListenerManager.invokeOnObuLimitingSpeedChange(-1)
}
}
}
}
- }
+// }
}
}
- }
+}
/**
* 获取消息的方位 车辆相关
*/
private fun getMessageDirection(targetClassification: Int): WarningDirectionEnum {
-// CallerLogger.d("$M_OBU${TAG_MOGO_NEW_OBU}", "预警红边:预警方向->$targetClassification")
+ // CallerLogger.d("$M_OBU${TAG_MOGO_NEW_OBU}", "预警红边:预警方向->$targetClassification")
return when (targetClassification) {
MogoObuConstants.VEH_TARGET_POSITION.AHEAD_IN_LANE,
MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_IN_LANE -> WarningDirectionEnum.ALERT_WARNING_TOP //正前方
@@ -657,7 +700,7 @@ class MogoPrivateObuNewManager private constructor() {
/**
* 构造对应展示数据和场景 根据obu的场景,add change delete确定是否展示
*
- * @param appId 使用WarningTypeEnum获取icon、提示内容、tts内容
+ * @param appId 使用WarningTypeEnum获取icon、提示内容、tts内容 TODO 添加事件频繁播报拦截
*
* @see com.mogo.module.common.enums.EventTypeEnum
*/
@@ -669,56 +712,32 @@ class MogoPrivateObuNewManager private constructor() {
info: MogoObuRvWarningData
) {
// 这里排除需要特殊定制的语音及文案外,其余的都可以使用 EventTypeEnumNew 提供的
- CallerLogger.d(
- "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
- "handleSdkObu appId = $appId --- handleDirection = $direction ---level = $level ---status = $status"
- )
-
- var alertContent: String
- var ttsContent: String
+ var alertContent: String = ""
+ var ttsContent: String = ""
var changeVisualAngle = false
when (appId) {
- // 变道预警,注意左后车辆/注意右后车辆
- EventTypeEnumNew.TYPE_USECASE_ID_LCW.poiType -> {
- alertContent = EventTypeEnumNew.getWarningContent(appId)
- ttsContent = EventTypeEnumNew.getWarningTts(appId)
- if (
- direction == WarningDirectionEnum.ALERT_WARNING_LEFT ||
- direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT ||
- direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT
- ) {
- ttsContent = String.format(ttsContent, "左")
- alertContent = String.format(alertContent, "左")
- } else if (
- direction == WarningDirectionEnum.ALERT_WARNING_RIGHT ||
- direction == WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT ||
- direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT
- ) {
- ttsContent = String.format(ttsContent, "右")
- alertContent = String.format(alertContent, "右")
- }
+ //交叉路口碰撞预警
+ MogoObuConstants.V2X_WARNING_TYPE.FCW.toString() -> {
+ alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_FCW.poiType)
+ ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_FCW.poiType)
}
- //车辆失控预警
- EventTypeEnumNew.TYPE_USECASE_ID_CLW.poiType -> {
- alertContent = EventTypeEnumNew.getWarningContent(appId)
- ttsContent = EventTypeEnumNew.getWarningTts(appId)
- alertContent = String.format(alertContent, direction.desc)
- ttsContent = String.format(ttsContent, direction.desc)
+ //交叉路口碰撞预警
+ MogoObuConstants.V2X_WARNING_TYPE.ICW.toString() -> {
+ alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType)
+ ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType)
}
- //异常车辆提醒
- EventTypeEnumNew.TYPE_USECASE_ID_AVW.poiType -> {
- alertContent = EventTypeEnumNew.getWarningContent(appId)
- ttsContent = EventTypeEnumNew.getWarningTts(appId)
- alertContent = String.format(alertContent, direction.desc)
- ttsContent = String.format(ttsContent, direction.desc)
+ //左转辅助预警
+ MogoObuConstants.V2X_WARNING_TYPE.LTA.toString() -> {
+ alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_LTA.poiType)
+ ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_LTA.poiType)
}
//盲区预警
- EventTypeEnumNew.TYPE_USECASE_ID_BSW.poiType -> {
- ttsContent = EventTypeEnumNew.getWarningTts(appId)
- alertContent = EventTypeEnumNew.getWarningContent(appId)
+ MogoObuConstants.V2X_WARNING_TYPE.BSW.toString() -> {
+ ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_BSW.poiType)
+ alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_BSW.poiType)
if (
direction == WarningDirectionEnum.ALERT_WARNING_LEFT ||
direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT ||
@@ -737,10 +756,65 @@ class MogoPrivateObuNewManager private constructor() {
alertContent = String.format(alertContent, "右")
}
}
+
+ // 变道预警,注意左后车辆/注意右后车辆
+ MogoObuConstants.V2X_WARNING_TYPE.LCW.toString() -> {
+ alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_LCW.poiType)
+ ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_LCW.poiType)
+ if (
+ direction == WarningDirectionEnum.ALERT_WARNING_LEFT ||
+ direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT ||
+ direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT
+ ) {
+ ttsContent = String.format(ttsContent, "左")
+ alertContent = String.format(alertContent, "左")
+ } else if (
+ direction == WarningDirectionEnum.ALERT_WARNING_RIGHT ||
+ direction == WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT ||
+ direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT
+ ) {
+ ttsContent = String.format(ttsContent, "右")
+ alertContent = String.format(alertContent, "右")
+ }
+ }
+
+ //逆向超车预警
+ MogoObuConstants.V2X_WARNING_TYPE.DNPW.toString() -> {
+ alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_DNPW.poiType)
+ ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_DNPW.poiType)
+ }
+
+ //紧急制动预警
+ MogoObuConstants.V2X_WARNING_TYPE.EBW.toString() -> {
+ alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_EBW.poiType)
+ ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_EBW.poiType)
+ }
+
+ //异常车辆提醒
+ MogoObuConstants.V2X_WARNING_TYPE.AVW.toString() -> {
+ alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_AVW.poiType)
+ ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_AVW.poiType)
+ alertContent = String.format(alertContent, direction.desc)
+ ttsContent = String.format(ttsContent, direction.desc)
+ }
+
+ //车辆失控预警
+ MogoObuConstants.V2X_WARNING_TYPE.CLW.toString() -> {
+ alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_CLW.poiType)
+ ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_CLW.poiType)
+ alertContent = String.format(alertContent, direction.desc)
+ ttsContent = String.format(ttsContent, direction.desc)
+ }
+ //车辆失控预警
+ MogoObuConstants.V2X_WARNING_TYPE.EVW.toString() -> {
+ alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_EVW.poiType)
+ ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_EVW.poiType)
+ }
+
// 这里处理固定的提示信息,包括了<紧急车辆提醒>
- else -> {
- ttsContent = EventTypeEnumNew.getWarningTts(appId)
- alertContent = EventTypeEnumNew.getWarningContent(appId)
+ else -> { //TODO
+// ttsContent = EventTypeEnumNew.getWarningTts(appId.toString())
+// alertContent = EventTypeEnumNew.getWarningContent(appId.toString())
}
}
@@ -753,19 +827,18 @@ class MogoPrivateObuNewManager private constructor() {
"new handleSdkObu appId2 = $appId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction"
)
if (level == 2 || level == 3) {
- if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
- Log.d("MsgBox-PriObuNewManager2", "alertContent或ttsContent为空!")
- }
//不显示弹框,其它保留
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
- MsgBoxType.OBU,
+ MsgBoxType.V2X,
V2XMsg(
appId,
alertContent,
ttsContent
)
- )
+ ).apply {
+ sourceType = DataSourceType.OBU
+ }
)
CallerHmiManager.warningV2X(
appId,
@@ -789,7 +862,7 @@ class MogoPrivateObuNewManager private constructor() {
}
},
true,
- 3000L
+ 5000L
)
//显示警告红边
CallerHmiManager.showWarning(direction)
@@ -805,7 +878,7 @@ class MogoPrivateObuNewManager private constructor() {
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
// 移除顶部弹窗
- // CallerHmiManager.disableWarningV2X((appId + direction.direction))
+ // CallerHmiManager.disableWarningV2X((appId + direction.direction))
//更新周边车辆进行预警颜色变换,车辆实时移动和变色
TrafficDataConvertUtilsNew.cvxV2vThreatIndInfo2TrafficData(info)?.let {
it.threatLevel = 0x01
@@ -829,7 +902,9 @@ class MogoPrivateObuNewManager private constructor() {
MogoObuConstants.STATUS.ADD,
MogoObuConstants.STATUS.UPDATE
-> {
- changeTrafficLightStatus(appId, lights)
+ if (lights != null && lights.isNotEmpty()) {
+ changeTrafficLightStatus(appId, lights)
+ }
}
// 删除
MogoObuConstants.STATUS.DELETE -> {
@@ -838,15 +913,25 @@ class MogoPrivateObuNewManager private constructor() {
CallerHmiManager.disableWarningV2X(appId.toString())
isShowGreenWave = false
isShowRunRedLight = false
+ isYellowLight = false
+// lightCountDownRed = 1
+// lightCountDownGreen = 1
+// lightCountDownYellow = 1
}
}
}
private var isRedLight = false
private var isGreenLight = false
+ private var isYellowLight = false
private var isShowGreenWave = false
private var isShowRunRedLight = false
+// private var lightCountDownRed : Int = 1
+// private var lightCountDownGreen : Int = 1
+// private var lightCountDownYellow : Int = 1
+
+
/**
* 修改红绿灯
*/
@@ -861,63 +946,93 @@ class MogoPrivateObuNewManager private constructor() {
val currentLight = lights[0]
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
- "currentLight = $currentLight ---currentLight.phase = ${currentLight.phaseId} ---appId = $appId"
+ "changeTrafficLightStatus currentLight = $currentLight ----currentLight.light = ${currentLight.light} ---currentLight.phase = ${currentLight.phaseId} ---appId = $appId --countDown = ${currentLight.countDown.toInt()}"
)
// 闯红灯预警,绿波通行和闯红灯是互斥的
when (appId) {
- 0x0 -> {//不可用 V2I_RLVW_VIOLATION_TYPE_UNAVAILABLE 无效
+ 0 -> {//不可用 V2I_RLVW_VIOLATION_TYPE_UNAVAILABLE 无效
}
- 0x1 -> {//闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT 一个红灯周期只显示一次
+ 1 -> {//闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT 一个红灯周期只显示一次
if (!isShowRunRedLight) {
isShowRunRedLight = true
- CallerHmiManager.disableWarningV2X(0x2.toString())
- CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}","changeTrafficLightStatus 闯红灯 --------> ")
- ttsContent = EventTypeEnumNew.getWarningTts(appId.toString())
- alertContent = EventTypeEnumNew.getWarningContent(appId.toString())
+ CallerHmiManager.disableWarningV2X(1667.toString())
+ CallerLogger.d(
+ "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
+ "changeTrafficLightStatus 闯红灯 --------> "
+ )
+ ttsContent =
+ EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType)
+ alertContent =
+ EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType)
+ CallerMsgBoxManager.saveMsgBox(
+ MsgBoxBean(
+ MsgBoxType.V2X,
+ V2XMsg(
+ EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType,
+ alertContent,
+ ttsContent
+ )
+ ).apply {
+ sourceType = DataSourceType.OBU
+ }
+ )
+
CallerHmiManager.warningV2X(
- appId.toString(), alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒
- appId.toString(), null, true, 5000L)
+ EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType,
+ alertContent,
+ ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒
+ EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType,
+ null,
+ true,
+ 5000L
+ )
}
}
- 0x2 -> { //绿波通行引导 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION 一个绿灯周期只显示一次 100m的时候
+ 2 -> { //绿波通行引导 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION 一个绿灯周期只显示一次 100m的时候
if (!isShowGreenWave) {
isShowGreenWave = true
- CallerHmiManager.disableWarningV2X(0x1.toString())
- CallerLogger.d(
- "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
- "new changeTrafficLightStatus speed_min = ${currentLight.suggestMinSpeed} --speed_max = ${currentLight.suggestMaxSpeed} --TYPE_USECASE_ID_IVP_GREEN ---alertContent = $alertContent ---ttsContent = $ttsContent"
- )
- val adviceSpeed =
- "${currentLight.suggestMinSpeed} - ${currentLight.suggestMaxSpeed}"
- val adviceSpeedTts =
- "${currentLight.suggestMinSpeed}到${currentLight.suggestMaxSpeed}"
+ CallerHmiManager.disableWarningV2X(1666.toString())
+
+ var minSpeedTemp = Math.round(currentLight.suggestMinSpeed*3.6)
+ var maxSpeedTemp = Math.round(currentLight.suggestMaxSpeed*3.6)
+ if (minSpeedTemp == maxSpeedTemp) {
+ minSpeedTemp -= 5
+ }
+
+ val adviceSpeed = "$minSpeedTemp - $maxSpeedTemp"
+ val adviceSpeedTts = "$minSpeedTemp 到 $maxSpeedTemp"
+
+// val adviceSpeed =
+// "${Math.round(currentLight.suggestMinSpeed*3.6)} - ${Math.round(currentLight.suggestMaxSpeed*3.6)}"
+// val adviceSpeedTts =
+// "${Math.round(currentLight.suggestMinSpeed*3.6)} 到 ${Math.round(currentLight.suggestMaxSpeed*3.6)}"
+
ttsContent =
String.format(
- EventTypeEnumNew.getWarningTts(appId.toString()),
+ EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType),
adviceSpeedTts
)
alertContent =
String.format(
- EventTypeEnumNew.getWarningContent(appId.toString()),
+ EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType),
adviceSpeed
)
val maxSpeed = currentLight.suggestMaxSpeed
if (maxSpeed > 0) {
- if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
- Log.d("MsgBox-PriObuNewManager1", "alertContent或ttsContent为空!")
- }
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
- MsgBoxType.OBU,
+ MsgBoxType.V2X,
V2XMsg(
EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType,
alertContent,
ttsContent
)
- )
+ ).apply {
+ sourceType = DataSourceType.OBU
+ }
)
CallerHmiManager.warningV2X(
@@ -937,7 +1052,7 @@ class MogoPrivateObuNewManager private constructor() {
when (currentLight.light) {
// 灯光不可用
0 -> {
- CallerHmiManager.showWarningTrafficLight(0, 2)
+ CallerObuTrafficLightListenerManager.invokeObuTrafficLight(0)
}
// 红灯
2, 3 -> {
@@ -946,8 +1061,8 @@ class MogoPrivateObuNewManager private constructor() {
isRedLight = true
}
isGreenLight = false
- CallerHmiManager.showWarningTrafficLight(1, 2)
-
+ isYellowLight = false
+ CallerObuTrafficLightListenerManager.invokeObuTrafficLight(1)
val red = currentLight.countDown.toInt()
CallerHmiManager.changeCountdownRed(red)
}
@@ -959,17 +1074,23 @@ class MogoPrivateObuNewManager private constructor() {
isGreenLight = true
}
isRedLight = false
- CallerHmiManager.showWarningTrafficLight(3, 2)
+ isYellowLight = false
+ CallerObuTrafficLightListenerManager.invokeObuTrafficLight(3)
val green = currentLight.countDown.toInt()
CallerHmiManager.changeCountdownGreen(green)
}
// 黄灯
7, 8 -> {
+ if (!isYellowLight) {
+ isYellowLight = true
+ }
+ isRedLight = false
+ isGreenLight = false
CallerHmiManager.disableWarningV2X(appId.toString())
- CallerHmiManager.showWarningTrafficLight(2, 2)
+ CallerObuTrafficLightListenerManager.invokeObuTrafficLight(2)
val yellow = currentLight.countDown.toInt()
CallerHmiManager.changeCountdownYellow(yellow)
}
}
- }
+ }
diff --git a/core/function-impl/mogo-core-function-v2x/build.gradle b/core/function-impl/mogo-core-function-v2x/build.gradle
index 5884122465..299bfe9cbf 100644
--- a/core/function-impl/mogo-core-function-v2x/build.gradle
+++ b/core/function-impl/mogo-core-function-v2x/build.gradle
@@ -4,6 +4,7 @@ plugins {
id 'kotlin-android-extensions'
id 'kotlin-kapt'
id 'com.alibaba.arouter'
+ id 'com.google.protobuf'
}
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
@@ -35,6 +36,19 @@ android {
targetCompatibility JavaVersion.VERSION_1_8
}
+ protobuf {
+ protoc {
+ artifact = rootProject.ext.dependencies.protoc
+ }
+ generateProtoTasks {
+ all().each { task ->
+ task.builtins {
+ java {}
+ }
+ }
+ }
+ }
+
}
dependencies {
@@ -50,15 +64,18 @@ dependencies {
implementation rootProject.ext.dependencies.rxandroid
implementation rootProject.ext.dependencies.flexbox
kapt rootProject.ext.dependencies.aroutercompiler
- implementation rootProject.ext.dependencies.mogo_v2x
+ implementation rootProject.ext.dependencies.protobuf_java
+ implementation rootProject.ext.dependencies.protobuf_java_util
implementation rootProject.ext.dependencies.mogoaicloudtrafficlive
+
if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
implementation rootProject.ext.dependencies.mogocommons
implementation rootProject.ext.dependencies.mogo_core_data
implementation rootProject.ext.dependencies.mogo_core_utils
implementation rootProject.ext.dependencies.mogo_core_function_call
implementation rootProject.ext.dependencies.mogo_core_res
+ compileOnly rootProject.ext.dependencies.mogomap
} else {
implementation project(":foudations:mogo-commons")
implementation project(':core:mogo-core-data')
@@ -66,7 +83,7 @@ dependencies {
implementation project(':core:mogo-core-function-call')
implementation project(':core:mogo-core-res')
implementation project(':libraries:mogo-adas')
-
+ compileOnly project(':libraries:mogo-map')
}
}
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/V2XProvider.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/V2XProvider.kt
index 7979889dea..214567d3fa 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/V2XProvider.kt
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/V2XProvider.kt
@@ -4,12 +4,12 @@ import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.constants.MogoServicePaths.PATH_V2X_MODULE
-import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider
+import com.mogo.eagle.core.function.api.v2x.IV2XEventProvider
import com.mogo.eagle.core.function.v2x.events.V2XEventManager
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
@Route(path = PATH_V2X_MODULE)
-class V2XProvider : IMoGoFunctionServerProvider {
+class V2XProvider : IV2XEventProvider {
override val functionName: String
get() = "V2XProvider"
@@ -22,6 +22,10 @@ class V2XProvider : IMoGoFunctionServerProvider {
}
}
+ override fun queryWholeRoadEvents() {
+ V2XEventManager.queryWholeRoadEvents()
+ }
+
override fun onDestroy() {
if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
//不处理
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt
index fb67376fdf..dbb4bdd0a6 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt
@@ -1,91 +1,83 @@
package com.mogo.eagle.core.function.v2x.events
-import android.content.Context
-import android.content.Intent
-import android.os.Handler
-import android.os.Looper
-import android.util.Log
-import androidx.core.util.Pair
-import androidx.localbroadcastmanager.content.LocalBroadcastManager
-import com.mogo.cloud.commons.utils.CoordinateUtils
-import com.mogo.cloud.passport.IMoGoTokenCallback
-import com.mogo.cloud.passport.MoGoAiCloudClient
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig
+import android.content.*
+import android.os.*
+import android.util.*
+import androidx.localbroadcastmanager.content.*
+import com.mogo.cloud.passport.*
+import com.mogo.commons.constants.HostConst
import com.mogo.commons.module.ServiceConst.CARD_TYPE_ROAD_CONDITION
-import com.mogo.commons.network.ParamsUtil
+import com.mogo.eagle.core.data.enums.EventTypeEnumNew
+import com.mogo.eagle.core.data.enums.EventTypeHelper
+import com.mogo.commons.network.*
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_V2N
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_CLOUD
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CLOUD_V2N
-import com.mogo.eagle.core.data.enums.EventTypeEnum
-import com.mogo.eagle.core.data.enums.EventTypeHelper
-import com.mogo.eagle.core.data.enums.TrafficTypeEnum
-import com.mogo.eagle.core.data.map.MogoLatLng
-import com.mogo.eagle.core.data.map.MogoLocation
+import com.mogo.eagle.core.data.enums.*
+import com.mogo.eagle.core.data.map.*
import com.mogo.eagle.core.data.map.entity.MarkerExploreWay
import com.mogo.eagle.core.data.map.entity.MarkerShowEntity
import com.mogo.eagle.core.data.map.entity.V2XMessageEntity
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity
+import com.mogo.eagle.core.data.msgbox.DataSourceType
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.V2XMsg
-import com.mogo.eagle.core.data.traffic.TrafficData
-import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
-import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener
-import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
-import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
-import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
-import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager
+import com.mogo.eagle.core.data.traffic.*
+import com.mogo.eagle.core.function.api.hmi.warning.*
+import com.mogo.eagle.core.function.api.map.listener.*
+import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
+import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager
+import com.mogo.eagle.core.function.call.hmi.*
+import com.mogo.eagle.core.function.call.map.*
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.Default
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.TooClose
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
-import com.mogo.eagle.core.function.v2x.events.alarm.V2XAlarmServer
-import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi
+import com.mogo.eagle.core.function.v2x.events.alarm.*
+import com.mogo.eagle.core.function.v2x.events.bridge.*
import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi.context
-import com.mogo.eagle.core.function.v2x.events.consts.V2XConst
-import com.mogo.eagle.core.function.v2x.events.consts.V2XConst.BROADCAST_SCENE_EXTRA_KEY
-import com.mogo.eagle.core.function.v2x.events.consts.V2XConst.BROADCAST_SCENE_HANDLER_ACTION
-import com.mogo.eagle.core.function.v2x.events.manager.V2XStatusManager
-import com.mogo.eagle.core.function.v2x.events.observer.V2XOptimalRouteObserver
-import com.mogo.eagle.core.function.v2x.events.receiver.SceneBroadcastReceiver
-import com.mogo.eagle.core.function.v2x.events.scenario.impl.V2XScenarioManager
-import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.AiRoadMarker
-import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.AiRoadMarker.Marker
+import com.mogo.eagle.core.function.v2x.events.consts.*
+import com.mogo.eagle.core.function.v2x.events.consts.V2XConst.*
+import com.mogo.eagle.core.function.v2x.events.manager.*
+import com.mogo.eagle.core.function.v2x.events.observer.*
+import com.mogo.eagle.core.function.v2x.events.receiver.*
+import com.mogo.eagle.core.function.v2x.events.scenario.impl.*
+import com.mogo.eagle.core.function.v2x.events.utils.*
import com.mogo.eagle.core.function.v2x.events.utils.MapUtils
-import com.mogo.eagle.core.function.v2x.events.utils.TrackUtils
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
-import com.mogo.eagle.core.utilcode.mogo.logger.Logger
+import com.mogo.eagle.core.function.v2x.internal.V2XManager
+import com.mogo.eagle.core.function.v2x.internal.callback.IV2XCallback
+import com.mogo.eagle.core.function.v2x.internal.config.V2XConfig
+import com.mogo.eagle.core.function.v2x.internal.data.V2XAdvanceWarning
+import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerCardResult
+import com.mogo.eagle.core.function.v2x.internal.data.V2XOptimalRoute
+import com.mogo.eagle.core.function.v2x.internal.data.V2XWarningTarget
+import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent
+import com.mogo.eagle.core.function.v2x.road.V2XEventServiceApi
+import com.mogo.eagle.core.network.MoGoRetrofitFactory
+import com.mogo.eagle.core.network.utils.*
+import com.mogo.eagle.core.utilcode.mogo.logger.*
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X
-import com.mogo.eagle.core.utilcode.util.ThreadUtils
+import com.mogo.eagle.core.utilcode.util.*
import com.mogo.eagle.core.utilcode.util.Utils
-import com.mogo.map.marker.IMogoMarker
-import com.mogo.map.marker.IMogoMarkerClickListener
+import com.mogo.map.marker.*
import com.mogo.map.marker.MogoMarkersHandler.Companion.mogoMarkersHandler
-import com.mogo.v2x.V2XManager
-import com.mogo.v2x.callback.IV2XCallback
-import com.mogo.v2x.config.V2XConfig
-import com.mogo.v2x.data.*
-import com.mogo.v2x.event.V2XEvent
-import com.shuyu.gsyvideoplayer.GSYVideoManager
-import com.shuyu.gsyvideoplayer.cache.CacheFactory
-import com.shuyu.gsyvideoplayer.cache.ProxyCacheManager
-import com.shuyu.gsyvideoplayer.model.VideoOptionModel
-import com.shuyu.gsyvideoplayer.player.IjkPlayerManager
-import com.shuyu.gsyvideoplayer.player.PlayerFactory
-import com.shuyu.gsyvideoplayer.utils.GSYVideoType
-import com.zhjt.service.chain.ChainLog
-import com.zhjt.service.chain.TracingConstants
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.android.asCoroutineDispatcher
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.launch
-import roadwork.Road.RW_PB
-import tv.danmaku.ijk.media.player.IjkMediaPlayer
-import java.util.concurrent.TimeUnit
-import java.util.concurrent.atomic.AtomicBoolean
+import com.shuyu.gsyvideoplayer.*
+import com.shuyu.gsyvideoplayer.cache.*
+import com.shuyu.gsyvideoplayer.model.*
+import com.shuyu.gsyvideoplayer.player.*
+import com.shuyu.gsyvideoplayer.utils.*
+import com.zhjt.service.chain.*
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.Disposable
+import io.reactivex.schedulers.Schedulers
+import kotlinx.coroutines.*
+import kotlinx.coroutines.android.*
+import tv.danmaku.ijk.media.player.*
+import java.util.concurrent.*
+import java.util.concurrent.atomic.*
-object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallback{
+object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallback {
private const val TAG = "V2XEventManager"
@@ -95,15 +87,19 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
private val hasInit by lazy { AtomicBoolean(false) }
+ // 记录历史行驶轨迹,用于车行驶方向计算,只保留两个数据
+ private val historyPath = arrayOfNulls(2)
+
+ var v2xEventDisposable: Disposable? = null
+
fun init(context: Context) {
BridgeApi.init(context)
if (hasInit.compareAndSet(false, true)) {
if (!V2XManager.hasInit()) {
- AiRoadMarker.init(context)
V2XManager.init(V2XConfig.Builder().also {
it.aiCloudConfig(MoGoAiCloudClientConfig.getInstance())
it.context(context)
- it.loggable(false)
+ it.loggable(true)
it.distanceForTriggerRefresh(200f) //行驶超过200(包含)米,刷新道路周边信息(短链请求)
it.durationForTriggerRefresh(
60,
@@ -114,11 +110,9 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
}.build())
V2XManager.start()
}
-
registerListener()
V2XManager.forceRefresh()
MoGoAiCloudClient.getInstance().addTokenCallbacks(this)
-
// 注册广播接收场景弹窗使用的
SceneBroadcastReceiver.register(context)
}
@@ -139,6 +133,7 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
private fun unRegisterListener() {
V2XManager.removeCallback(this)
CallerMapLocationListenerManager.removeListener(TAG, false)
+
mogoMarkersHandler.unregisterMarkerClickListener(CARD_TYPE_ROAD_CONDITION)
}
@@ -199,6 +194,18 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
return null
}
+ /**
+ * 刷新自车求助状态
+ *
+ * @param isTrue
+ */
+ private fun refreshMeSeekHelp(isTrue: Boolean) {
+ val entity = V2XMessageEntity()
+ entity.type = V2XMessageEntity.V2XTypeEnum.ALERT_CAR_FOR_HELP
+ entity.content = isTrue
+ V2XScenarioManager.getInstance().handlerMessage(entity)
+ }
+
override fun onLocationChanged(location: MogoLocation?, from: Int, isGps: Boolean) {
location ?: return
BridgeApi.location.set(location)
@@ -239,13 +246,16 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
)
if (v2XRoadEventEntity != null) {
val distance = v2XRoadEventEntity.distance
- val min = if (EventTypeEnum.AI_ROAD_WORK.poiType == v2XRoadEventEntity.poiType) 0 else 5
- Logger.d(
- TAG,
+ val min = if (EventTypeEnumNew.isCloudSocketEvent(v2XRoadEventEntity.poiType)) 0 else 5
+ CallerLogger.d(
+ "$M_V2X$TAG",
"--- trigger show before ---:data=>[${location.longitude}, ${location.latitude}, ${location.speed}], distance: $distance, minDistance: $min, poiType: ${v2XRoadEventEntity.poiType}"
)
if (distance >= min) {
- Logger.d(TAG, "--- trigger show ---:poiType:" + v2XRoadEventEntity.poiType)
+ CallerLogger.d(
+ "$M_V2X$TAG",
+ "--- trigger show ---:poiType:" + v2XRoadEventEntity.poiType
+ )
TrackUtils.trackV2xRoadProduceEvent(1)
val v2XMessageEntity = V2XMessageEntity()
v2XMessageEntity.type = V2XMessageEntity.V2XTypeEnum.ALERT_ROAD_WARNING
@@ -294,55 +304,19 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
handleWarningTargetEvent(event.data)
}
is V2XEvent.RoadAI -> {
- handleRoadMarkerEvent(event.data.toRoadMarker)
+ /*
+ TODO zhongchao 先注掉,编译通过
+ if(FunctionBuildConfig.isV2NFromCar){
+ return
+ }*/
+ handleRoadMarkerEvent(event.data.toRoadMarker())
+ }
+
+ is V2XEvent.RoadEventX -> {
+ handleRoadMarkerEvent(event.data.toRoadMarker())
}
}
}
-
- private val RW_PB.toRoadMarker: V2XMarkerCardResult
- get() = V2XMarkerCardResult().also { l1 ->
- this.roadwork?.polygonList?.takeIf { it.isNotEmpty() }?.also { old ->
- l1.extras = HashMap>>().also { extra ->
- extra["polygon"] = old.map { d ->
- Pair(d.lon, d.lat)
- }
-
- extra["gps_location"] = listOf(
- Pair(
- this.roadwork?.center?.point?.lon ?: 0.0,
- this.roadwork?.center?.point?.lat ?: 0.0
- )
- )
- }
- }
- l1.exploreWay = ArrayList().also { l2 ->
- l2.add(V2XMarkerExploreWay().also { l3 ->
- l3.poiType = this.roadwork?.poiType?.toString()
- l3.generateTime = this.roadwork?.detectTime ?: 0L
- l3.location = V2XMarkerLocation().also { l4 ->
- val p = CoordinateUtils.transformWgsToGcj(
- this.roadwork?.center?.point?.lat ?: 0.0,
- this.roadwork?.center?.point?.lon ?: 0.0
- )
- l4.lon = p[0]
- l4.lat = p[1]
- l4.angle = this.roadwork?.center?.road?.bearing?.toDouble() ?: 0.0
- }
- })
- }
-
- AiRoadMarker.receive(
- Marker(
- this.roadwork?.center?.point?.lat ?: 0.0,
- this.roadwork?.center?.point?.lon ?: 0.0,
- this.roadwork?.center?.road?.bearing?.toDouble() ?: 0.0,
- null,
- null,
- null
- )
- )
- }
-
private fun handleWarningTargetEvent(data: V2XWarningTarget) {
val v2xMessageEntity = V2XMessageEntity()
v2xMessageEntity.type = V2XMessageEntity.V2XTypeEnum.ALERT_THE_FRONT_WEAKNESS
@@ -403,32 +377,34 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
}
1003 -> {
// 交叉路口碰撞预警
+ /*
+ TODO xiaopeng 先注掉,编译通过
changeVisualAngle = true
- tempAppId = EventTypeEnum.TYPE_USECASE_ID_ICW.poiType.toInt()
- tempTts = EventTypeEnum.TYPE_USECASE_ID_ICW.tts
- tempContent = EventTypeEnum.TYPE_USECASE_ID_ICW.content
+ tempAppId = EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType.toInt()
+ tempTts = EventTypeEnumNew.TYPE_USECASE_ID_ICW.tts
+ tempContent = EventTypeEnumNew.TYPE_USECASE_ID_ICW.content*/
}
1004 -> {
// 交叉路口碰撞预警
changeVisualAngle = true
- tempAppId = EventTypeEnum.TYPE_USECASE_ID_BSW.poiType.toInt()
+ tempAppId = EventTypeEnumNew.TYPE_USECASE_ID_BSW.poiType.toInt()
tempTts = String.format(
- EventTypeEnum.TYPE_USECASE_ID_BSW.tts,
+ EventTypeEnumNew.TYPE_USECASE_ID_BSW.tts,
getWarningDirection()
)
- tempContent = EventTypeEnum.TYPE_USECASE_ID_BSW.content
+ tempContent = EventTypeEnumNew.TYPE_USECASE_ID_BSW.content
}
1006 -> {
// 逆向超车预警
- tempAppId = EventTypeEnum.TYPE_USECASE_ID_DNPW.poiType.toInt()
- tempTts = EventTypeEnum.TYPE_USECASE_ID_DNPW.tts
- tempContent = EventTypeEnum.TYPE_USECASE_ID_DNPW.content
+ tempAppId = EventTypeEnumNew.TYPE_USECASE_ID_DNPW.poiType.toInt()
+ tempTts = EventTypeEnumNew.TYPE_USECASE_ID_DNPW.tts
+ tempContent = EventTypeEnumNew.TYPE_USECASE_ID_DNPW.content
}
1005 -> {
// 闯红灯预警
- tempAppId = EventTypeEnum.TYPE_USECASE_ID_IVP.poiType.toInt()
- tempTts = EventTypeEnum.TYPE_USECASE_ID_IVP.tts
- tempContent = EventTypeEnum.TYPE_USECASE_ID_IVP.content
+ tempAppId = EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType.toInt()
+ tempTts = EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.tts
+ tempContent = EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.content
}
2001 -> {
// 最优车道100061
@@ -521,6 +497,63 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
}
}
+ fun queryWholeRoadEvents() {
+ if (v2xEventDisposable != null && !v2xEventDisposable!!.isDisposed) {
+ v2xEventDisposable!!.dispose()
+ }
+ val sn = MoGoAiCloudClientConfig.getInstance().sn
+ val lineId = getLineId()
+ if (lineId > 0) {
+ realQueryV2xEvents(lineId.toString(), sn)
+ } else {
+ UiThreadHandler.postDelayed({
+ realQueryV2xEvents(getLineId().toString(), sn)
+ }, 500)
+ }
+ }
+
+ private fun realQueryV2xEvents(lineId: String, sn: String) {
+ v2xEventDisposable = MoGoRetrofitFactory.getInstance(HostConst.getHost())
+ .create(V2XEventServiceApi::class.java)
+ .queryAllV2XEventsByLineId(lineId, sn)
+ .map {
+ if (it.code == 200 || it.code == 0) {
+ CallerLogger.d(M_V2X + TAG, "请求成功,size为:${it.result?.v2XEventList?.size}")
+ return@map it.result?.v2XEventList
+ } else {
+ CallerLogger.d(M_V2X + TAG, "请求失败,code为:${it.code}")
+ return@map ArrayList()
+ }
+ }
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe {
+ val size = it?.size ?: 0
+ if (size > 0) {
+ val msgBoxBean = MsgBoxBean(MsgBoxType.V2X, V2XMsg("", "查询到当前全程共${size}个事件", ""))
+ msgBoxBean.sourceType = DataSourceType.SUMMARY
+ CallerMsgBoxManager.saveMsgBox(msgBoxBean)
+ }
+ }
+ }
+
+ private fun getLineId(): Long {
+ var lineId: Long = -1
+ val parameter = CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo()
+ .autopilotControlParameters
+ if (parameter != null) {
+ if (parameter.autoPilotLine != null) {
+ lineId = parameter.autoPilotLine!!.lineId
+ CallerLogger.d(M_V2X + TAG, "lineId为:$lineId")
+ } else {
+ CallerLogger.d(M_V2X + TAG, "parameter.autoPilotLine为null")
+ }
+ } else {
+ CallerLogger.d(M_V2X + TAG, "parameter为null")
+ }
+ return lineId
+ }
+
override fun onFail(msg: String) {
CallerLogger.e("$M_V2X$TAG", "Error: $msg")
}
@@ -538,4 +571,5 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
}
}
}
+
}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java
index 70a82ab838..0c09db8c20 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java
@@ -9,6 +9,7 @@ import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
import io.netty.util.internal.ConcurrentSet;
+import android.util.Log;
/**
* @author donghongyu
@@ -33,6 +34,7 @@ public class V2XAlarmServer {
CopyOnWriteArrayList v2XRoadEventEntityList,
MogoLocation currentLocation) {
try {
+ Log.d("RWJ", "getDriveFrontAlarmEvent --- 1 ---" + currentLocation );
if (!showedEvents.isEmpty()) {
Iterator iterator = showedEvents.iterator();
while (iterator.hasNext()) {
@@ -49,15 +51,18 @@ public class V2XAlarmServer {
}
}
}
+ Log.d("RWJ", "getDriveFrontAlarmEvent --- 2 ---" + currentLocation);
if (currentLocation != null && v2XRoadEventEntityList != null) {
// 因为集合是按照距离排序后的所以这里检索出来第一个就发出警告
for (V2XRoadEventEntity v2XRoadEventEntity : v2XRoadEventEntityList) {
// 0、道路事件必须有朝向,角度>=0;
+ Log.d("RWJ", "entity:" + v2XRoadEventEntity.getLocation());
if (v2XRoadEventEntity.getLocation().getAngle() >= 0) {
// 计算车辆距离指定气泡的距离
MarkerLocation eventLocation = v2XRoadEventEntity.getLocation();
// 1、判断是否到达了触发距离,20 ~ 500,
double distance = v2XRoadEventEntity.getDistance();
+ Log.d("RWJ", "distance:" + distance);
if (distance <= 500) {
if (EventTypeEnum.GHOST_PROBE.getPoiType().equals(v2XRoadEventEntity.getPoiType())) {
if (distance > 25) {
@@ -68,7 +73,8 @@ public class V2XAlarmServer {
double carBearing = currentLocation.getBearing();
double eventBearing = eventLocation.getAngle();
double diffAngle = DrivingDirectionUtils.getAngleDiff(carBearing, eventBearing);
- if (diffAngle < 20) {
+ Log.d("RWJ", "car_bearing:" + carBearing + ",eventBearing:" + eventBearing + ",diffAngle:" + diffAngle);
+ if (diffAngle <= 20) {
// 3、计算当前车辆行驶方向与事件位置之间夹角《20度,保证道路事件在车辆前方
double eventAngle = DrivingDirectionUtils.getDegreeOfCar2Poi(
currentLocation.getLongitude(),
@@ -77,10 +83,13 @@ public class V2XAlarmServer {
eventLocation.getLat(),
(int) currentLocation.getBearing()
);
+
+ Log.d("RWJ", "eventAngle:" + eventAngle);
if (0 <= eventAngle && eventAngle <= 20) {
if (showedEvents.contains(v2XRoadEventEntity)) {
return null;
}
+ Log.d("RWJ", "showed---");
showedEvents.add(v2XRoadEventEntity);
return v2XRoadEventEntity;
}
@@ -91,6 +100,7 @@ public class V2XAlarmServer {
}
} catch (Exception e) {
e.printStackTrace();
+ Log.w("RWJ", "error: " + e.getMessage());
}
return null;
}
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/IMoGoV2XMarkerManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/IMoGoV2XMarkerManager.java
index 739c8cdf99..f82f7c4014 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/IMoGoV2XMarkerManager.java
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/IMoGoV2XMarkerManager.java
@@ -4,8 +4,9 @@ import android.content.Context;
import com.alibaba.android.arouter.facade.template.IProvider;
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity;
+import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.IMogoMarkerClickListener;
-import com.mogo.v2x.data.V2XMarkerCardResult;
+import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerCardResult;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -37,11 +38,11 @@ public interface IMoGoV2XMarkerManager extends IProvider {
/**
* 绘制正在预警的道路事件的POI点
- *
- * @param context
+ * @param context
* @param roadEventEntity
+ * @return
*/
- void drawableAlarmPOI(Context context, V2XRoadEventEntity roadEventEntity, IMogoMarkerClickListener clickListener);
+ IMogoMarker drawableAlarmPOI(Context context, V2XRoadEventEntity roadEventEntity, IMogoMarkerClickListener clickListener);
/**
* 清除 道路事件 POI
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XMarkerManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XMarkerManager.java
index 4394184df3..13432dbf4f 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XMarkerManager.java
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoV2XMarkerManager.java
@@ -32,10 +32,10 @@ import com.mogo.map.marker.IMogoMarkerClickListener;
import com.mogo.map.marker.IMogoMarkerManager;
import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.eagle.core.data.enums.EventTypeEnum;
-import com.mogo.v2x.V2XManager;
-import com.mogo.v2x.data.V2XMarkerCardResult;
-import com.mogo.v2x.data.V2XMarkerExploreWay;
-import com.mogo.v2x.data.V2XMarkerLocation;
+import com.mogo.eagle.core.function.v2x.internal.V2XManager;
+import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerCardResult;
+import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerExploreWay;
+import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerLocation;
import java.util.List;
import java.util.Objects;
@@ -55,8 +55,7 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
// 记录所有的:新鲜事儿的道路事件点、探路事件
private static final CopyOnWriteArraySet mV2XRoadEventEntityArrayList = new CopyOnWriteArraySet<>();
- // 上次的道路事件的预警Marker
- private static IMogoMarker mAlarmInfoMarker;
+
@Override
public void drawableLastAllPOI() {
@@ -132,7 +131,7 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
}
@Override
- public void drawableAlarmPOI(Context context, V2XRoadEventEntity roadEventEntity, IMogoMarkerClickListener clickListener) {
+ public IMogoMarker drawableAlarmPOI(Context context, V2XRoadEventEntity roadEventEntity, IMogoMarkerClickListener clickListener) {
try {
IMoGoV2XStatusManager v2xStatus = BridgeApi.INSTANCE.v2xStatus();
if (v2xStatus != null) {
@@ -147,7 +146,6 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
.latitude(roadEventEntity.getLocation().getLat())
.longitude(roadEventEntity.getLocation().getLon());
optionsRipple.anchor(0.5f, 0.5f);
-
MarkerShowEntity markerShowEntity = new MarkerShowEntity();
MarkerExploreWay markerExploreWay = roadEventEntity.getNoveltyInfo();
markerShowEntity.setBindObj(markerExploreWay);
@@ -155,22 +153,21 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
markerShowEntity.setTextContent(markerExploreWay.getAddr());
markerShowEntity.setMarkerLocation(markerExploreWay.getLocation());
markerShowEntity.setMarkerType(CARD_TYPE_NOVELTY);
-
optionsRipple.icons(V2XMarkerAdapter.getV2XRoadEventViewGif(context, roadEventEntity));
optionsRipple.period(1);
-
+ IMogoMarker ret = null;
if (MogoStatusManager.getInstance().isVrMode()) {
- mAlarmInfoMarker = Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMarkerService()).drawMarker(markerShowEntity);
+ ret = Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMarkerService()).drawMarker(markerShowEntity);
} else {
optionsRipple.icon(V2XMarkerAdapter.getV2XRoadEventViewPng(context, roadEventEntity));
IMogoMarkerManager marker = CallerMapUIServiceManager.INSTANCE.getMarkerManager(context);
if (marker != null) {
- mAlarmInfoMarker = marker.addMarker(V2X_EVENT_ALARM_POI, optionsRipple);
+ ret = marker.addMarker(V2X_EVENT_ALARM_POI, optionsRipple);
}
}
// 当前Marker设置为最上面
- if (mAlarmInfoMarker != null) {
- mAlarmInfoMarker.setToTop();
+ if (ret != null) {
+ ret.setToTop();
}
// 绘制连接线
IMoGoV2XPolylineManager polylineManager = BridgeApi.INSTANCE.v2xPolyline();
@@ -182,28 +179,30 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
new MogoLatLng(roadEventEntity.getLocation().getLat(),
roadEventEntity.getLocation().getLon()
), context);
+
+ return ret;
} else {
CallerLogger.INSTANCE.e(M_V2X + TAG, "Location 必须进行初始化!!!!!");
}
} catch (Exception e) {
e.printStackTrace();
}
+ return null;
}
@Override
public void clearAlarmPOI() {
-
- boolean isRoadEventPOIShow = false;
- IMoGoV2XStatusManager v2xStatus = BridgeApi.INSTANCE.v2xStatus();
- if (v2xStatus != null) {
- isRoadEventPOIShow = v2xStatus.isRoadEventPOIShow();
- }
- if (isRoadEventPOIShow) {
- v2xStatus.setRoadEventPOIShow(TAG, false);
- if (mAlarmInfoMarker != null) {
- mAlarmInfoMarker.remove();
- }
- }
+// boolean isRoadEventPOIShow = false;
+// IMoGoV2XStatusManager v2xStatus = BridgeApi.INSTANCE.v2xStatus();
+// if (v2xStatus != null) {
+// isRoadEventPOIShow = v2xStatus.isRoadEventPOIShow();
+// }
+// if (isRoadEventPOIShow) {
+// v2xStatus.setRoadEventPOIShow(TAG, false);
+// if (mAlarmInfoMarker != null) {
+// mAlarmInfoMarker.remove();
+// }
+// }
}
@Override
@@ -220,9 +219,9 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
@Override
public void forceClearAlarmPOI() {
- if (mAlarmInfoMarker != null) {
- mAlarmInfoMarker.remove();
- }
+// if (mAlarmInfoMarker != null) {
+// mAlarmInfoMarker.remove();
+// }
}
@Override
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/marker/MarkerManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/marker/MarkerManager.kt
new file mode 100644
index 0000000000..1039bbcd30
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/marker/MarkerManager.kt
@@ -0,0 +1,193 @@
+package com.mogo.eagle.core.function.v2x.events.marker
+
+import android.os.Handler
+import android.os.HandlerThread
+import android.util.Log
+import com.mogo.cloud.commons.utils.CoordinateUtils
+import com.mogo.eagle.core.data.map.MogoLocation
+import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
+import com.mogo.eagle.core.utilcode.util.*
+import com.mogo.map.marker.IMogoMarker
+import com.mogo.map.overlay.IMogoPolyline
+import kotlinx.coroutines.Runnable
+import java.util.LinkedList
+import java.util.concurrent.ConcurrentHashMap
+import java.util.concurrent.atomic.AtomicBoolean
+import java.util.concurrent.atomic.AtomicReference
+
+
+data class MarkerWrapper(val id: String, val lon: Double, val lat: Double, val coordinateType: Int, var markers: ArrayList? = null, var lines: ArrayList? = null) {
+
+ fun addLine(line: IMogoPolyline) {
+ var ll = this.lines
+ if (ll == null) {
+ ll = ArrayList()
+ this.lines = ll
+ }
+ ll.add(line)
+ }
+
+ fun addMarker(marker: IMogoMarker) {
+ var mm = this.markers
+ if (mm == null) {
+ mm = ArrayList()
+ this.markers = mm
+ }
+ mm.add(marker)
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (javaClass != other?.javaClass) return false
+
+ other as MarkerWrapper
+
+ if (id != other.id) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ return id.hashCode()
+ }
+}
+
+object MarkerManager {
+
+ private const val TAG = "MarkerManager"
+
+ private val showedMarkers by lazy { LinkedList() }
+
+ private val toRemoveMakers by lazy { LinkedList() }
+
+ private val isFirstAdd by lazy { AtomicBoolean(false) }
+
+ private val elapsedDistances by lazy { ConcurrentHashMap() }
+
+ private val lastCarLocation by lazy { AtomicReference() }
+
+ private val lastGpsLocation by lazy { AtomicReference() }
+
+ private val checkTask = object : Runnable {
+
+ override fun run() {
+
+ try {
+ Log.d(TAG, "--- checkTask --- 1 ---")
+ if (lastCarLocation.get() == null) {
+ return
+ }
+ Log.d(TAG, "--- checkTask --- 2 ---")
+ if (lastGpsLocation.get() == null) {
+ return
+ }
+ Log.d(TAG, "--- checkTask --- 3 ---")
+ val toRemove = toRemoveMakers.iterator()
+ val carLoc = AtomicReference()
+ while (toRemove.hasNext()) {
+ val marker = toRemove.next()
+ if (carLoc.get() == null) {
+ carLoc.set(if (marker.coordinateType == 0) {
+ //高德坐标
+ CallerMapLocationListenerManager.getCurrentLocation()
+ } else {
+ CallerMapLocationListenerManager.getCurrentGpsLocation()
+ })
+ }
+ val currentLocation = carLoc.get()
+ val lastLocation = if (marker.coordinateType == 0) lastCarLocation.get() else lastGpsLocation.get()
+ if (currentLocation != null && lastLocation != null) {
+ val delta = CoordinateUtils.calculateLineDistance(currentLocation.longitude, currentLocation.latitude, lastLocation.longitude, lastLocation.latitude)
+ Log.d(TAG, "--- checkTask --- 4 ---:delta:$delta, id:${marker.id}")
+ var elapsed = elapsedDistances[marker]
+ if (elapsed == null) {
+ elapsed = delta.toDouble()
+ } else {
+ elapsed += delta
+ }
+ Log.d(TAG, "--- checkTask --- 5 ---:delta:$delta, elapsed:${elapsed}, id: ${marker.id}")
+ if (elapsed >= 200) {
+ var removeMarkerError = false
+ marker.markers?.forEach {
+ try {
+ Log.e(TAG, "--- checkTask --- remove marker: $it, id: ${marker.id}")
+ it.setVisible(false)
+ it.destroy()
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ removeMarkerError = true
+ Log.e(TAG, "--- checkTask --- remove marker error:${t.message}, id: ${marker.id}")
+ }
+ }
+ var removeLineError = false
+ marker.lines?.forEach {
+ try {
+ it.isVisible = false
+ Log.e(TAG, "--- checkTask --- remove line : $it, id:${marker.id}")
+ it.destroy()
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ removeLineError = true
+ Log.e(TAG, "--- checkTask --- remove line error:${t.message}, id: ${marker.id}")
+ }
+ }
+ if (!removeLineError && !removeMarkerError) {
+ toRemove.remove()
+ synchronized(elapsedDistances) {
+ elapsedDistances.remove(marker)
+ }
+ }
+ } else {
+ elapsedDistances[marker] = elapsed
+ }
+ }
+ }
+ val iterator = showedMarkers.iterator()
+ while (iterator.hasNext()) {
+ val marker = iterator.next()
+ if (carLoc.get() == null) {
+ carLoc.set(if (marker.coordinateType == 0) {
+ //高德坐标
+ CallerMapLocationListenerManager.getCurrentLocation()
+ } else {
+ CallerMapLocationListenerManager.getCurrentGpsLocation()
+ })
+ }
+ val location = carLoc.get()
+ if (location != null) {
+ val angle = DrivingDirectionUtils.getDegreeOfCar2Poi2(location.longitude, location.latitude, marker.lon, marker.lat, location.bearing.toDouble())
+ if (angle >= 90) {
+ iterator.remove()
+ synchronized(toRemoveMakers) {
+ toRemoveMakers.offer(marker)
+ }
+ }
+ }
+ }
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ } finally {
+ lastCarLocation.set(CallerMapLocationListenerManager.getCurrentLocation())
+ lastGpsLocation.set(CallerMapLocationListenerManager.getCurrentGpsLocation())
+ handler.postDelayed(this, 1000)
+ }
+ }
+ }
+
+ private val handler by lazy {
+ val thread = HandlerThread("check_marker_expired")
+ thread.start()
+ Handler(thread.looper)
+ }
+
+
+ fun addMarker(marker: MarkerWrapper) {
+ Log.d(TAG, "=== addMarker ====: $marker")
+ synchronized(showedMarkers) {
+ showedMarkers.offer(marker)
+ }
+ if (isFirstAdd.compareAndSet(false,true)) {
+ handler.postDelayed(checkTask, 1000)
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/AbsV2XScenario.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/AbsV2XScenario.java
index cd72feafbd..88baed92e0 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/AbsV2XScenario.java
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/AbsV2XScenario.java
@@ -7,6 +7,8 @@ import com.mogo.eagle.core.data.map.entity.V2XMessageEntity;
import com.mogo.eagle.core.function.v2x.events.scenario.IV2XScenario;
import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker;
+import java.util.concurrent.atomic.AtomicReference;
+
/**
* author : donghongyu
* e-mail : 1358506549@qq.com
@@ -17,7 +19,7 @@ import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker;
public abstract class AbsV2XScenario implements IV2XScenario {
protected String TAG = "AbsV2XScenario";
private IV2XMarker mV2XMarker;
- private V2XMessageEntity mV2XMessageEntity;
+ private final AtomicReference mV2XMessageEntity = new AtomicReference<>();
protected AbsV2XScenario() {
}
@@ -26,14 +28,14 @@ public abstract class AbsV2XScenario implements IV2XScenario {
@Override
public void close() {
- clearPOI();
+// clearPOI();
}
/**
* 释放资源
*/
public void release() {
- mV2XMessageEntity = null;
+ mV2XMessageEntity.set(null);
mV2XMarker = null;
}
@@ -46,19 +48,19 @@ public abstract class AbsV2XScenario implements IV2XScenario {
}
public void setV2XMessageEntity(@Nullable V2XMessageEntity mV2XMessageEntity) {
- this.mV2XMessageEntity = mV2XMessageEntity;
+ this.mV2XMessageEntity.set(mV2XMessageEntity);
}
public V2XMessageEntity getV2XMessageEntity() {
- return mV2XMessageEntity;
+ return mV2XMessageEntity.get();
}
@Override
public boolean isSameScenario(@Nullable V2XMessageEntity v2XMessageEntity) {
- if (mV2XMessageEntity == null) {
+ V2XMessageEntity old = mV2XMessageEntity.get();
+ if (old == null) {
return false;
}
- return mV2XMessageEntity.equals(v2XMessageEntity);
+ return old.equals(v2XMessageEntity);
}
-
}
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/V2XScenarioManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/V2XScenarioManager.java
index 148f2dfa0d..1928101ce5 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/V2XScenarioManager.java
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/impl/V2XScenarioManager.java
@@ -21,6 +21,8 @@ import com.mogo.eagle.core.utilcode.util.Utils;
import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.map.uicontroller.VisualAngleMode;
+import java.util.concurrent.atomic.AtomicReference;
+
/**
* author : donghongyu
* e-mail : 1358506549@qq.com
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt
index 1ba5daef53..b653876cc6 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt
@@ -1,53 +1,42 @@
package com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad
import android.animation.ArgbEvaluator
-import android.content.Context
import android.graphics.Color
import android.os.Handler
import android.os.Looper
import android.view.animation.DecelerateInterpolator
import androidx.core.util.Pair
-import androidx.lifecycle.Lifecycle.Event
-import androidx.lifecycle.Lifecycle.Event.ON_CREATE
-import androidx.lifecycle.Lifecycle.Event.ON_DESTROY
-import androidx.lifecycle.LifecycleEventObserver
-import androidx.lifecycle.LifecycleOwner
+import com.mogo.cloud.commons.utils.*
import com.mogo.commons.AbsMogoApplication
-import com.mogo.eagle.core.data.map.MapRoadInfo.StopLine
import com.mogo.eagle.core.data.map.MogoLatLng
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity
-import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener
-import com.mogo.eagle.core.function.api.v2x.OnClearAllMarker
-import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager
-import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager
-import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.OnRoadListener
-import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
-import com.mogo.eagle.core.function.call.v2x.CallMarkersClearManager
-import com.mogo.eagle.core.function.v2x.events.consts.V2XConst.V2X_EVENT_ALARM_POI
+import com.mogo.eagle.core.function.call.map.*
import com.mogo.eagle.core.function.v2x.events.scenario.scene.road.V2XAiRoadEventMarker
-import com.mogo.eagle.core.utilcode.kotlin.lifeCycleOwner
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils
import com.mogo.map.MogoMap
import com.mogo.map.overlay.IMogoPolyline
import com.mogo.map.overlay.MogoPolylineOptions
-import io.netty.util.internal.ConcurrentSet
import mogo.telematics.pad.MessagePad
import java.util.*
import java.util.concurrent.Executors
import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.atomic.AtomicReference
+import java.util.concurrent.ConcurrentHashMap
+import com.mogo.eagle.core.function.v2x.events.marker.MarkerManager
+import com.mogo.eagle.core.function.v2x.events.marker.MarkerWrapper
/**
* Ai云道路施工事件,道路颜色标记类
*/
-object AiRoadMarker {
+class AiRoadMarker {
- private const val TAG = "AiRoadMarker"
+ companion object {
+ @JvmField
+ val aiMakers = ConcurrentHashMap()
+ }
- private val queue by lazy { LinkedBlockingQueue() }
-
- private val pool by lazy { Executors.newFixedThreadPool(2) }
+ private val TAG = "AiRoadMarker"
private val marker by lazy { AtomicReference() }
@@ -59,54 +48,28 @@ object AiRoadMarker {
)
}
- private val line by lazy { AtomicReference() }
-
private val START_COLOR = Color.parseColor("#002ABAD9")
private val END_COLOR = Color.parseColor("#66FF7A30")
+ private val roadMarker by lazy { V2XAiRoadEventMarker() }
+
+ private val line = AtomicReference()
+
private val handler by lazy {
Handler(Looper.getMainLooper())
}
private val checkExpiredTask = Runnable {
val poi = this.marker.get()
- val car = this.carLocation.get()
+ val car = CallerMapLocationListenerManager.getCurrentGpsLocation()
if (poi != null && car != null) {
- val distance = DrivingDirectionUtils.distance(
- car.first,
- car.second,
- poi.poi_lon,
- poi.poi_lat
- ) * 10000
+ val distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, poi.poi_lon, poi.poi_lat)
if (distance < 500) {
unMarker(poi)
}
}
}
- private val onClearAllMarker = object : OnClearAllMarker {
-
- override fun onClearAllMarkers() {
- Logger.d(TAG, "--- onClearAllMarkers ----")
- val marker = this@AiRoadMarker.marker.get()
- if (marker != null) {
- Logger.d(TAG, "--- onClearAllMarkers ----2")
- unMarker(marker)
- }
- }
-
- override fun onClearAllMarkers(tag: String) {
- Logger.d(TAG, "--- onClearAllMarkers ----: tag: $tag")
- val marker = this@AiRoadMarker.marker.get()
- if (marker != null && tag == V2X_EVENT_ALARM_POI) {
- Logger.d(TAG, "--- onClearAllMarkers ----: tag: -- 1: $tag")
- unMarker(marker)
- }
- }
- }
-
- private val markers = ConcurrentSet()
-
private val options by lazy {
MogoPolylineOptions().apply {
zIndex(40000f)
@@ -116,257 +79,83 @@ object AiRoadMarker {
}
}
- fun init(ctx: Context) {
- ctx.lifeCycleOwner.lifecycle.addObserver(object : LifecycleEventObserver {
- override fun onStateChanged(source: LifecycleOwner, event: Event) {
- if (event == ON_CREATE) {
- onCreate()
- }
- if (event == ON_DESTROY) {
- onDestroy()
- }
- }
- })
-
- pool.execute {
- var interrupted = false
- Logger.d(TAG, "--- consumer --- 0 ---")
- while (!interrupted) {
- try {
- Logger.d(TAG, "--- consumer --- 1 ---")
- val top = queue.take() ?: continue
- Logger.d(TAG, "--- consumer --- 2 ---")
- val location = carLocation.get()
- if (location == null) {
- if (queue.isEmpty()) {
- synchronized(markers) {
- markers.clear()
- }
- }
- continue
- }
- val isTrigger = isTriggerEvent(
- top.poi_lon,
- top.poi_lat,
- location.first,
- location.second,
- location.third
- )
- Logger.d(TAG, "--- consumer --- 3 ---: isTrigger => $isTrigger")
- if (isTrigger) {
- marker.set(top)
- marker(top, true)
- } else {
- synchronized(markers) {
- markers.remove(top)
- }
- }
- interrupted = Thread.currentThread().isInterrupted
- } catch (e: InterruptedException) {
- e.printStackTrace()
- break
- }
- }
+ fun marker(marker: Marker, drawMarker: Boolean, drawRoadLine: Boolean = false) {
+ val location = CallerMapLocationListenerManager.getCurrentGpsLocation() ?: return
+ this.marker.set(marker)
+ val wrapper = MarkerWrapper(marker.id, marker.poi_lon, marker.poi_lat, 1, null, null)
+ if (drawMarker) {
+ marker.entity?.apply { roadMarker.drawMarkers(this, wrapper) }
}
- }
-
- private fun isTriggerEvent(
- x1: Double,
- y1: Double,
- x2: Double,
- y2: Double,
- a2: Double
- ): Boolean {
- val angle = DrivingDirectionUtils.getDegreeOfCar2Poi2(x2, y2, x1, y1, a2)
- if (angle <= 60 && DrivingDirectionUtils.distance(x1, y1, x2, y2) <= 300) {
- return true
- }
- return false
- }
-
- private val onRoadListener = object : OnRoadListener {
- private var roadId = ""
- private var hasCrossRoad = false
-
- override fun onRoadIdInfo(roadId: String) {
- Logger.d(TAG, "--- onRoadInfo --- roadId: $roadId")
- val oldRoadId = this.roadId
- if (oldRoadId != roadId) {
- if (hasCrossRoad) {
- hasCrossRoad = false
- }
- }
- this.roadId = roadId
- }
-
- override fun onStopLineInfo(info: StopLine) {
- Logger.d(TAG, "--- onStopLineInfo --- info: $info")
- if (!hasCrossRoad) {
- hasCrossRoad = true
- }
- }
- }
-
- private val onLocationListener = object : IMoGoChassisLocationWGS84Listener {
-
- override fun onChassisLocationWGS84(gnssInfo: MessagePad.GnssInfo?) {
- if (gnssInfo == null) {
+ if (drawRoadLine) {
+ //施工中心点前方的自车行驶方向上300米距离
+ val l1 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(marker.poi_lon, marker.poi_lat, location.bearing, 300f)
+ //施工中心点后方的自车行驶方向上300米距离
+ Logger.d(TAG, "--- marker --- 3 --- l1: $l1")
+ val l2 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(marker.poi_lon, marker.poi_lat, location.bearing, -300f)
+ if (l1.points.isEmpty() || l2.points.isEmpty()) {
+ Logger.d(TAG, "--- marker --- 3 --- return ----")
return
}
- try {
- val loc = arrayOf(gnssInfo.longitude, gnssInfo.latitude)
- carLocation.set(Triple(loc[0], loc[1], gnssInfo.heading.toDouble()))
- } catch (t: Throwable) {
- Logger.e(TAG, "error: ${t.message}")
+ Logger.d(TAG, "--- marker --- 4 --- l2: $l2")
+ val points = LinkedList()
+ if (l2 != null && l2.points.isNotEmpty()) {
+ points.addAll(l2.points.reversed().map {
+ MogoLatLng(it.second, it.first)
+ })
}
- }
- }
-
- private fun onCreate() {
- CallerMapRoadListenerManager.registerRoadListener(TAG, onRoadListener)
- CallMarkersClearManager.addAllMarkersClearListener(TAG, onClearAllMarker)
- CallerChassisLocationWGS84ListenerManager.addListener(TAG, onLocationListener)
- }
-
- private fun onDestroy() {
- CallerMapRoadListenerManager.unRegisterRoadListener(TAG)
- CallMarkersClearManager.removeAllMarkersClearListener(TAG)
- CallerChassisLocationWGS84ListenerManager.removeListener(TAG)
- pool.shutdownNow()
- removeLine()
- }
-
- fun enqueue(marker: Marker) {
- Logger.d(TAG, "--- enqueue --- 1 ---")
- if (markers.contains(marker)) {
- Logger.d(TAG, "--- enqueue --- cache hit ---")
- return
- }
- Logger.d(TAG, "--- enqueue --- 2 ---")
- synchronized(markers) {
- markers += marker
- }
- pool.execute {
- Logger.d(
- TAG,
- "--- enqueue --- 3 ---${Thread.currentThread().name}::${Thread.currentThread().id}"
- )
- queue.put(marker)
- }
- }
-
- fun marker(marker: Marker, drawMarker: Boolean) {
- handler.removeCallbacks(checkExpiredTask)
- val location = carLocation.get() ?: return
- if (markers.contains(marker)) {
- Logger.d(TAG, "--- enqueue --- cache hit ---")
- return
- }
- synchronized(markers) {
- markers += marker
- }
- this.marker.set(marker)
- //施工中心点前方的自车行驶方向上300米距离
- val l1 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(
- marker.poi_lon,
- marker.poi_lat,
- location.third.toFloat(),
- 300f
- )
- //施工中心点后方的自车行驶方向上300米距离
- Logger.d(TAG, "--- marker --- 3 --- l1: $l1")
- val l2 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(
- marker.poi_lon,
- marker.poi_lat,
- location.third.toFloat(),
- -300f
- )
- if (l1.points.isEmpty() || l2.points.isEmpty()) {
- Logger.d(TAG, "--- marker --- 3 --- return ----")
- synchronized(markers) {
- markers.remove(marker)
- }
- return
- }
- Logger.d(TAG, "--- marker --- 4 --- l2: $l2")
- val points = LinkedList()
- if (l2 != null && l2.points.isNotEmpty()) {
- points.addAll(l2.points.reversed().map {
- MogoLatLng(it.second, it.first)
- })
- }
- val centerX = marker.poi_lon
- val centerY = marker.poi_lat
- Logger.d(TAG, "--- marker --- 5 --- marker: $marker")
- val farthestPoint = marker.polygon?.let {
- var find: Pair = Pair(centerX, centerY)
- var min = Long.MAX_VALUE
- for (p in it) {
- val angle = DrivingDirectionUtils.getDegreeOfCar2Poi2(
- centerX,
- centerY,
- p.first,
- p.second,
- location.third
- )
- if (angle < min) {
- min = angle
- find = p
+ val centerX= marker.poi_lon
+ val centerY = marker.poi_lat
+ Logger.d(TAG, "--- marker --- 5 --- marker: $marker")
+ val farthestPoint = marker.polygon?.let {
+ var find: Pair = Pair(centerX, centerY)
+ var min = Long.MAX_VALUE
+ for (p in it) {
+ val angle = DrivingDirectionUtils.getDegreeOfCar2Poi2(centerX, centerY, p.first, p.second, location.bearing.toDouble())
+ if (angle < min) {
+ min = angle
+ find = p
+ }
+ }
+ MogoLatLng(find.second, find.first)
+ } ?: MogoLatLng(centerY, centerX)
+ marker.farthestPoint = Pair(farthestPoint.lon, farthestPoint.lat)
+ Logger.d(TAG, "--- marker --- 6 --- marker: $marker")
+ if (l1 != null && l1.points.isNotEmpty()) {
+ for (l in l1.points) {
+ if (DrivingDirectionUtils.getDegreeOfCar2Poi2(farthestPoint.lon, farthestPoint.lat, l.first, l.second, (location.bearing + 180).toDouble()) < 90L) {
+ points.add(l.let { MogoLatLng(it.second, it.first) })
+ }
}
}
- MogoLatLng(find.second, find.first)
- } ?: MogoLatLng(centerY, centerX)
- marker.farthestPoint = Pair(farthestPoint.lon, farthestPoint.lat)
- Logger.d(TAG, "--- marker --- 6 --- marker: $marker")
- if (l1 != null && l1.points.isNotEmpty()) {
- for (l in l1.points) {
- if (DrivingDirectionUtils.getDegreeOfCar2Poi2(
- farthestPoint.lon,
- farthestPoint.lat,
- l.first,
- l.second,
- location.third + 180
- ) < 90L
- ) {
- points.add(l.let { MogoLatLng(it.second, it.first) })
- }
+ if (points.size <= 1) {
+ return
+ }
+ val evaluator = ArgbEvaluator()
+ val interceptor = DecelerateInterpolator(1.5f)
+ val total = points.size
+ val colors = ArrayList()
+ (0..total).forEach { i ->
+ colors += evaluator.evaluate(interceptor.getInterpolation(i * 1f / total), START_COLOR, END_COLOR) as Int
+ }
+ var line = line.get()
+ options.points(points)
+ options.colorValues(colors)
+ Logger.d(TAG, "--- marker --- 7 --- points: ${points.size}")
+ if (line == null || line.isDestroyed) {
+ val l = overlayManager?.addPolyline(options)
+ this.line.set(l)
+ line = l
+ } else {
+ line.setOption(options)
+ }
+ if (!line.isVisible) {
+ line.isVisible = true
+ }
+ if (line != null) {
+ wrapper.addLine(line)
}
}
- if (points.size <= 1) {
- synchronized(markers) {
- markers.remove(marker)
- }
- return
- }
- removeLine()
- if (drawMarker) {
- marker.entity?.apply { V2XAiRoadEventMarker.drawMarkers(this) }
- }
- val evaluator = ArgbEvaluator()
- val interceptor = DecelerateInterpolator(1.5f)
- val total = points.size
- val colors = ArrayList()
- (0..total).forEach { i ->
- colors += evaluator.evaluate(
- interceptor.getInterpolation(i * 1f / total),
- START_COLOR,
- END_COLOR
- ) as Int
- }
- var line = line.get()
- options.points(points)
- options.colorValues(colors)
- Logger.d(TAG, "--- marker --- 7 --- points: ${points.size}")
- if (line == null || line.isDestroyed) {
- val l = overlayManager?.addPolyline(options)
- this.line.set(l)
- line = l
- } else {
- line.setOption(options)
- }
- if (!line.isVisible) {
- line.isVisible = true
- }
+ MarkerManager.addMarker(wrapper)
}
private fun removeLine() {
@@ -380,30 +169,21 @@ object AiRoadMarker {
}
}
- fun unMarker(marker: Marker) {
+ private fun unMarker(marker: Marker) {
Logger.d(TAG, "--- unMarker ---")
- markers -= marker
this.marker.set(null)
removeLine()
- V2XAiRoadEventMarker.removeMarkers(null)
+ roadMarker.removeMarkers()
handler.removeCallbacks(checkExpiredTask)
}
- fun receive(marker: Marker) {
+ fun receive() {
Logger.d(TAG, "receive --- 1 ---")
val poi = this.marker.get()
- val car = this.carLocation.get()
+ val car = CallerMapLocationListenerManager.getCurrentGpsLocation()
if (poi != null && car != null) {
- val distance = DrivingDirectionUtils.distance(
- car.first,
- car.second,
- marker.poi_lon,
- marker.poi_lat
- ) * 10000
- Logger.d(
- TAG,
- "receive --- 2 ---:car:[${car.first}, ${car.second}] -> poi:[${marker.poi_lon}, ${marker.poi_lat}] --> distance:$distance"
- )
+ val distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, poi.poi_lon, poi.poi_lat)
+ Logger.d(TAG, "receive --- 2 ---:car:[${car.longitude}, ${car.latitude}] -> poi:[${poi.poi_lon}, ${poi.poi_lat}] --> distance:$distance")
if (distance < 500) {
checkExpired()
} else {
@@ -422,10 +202,12 @@ object AiRoadMarker {
}
data class Marker(
+ val id: String,
+ val poiType: String,
val poi_lat: Double,
val poi_lon: Double,
val poi_angle: Double,
- val polygon: List>?,
+ val polygon: List>? = null,
var farthestPoint: Pair? = null,
var entity: V2XRoadEventEntity? = null
) {
@@ -434,15 +216,12 @@ object AiRoadMarker {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Marker
- if (poi_lat != other.poi_lat) return false
- if (poi_lon != other.poi_lon) return false
+ if (id != other.id) return false
return true
}
override fun hashCode(): Int {
- var result = poi_lat.hashCode()
- result = 31 * result + poi_lon.hashCode()
- return result
+ return id.hashCode()
}
}
}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XAiRoadEventMarker.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XAiRoadEventMarker.kt
index 706abccbb8..563aada462 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XAiRoadEventMarker.kt
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XAiRoadEventMarker.kt
@@ -1,127 +1,88 @@
package com.mogo.eagle.core.function.v2x.events.scenario.scene.road
import android.graphics.*
-import android.util.*
-import com.mogo.cloud.commons.utils.*
-import com.mogo.commons.AbsMogoApplication
+import com.mogo.eagle.core.data.enums.EventTypeEnumNew
import com.mogo.eagle.core.data.map.*
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity
-import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
-import com.mogo.eagle.core.function.v2x.R
import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi.context
import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi.v2xMarker
-import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils
+import com.mogo.eagle.core.function.v2x.events.marker.MarkerWrapper
import com.mogo.map.*
import com.mogo.map.marker.*
import com.mogo.map.overlay.*
-import java.util.*
import java.util.concurrent.atomic.*
import kotlin.Pair
import kotlin.collections.ArrayList
-object V2XAiRoadEventMarker {
+class V2XAiRoadEventMarker {
private val current = AtomicReference?>>()
private val v2xLocation = AtomicReference()
- private val carLocation = AtomicReference()
+ private val overlayManager by lazy { MogoOverlayManager.getInstance() }
- private val timer = Timer()
-
- private val timerTask by lazy { AtomicReference() }
-
- private val distance = AtomicInteger(0)
-
- private val overlayManager by lazy { CallerMapUIServiceManager.getOverlayManager(AbsMogoApplication.getApp()) }
-
- fun drawMarkers(entity: V2XRoadEventEntity): Pair?>? {
- removeMarkers(current.get())
- timerTask.get()?.cancel()
- val extra = entity.noveltyInfo.extras.get("polygon");
- if (extra is List<*>) {
- val l = extra
- if (l.size > 0) {
+ fun drawMarkers(entity: V2XRoadEventEntity, wrapper: MarkerWrapper) {
+ val extra = entity.noveltyInfo.extras["polygon"]
+ v2xMarker()?.drawableAlarmPOI(context(), entity, null)?.also {
+ wrapper.addMarker(it)
+ }
+ if (extra is List<*> && entity.poiType != EventTypeEnumNew.TYPE_SOCKET_ROAD_JINGZHI.poiType) {
+ if (extra.size > 0) {
val polygons: MutableList> = ArrayList()
- for (i in l.indices) {
- val o = l[i]!! as? androidx.core.util.Pair<*, *> ?: continue
- val p = o
- val first = p.first
- val second = p.second
+ for (i in extra.indices) {
+ val o = extra[i]!! as? androidx.core.util.Pair<*, *> ?: continue
+ val first = o.first
+ val second = o.second
if (first == null || second == null) {
continue
}
if (first !is Double || second !is Double) {
continue
}
- val xx = CoordinateUtils.transformWgsToGcj(second, first)
- polygons.add(androidx.core.util.Pair.create(xx[0], xx[1]))
+ polygons.add(androidx.core.util.Pair.create(second, first))
}
if (polygons.size > 0) {
- val markers = ArrayList(polygons.size)
- for (i in polygons.indices) {
- val p = polygons[i]
- val options = MogoMarkerOptions().data(entity).latitude(p.second).longitude(p.first)
- options.anchor(0.5f, 0.5f)
- options.icon3DRes(R.raw.sanjiaozhui)
- try {
- val marker = CallerMapUIServiceManager.getMarkerManager(AbsMogoApplication.getApp())?.addMarker("road_pyramid_" + entity.poiType, options)
- marker?.let {
- markers += it
- }
- } catch (t: Throwable) {
- t.printStackTrace()
- }
+ val l2 = entity.noveltyInfo?.location ?: return
+ v2xLocation.set(MogoLocation().also {
+ it.longitude = l2.lon; it.latitude = l2.lat; it.bearing = l2.angle.toFloat()
+ })
+
+ val options = MogoPolylineOptions()
+ val colors = ArrayList()
+ colors.add(Color.argb(204, 237, 172, 21))
+ colors.add(Color.argb(0, 255, 255, 255))
+ options.colorValues(colors)
+ val points = ArrayList()
+
+ for (p in polygons) {
+ points.add(MogoLatLng(p.first, p.second))
}
- if (markers.size > 0) {
- v2xMarker()?.drawableAlarmPOI(context(), entity, null)
- val l2 = entity.noveltyInfo?.location ?: return null
- v2xLocation.set(MogoLocation().also { it.longitude = l2.lon; it.latitude = l2.lat; it.bearing = l2.angle.toFloat() })
-
- val options = MogoPolylineOptions()
- val colors = ArrayList()
- colors.add(Color.argb(204, 237, 172, 21))
- colors.add(Color.argb(0, 255, 255, 255))
- options.colorValues(colors)
- val points = ArrayList()
-
- for (p in polygons) {
- points.add(MogoLatLng(p.second, p.first))
- }
- if (points.size > 2) {
- points.add(points[0])
- }
- options.points(points)
- options.useGradient(true)
- options.useFacade(true)
- options.setGps(false)
- options.width(5f)
- options.zIndex(75000f)
- options.maxIndex(800000f)
- val line = overlayManager?.addPolyline(options)
- current.set(Pair(line, markers))
- if (line != null) {
- line.isVisible = true
- }
+ if (points.size > 2) {
+ points.add(points[0])
+ }
+ options.points(points)
+ options.useGradient(true)
+ options.useFacade(true)
+ options.setGps(true)
+ options.width(5f)
+ options.zIndex(75000f)
+ options.maxIndex(800000f)
+ val line = overlayManager.addPolyline(options)
+ current.set(Pair(line, wrapper.markers))
+ if (line != null) {
+ line.isVisible = true
+ wrapper.addLine(line)
}
}
}
}
- return current.get()
}
- fun removeMarkers(pair: Pair?>?) {
- if (pair != null) {
- realRemove(pair)
- } else {
- val prev = current.get()
- if (prev != null) {
- realRemove(prev)
- val v2xMarker = v2xMarker()
- v2xMarker?.also {
- it.forceClearAlarmPOI()
- }
- }
+ fun removeMarkers() {
+ val prev = current.get()
+ if (prev != null) {
+ realRemove(prev)
}
}
@@ -137,40 +98,4 @@ object V2XAiRoadEventMarker {
}
}
}
-
- fun onLocationChanged(location: MogoLocation) {
- val markerLocation = v2xLocation.get()
- carLocation.set(location)
- if (markerLocation != null) {
- if (isOutOfRange(markerLocation.longitude, markerLocation.latitude, location.longitude, location.latitude, location.bearing.toDouble())) {
- v2xLocation.set(null)
- this.distance.set(0)
- timer.schedule(object : TimerTask() {
- override fun run() {
- val carLocation = this@V2XAiRoadEventMarker.carLocation.get()
- Log.d("XXXXX", "timer do action ---: marker_lon: ${markerLocation.longitude}, marker_lat: ${markerLocation.latitude}, car_lon:${carLocation.longitude}, car_lat: ${carLocation.latitude}")
- checkDistanceIsValid(markerLocation.longitude, markerLocation.latitude, carLocation)
- }
- }.also { this.timerTask.set(it) }, 1000, 1000)
- }
- }
- }
- private fun checkDistanceIsValid(x1: Double, y1: Double, location: MogoLocation) {
- val distance = DrivingDirectionUtils.distance(x1, y1, location.longitude, location.latitude)
- Log.d("XXXXX", "distance: $distance")
- if (this.distance.addAndGet(distance.toInt()) >= 100) {
- Log.d("XXXXX", "remove marker")
- removeMarkers(null)
- this.timerTask.get()?.cancel()
- }
- }
-
- private fun isOutOfRange(markerLon: Double, markerLat: Double, carLon: Double, carLat: Double, carAngle: Double): Boolean {
- return !isFrontOfCar(markerLon, markerLat, carLon, carLat, carAngle)
- }
-
- private fun isFrontOfCar(markerLon: Double, markerLat: Double, carLon: Double, carLat: Double, carAngle: Double): Boolean {
- val degree = DrivingDirectionUtils.getDegreeOfCar2Poi2(carLon, carLat, markerLon, markerLat, carAngle)
- return degree < 90
- }
}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java
index 7b0637ba7e..4de55a0c84 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventMarker.java
@@ -1,16 +1,20 @@
package com.mogo.eagle.core.function.v2x.events.scenario.scene.road;
+import android.util.Log;
+
import androidx.core.util.Pair;
+import com.mogo.eagle.core.data.enums.EventTypeEnumNew;
import com.mogo.eagle.core.data.map.entity.MarkerExploreWay;
import com.mogo.eagle.core.data.map.entity.MarkerLocation;
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity;
import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi;
import com.mogo.eagle.core.function.v2x.events.manager.IMoGoV2XMarkerManager;
-import com.mogo.eagle.core.function.v2x.events.manager.IMoGoV2XPolylineManager;
+import com.mogo.eagle.core.function.v2x.events.marker.MarkerWrapper;
+import com.mogo.eagle.core.function.v2x.events.marker.MarkerManager;
import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.AiRoadMarker;
import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker;
-import com.mogo.eagle.core.data.enums.EventTypeEnum;
+import com.mogo.map.marker.IMogoMarker;
import java.util.ArrayList;
import java.util.List;
@@ -22,30 +26,31 @@ import java.util.Objects;
public class V2XRoadEventMarker implements IV2XMarker {
- private static AiRoadMarker.Marker mMarker;
-
@Override
public void drawPOI(V2XRoadEventEntity entity) {
try {
// 清除道路事件
IMoGoV2XMarkerManager marker = BridgeApi.INSTANCE.v2xMarker();
if (marker != null) {
- marker.clearAlarmPOI();
if (entity != null) {
- if (!Objects.equals(entity.getPoiType(), EventTypeEnum.AI_ROAD_WORK.getPoiType())) {
- AiRoadMarker.Marker prev = mMarker;
- if (prev != null) {
- AiRoadMarker.INSTANCE.unMarker(prev);
- mMarker = null;
+ Log.d("RWJ", "V2XRoadEventMarker:" + entity.getPoiType());
+ if (!Objects.equals(entity.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType())
+ && !Objects.equals(entity.getPoiType(), EventTypeEnumNew.FOURS_ACCIDENT_04.getPoiType())
+ && !Objects.equals(entity.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_JINGZHI.getPoiType())
+ && !Objects.equals(entity.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.getPoiType())) {
+ IMogoMarker iMarker = marker.drawableAlarmPOI(BridgeApi.INSTANCE.context(), entity, null);
+ if (iMarker != null) {
+ Log.d("RWJ", "V2XRoadEventMarker:" + entity.getPoiType() + "--- add Marker");
+ ArrayList markers = new ArrayList<>();
+ markers.add(iMarker);
+ String id = entity.getLocation().getLon() + "_" + entity.getLocation().getLat();
+ MarkerManager.INSTANCE.addMarker(new MarkerWrapper(id, entity.getLocation().getLon(), entity.getLocation().getLat(), 0, markers, null));
+ } else {
+ Log.d("RWJ", "V2XRoadEventMarker:" + entity.getPoiType() + "--- return empty marker");
}
- marker.drawableAlarmPOI(BridgeApi.INSTANCE.context(), entity, null);
} else {
- AiRoadMarker.Marker prev = mMarker;
- if (prev != null) {
- AiRoadMarker.INSTANCE.unMarker(prev);
- mMarker = null;
- }
MarkerExploreWay noveltyInfo = entity.getNoveltyInfo();
+ Log.d("RWJ", "V2XRoadEventMarker -> noveltyInfo:" + noveltyInfo);
if (noveltyInfo != null && noveltyInfo.extras != null) {
List> polygons = new ArrayList<>();
Pair gpsLocation = null;
@@ -77,14 +82,13 @@ public class V2XRoadEventMarker implements IV2XMarker {
if (noveltyInfo.extras.containsKey("gps_location")) {
gpsLocation = (Pair) ((List)(noveltyInfo.extras.get("gps_location"))).get(0);
}
-
if (!polygons.isEmpty() && gpsLocation != null) {
MarkerLocation location = noveltyInfo.getLocation();
- AiRoadMarker.Marker m = new AiRoadMarker.Marker(gpsLocation.second, gpsLocation.first, location.getAngle(), polygons, null, entity);
- mMarker = m;
- AiRoadMarker.INSTANCE.marker(m, true);
+ AiRoadMarker.Marker m = new AiRoadMarker.Marker(noveltyInfo.getInfoId(), noveltyInfo.getPoiType(), gpsLocation.second, gpsLocation.first, location.getAngle(), polygons, null, entity);
+ AiRoadMarker aiMarker = new AiRoadMarker();
+ aiMarker.marker(m, true, isDrawRoadLine(m.getPoiType()));
+ AiRoadMarker.aiMakers.put(noveltyInfo.getInfoId(), aiMarker);
}
-
}
}
}
@@ -94,19 +98,23 @@ public class V2XRoadEventMarker implements IV2XMarker {
}
}
+ private boolean isDrawRoadLine(String poiType) {
+ return EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType().equals(poiType);
+ }
+
@Override
public void clearPOI() {
// 移除线
- IMoGoV2XPolylineManager polyLineManager = BridgeApi.INSTANCE.v2xPolyline();
- if (polyLineManager != null) {
- polyLineManager.clearLine();
- }
- IMoGoV2XMarkerManager v2xMarker = BridgeApi.INSTANCE.v2xMarker();
- if (v2xMarker != null) {
- // 移除事件POI
- v2xMarker.clearAlarmPOI();
- // 绘制上次的数据
- v2xMarker.drawableLastAllPOI();
- }
+// IMoGoV2XPolylineManager polyLineManager = BridgeApi.INSTANCE.v2xPolyline();
+// if (polyLineManager != null) {
+// polyLineManager.clearLine();
+// }
+// IMoGoV2XMarkerManager v2xMarker = BridgeApi.INSTANCE.v2xMarker();
+// if (v2xMarker != null) {
+// // 移除事件POI
+// v2xMarker.clearAlarmPOI();
+// // 绘制上次的数据
+// v2xMarker.drawableLastAllPOI();
+// }
}
}
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java
index cf448413a1..5441044185 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/road/V2XRoadEventScenario.java
@@ -1,12 +1,16 @@
package com.mogo.eagle.core.function.v2x.events.scenario.scene.road;
-import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_V2X;
+
import android.util.Log;
+import com.mogo.cloud.commons.utils.CoordinateUtils;
import com.mogo.commons.analytics.AnalyticsUtils;
+import com.mogo.eagle.core.data.enums.EventTypeEnumNew;
import com.mogo.eagle.core.data.enums.WarningDirectionEnum;
+import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.data.map.entity.MarkerExploreWay;
+import com.mogo.eagle.core.data.map.entity.MarkerLocation;
import com.mogo.eagle.core.data.map.entity.V2XMessageEntity;
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity;
import com.mogo.eagle.core.data.msgbox.MsgBoxBean;
@@ -14,6 +18,7 @@ import com.mogo.eagle.core.data.msgbox.MsgBoxType;
import com.mogo.eagle.core.data.msgbox.V2XMsg;
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener;
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
+import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager;
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager;
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager;
import com.mogo.eagle.core.function.v2x.events.consts.V2XConst;
@@ -21,13 +26,13 @@ import com.mogo.eagle.core.function.v2x.events.manager.V2XStatusManager;
import com.mogo.eagle.core.function.v2x.events.scenario.impl.AbsV2XScenario;
import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker;
import com.mogo.eagle.core.network.utils.GsonUtil;
-import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
-import com.mogo.eagle.core.data.enums.EventTypeEnum;
-
import java.util.HashMap;
import java.util.Map;
+import java.util.Objects;
import java.util.concurrent.TimeUnit;
+
+
/**
* author : donghongyu
* e-mail : 1358506549@qq.com
@@ -45,7 +50,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp
@Override
public void init(V2XMessageEntity v2XMessageEntity) {
try {
- CallerLogger.INSTANCE.d(M_V2X + TAG, "v2XMessageEntity:" + GsonUtil.jsonFromObject(v2XMessageEntity));
+ Log.d(TAG, "v2XMessageEntity:" + GsonUtil.jsonFromObject(v2XMessageEntity));
V2XRoadEventEntity v2XRoadEventEntity = v2XMessageEntity.getContent();
if (v2XRoadEventEntity != null) {
if (v2XMessageEntity.isShowState()) {
@@ -71,16 +76,23 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp
try {
if (getV2XMessageEntity() != null && getV2XMessageEntity().getContent() != null) {
//只展示不播报 不广播
- boolean onlyShow = getV2XMessageEntity().isOnlyShow();
+ V2XMessageEntity entity = getV2XMessageEntity();
+ boolean onlyShow = entity.isOnlyShow();
if (!onlyShow) {
// 设置TTS
- getV2XMessageEntity().getContent().getTts(false);
+ V2XRoadEventEntity content = entity.getContent();
+ if (content != null && !Objects.equals(content.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType())
+ && !Objects.equals(content.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_JINGZHI.getPoiType())
+ && !Objects.equals(content.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.getPoiType())
+ && !Objects.equals(content.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.getPoiType())) {
+ content.getTts(false);
+ }
}
showWindow();
- String poiType = getV2XMessageEntity().getContent().getPoiType();
- String lat = String.valueOf(getV2XMessageEntity().getContent().getLocation().getLat());
- String lon = String.valueOf(getV2XMessageEntity().getContent().getLocation().getLon());
- String infoId = getV2XMessageEntity().getContent().getNoveltyInfo().getInfoId();
+ String poiType = entity.getContent().getPoiType();
+ String lat = String.valueOf(entity.getContent().getLocation().getLat());
+ String lon = String.valueOf(entity.getContent().getLocation().getLon());
+ String infoId = entity.getContent().getNoveltyInfo().getInfoId();
String style = "1";
Map properties = new HashMap<>();
properties.put("dbid", infoId);
@@ -100,20 +112,39 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp
V2XRoadEventEntity content = entity != null ? entity.getContent() : null;
if (content != null) {
// //显示警告红边
- if (content.getAlarmContent() == null || content.getAlarmContent().isEmpty()
- || content.getTts() == null || content.getTts().isEmpty()) {
+ String alarmText = content.getAlarmContent();
+ String ttsText = content.getTts();
+ if (alarmText == null || alarmText.isEmpty()
+ || ttsText == null || ttsText.isEmpty()) {
Log.d("MsgBox-V2XRoadScenario", "alertContent或ttsContent为空!");
}
+ String poiType = content.getPoiType();
+ if (EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType().equals(poiType) ||
+ EventTypeEnumNew. TYPE_SOCKET_ROAD_JINGZHI.getPoiType().equals(poiType) ||
+ EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.getPoiType().equals(poiType) ||
+ EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.getPoiType().equals(poiType)) {
+ MogoLocation carLocation = CallerMapLocationListenerManager.INSTANCE.getCurrentLocation();
+ MarkerExploreWay noveltyInfo = content.getNoveltyInfo();
+ if (carLocation != null && noveltyInfo != null) {
+ MarkerLocation eventLocation = noveltyInfo.getLocation();
+ if (eventLocation != null) {
+ double distance = content.getDistance();
+ alarmText = String.format(alarmText, Math.round(distance) + "");
+ ttsText = String.format(ttsText, Math.round(distance) + "");
+ }
+ }
+ }
+
CallerMsgBoxManager.INSTANCE.saveMsgBox(
new MsgBoxBean(
MsgBoxType.V2X,
- new V2XMsg(content.getPoiType(),
- content.getAlarmContent(),
- content.getTts())
+ new V2XMsg(poiType,
+ alarmText,
+ ttsText)
)
);
- CallerHmiManager.INSTANCE.warningV2X(content.getPoiType(), content.getAlarmContent(),
- content.getTts(), TAG, this, !entity.isOnlyShow(),
+ CallerHmiManager.INSTANCE.warningV2X(poiType, alarmText,
+ ttsText, TAG, this, !entity.isOnlyShow(),
TimeUnit.SECONDS.toMillis(5));
}
}
@@ -130,10 +161,10 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp
@Override
public void clearPOI() {
- IV2XMarker marker = getV2XMarker();
- if (marker != null) {
- marker.clearPOI();
- }
+// IV2XMarker marker = getV2XMarker();
+// if (marker != null) {
+// marker.clearPOI();
+// }
}
@Override
@@ -144,13 +175,14 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp
CallerHmiManager.INSTANCE.showWarning(WarningDirectionEnum.ALERT_WARNING_TOP, TimeUnit.HOURS.toMillis(1));
V2XMessageEntity entity = getV2XMessageEntity();
if (entity != null) {
- if (entity.isNeedAddLine()) {
- drawPOI();
- }
+
V2XRoadEventEntity content = entity.getContent();
if (content != null) {
+ if (entity.isNeedAddLine() && !EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.getPoiType().equals(content.getPoiType()) ) {
+ drawPOI();
+ }
MarkerExploreWay noveltyInfo = content.getNoveltyInfo();
- if (noveltyInfo != null && EventTypeEnum.FOURS_FOG.getPoiType().equals(content.getNoveltyInfo().getPoiType())) {
+ if (noveltyInfo != null && EventTypeEnumNew.FOURS_FOG.getPoiType().equals(content.getNoveltyInfo().getPoiType())) {
CallerHmiManager.INSTANCE.displayEffects();
}
}
@@ -163,7 +195,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp
if (content == null) {
return true;
}
- return !EventTypeEnum.GHOST_PROBE.getPoiType().equals(content.getPoiType());
+ return !EventTypeEnumNew.GHOST_PROBE.getPoiType().equals(content.getPoiType());
}
@Override
@@ -172,7 +204,6 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp
if (isNeedChangeAngle()) {
CallerVisualAngleManager.INSTANCE.changeVisualAngle(new CallerVisualAngleManager.Scene.Default(3, TimeUnit.SECONDS));
}
- clearPOI();
release();
}
}
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/route/V2XOptimalRouteVREventMarker.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/route/V2XOptimalRouteVREventMarker.java
index daac6e2b91..e2e6c77c1f 100644
--- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/route/V2XOptimalRouteVREventMarker.java
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/route/V2XOptimalRouteVREventMarker.java
@@ -39,13 +39,13 @@ public class V2XOptimalRouteVREventMarker implements IV2XMarker? = null): MarkerExploreWay = MarkerExploreWay().also {
- it.items = this.items?.map { itx -> itx.toMarkerExploreWayItem() }
- it.userInfo = this.userInfo?.toMarkerUserInfo()
- it.distance = this.distance
- it.cityName = this.cityName
- it.setGenerateTime(this.generateTime)
- it.infoId = this.infoId
- it.setFileType(this.fileType)
- it.setDirection(this.direction)
- it.location = this.location?.toMarkerLocation()
- it.sn = this.sn
- it.canLive = this.canLive != "0"
- it.poiType = this.poiType
- it.type = this.type
- it.infoCheckNode = this.infoCheckNode
- it.isFabulous = this.isFabulous
- it.uploadType = this.uploadType
- it.isCanLive = this.canLive != "0"
- it.extras = extras
-}
\ No newline at end of file
+fun V2XMarkerExploreWay.toMarkExploreWay(extras: Map? = null): MarkerExploreWay =
+ MarkerExploreWay().also {
+ it.items = this.items?.map { itx -> itx.toMarkerExploreWayItem() }
+ it.userInfo = this.userInfo?.toMarkerUserInfo()
+ it.distance = this.distance
+ it.cityName = this.cityName
+ it.setGenerateTime(this.generateTime)
+ it.infoId = this.infoId
+ it.setFileType(this.fileType)
+ it.setDirection(this.direction)
+ it.location = this.location?.toMarkerLocation()
+ it.sn = this.sn
+ it.canLive = this.canLive != "0"
+ it.poiType = this.poiType
+ it.type = this.type
+ it.infoCheckNode = this.infoCheckNode
+ it.isFabulous = this.isFabulous
+ it.uploadType = this.uploadType
+ it.isCanLive = this.canLive != "0"
+ it.extras = extras
+ }
+
+fun Road.RW_PB.toRoadMarker(): V2XMarkerCardResult =
+ V2XMarkerCardResult().also { l1 ->
+ this.roadwork?.polygonList?.takeIf { it.isNotEmpty() }?.also { old ->
+ l1.extras = HashMap>>().also { extra ->
+ extra["polygon"] = old.map { d ->
+ Pair(d.lon, d.lat)
+ }
+
+ extra["gps_location"] = listOf(
+ Pair(
+ this.roadwork?.center?.point?.lon ?: 0.0,
+ this.roadwork?.center?.point?.lat ?: 0.0
+ )
+ )
+ }
+ }
+ val centerX = this.roadwork?.center?.point?.lon ?: 0.0
+ val centerY = this.roadwork?.center?.point?.lat ?: 0.0
+ val id = "${centerX}_${centerY}"
+ l1.exploreWay = ArrayList().also { l2 ->
+ l2.add(V2XMarkerExploreWay().also { l3 ->
+ l3.poiType = this.roadwork?.poiType?.toString()
+ l3.generateTime = this.roadwork?.detectTime ?: 0L
+ l3.location = V2XMarkerLocation().also { l4 ->
+ val p = CoordinateTransform.WGS84ToGCJ02(this.roadwork?.center?.point?.lon ?: 0.0, this.roadwork?.center?.point?.lat ?: 0.0)
+ l4.lon = p[0]
+ l4.lat = p[1]
+ l4.angle = this.roadwork?.center?.road?.bearing?.toDouble() ?: 0.0
+ }
+ l3.infoId = id
+ })
+ }
+ AiRoadMarker.aiMakers[id]?.receive()
+ }
+
+fun V2XRoadXData.toRoadMarker(): V2XMarkerCardResult =
+ V2XMarkerCardResult().also { l1 ->
+ this.polygon?.takeIf { it.isNotEmpty() }?.also { old ->
+ l1.extras = HashMap>>().also { extra ->
+ extra["polygon"] = old.map { d ->
+ Pair(d.lon, d.lat)
+ }
+ extra["gps_location"] = listOf(Pair(this.center?.lon ?: 0.0, this.center?.lat ?: 0.0))
+ }
+ }
+
+ l1.exploreWay = ArrayList().also { l2 ->
+ l2.add(V2XMarkerExploreWay().also { l3 ->
+ l3.poiType = this.poiType
+ l3.generateTime = this.detectTime ?: 0L
+ l3.location = V2XMarkerLocation().also { l4 ->
+ val p = CoordinateTransform.WGS84ToGCJ02(this.center?.lon ?: 0.0, this.center?.lat ?: 0.0)
+ l4.lon = p[0]
+ l4.lat = p[1]
+ l4.angle = this.centerRoad?.bearing ?: 0.0
+ }
+ l3.infoId = this.index
+ })
+ }
+
+ AiRoadMarker.aiMakers[this.index]?.receive()
+ }
+
+fun MessagePad.TrackedObject.toRoadMarker(poiType: String): V2XMarkerCardResult =
+ V2XMarkerCardResult().also { l1 ->
+ this.polygonList?.takeIf { it.isNotEmpty() }?.also { old ->
+ l1.extras = HashMap>>().also { extra ->
+ extra["polygon"] = old.map { d -> Pair(d.longitude, d.latitude) }
+ extra["gps_location"] = listOf(Pair(this.longitude, this.latitude))
+ }
+ }
+ val id = "${this.longitude}_${this.latitude}"
+ l1.exploreWay = ArrayList().also { l2 ->
+ l2.add(V2XMarkerExploreWay().also { l3 ->
+ l3.poiType = poiType
+ l3.generateTime = 0L
+ l3.location = V2XMarkerLocation().also { l4 ->
+ val p = CoordinateTransform.WGS84ToGCJ02(this.longitude, this.latitude)
+ l4.lon = p[0]
+ l4.lat = p[1]
+ l4.angle = this.heading
+ }
+ l3.infoId = id
+ })
+ }
+ AiRoadMarker.aiMakers[id]?.receive()
+ }
+
+fun V2XMarkerCardResult.toV2XRoadEventEntity(): V2XRoadEventEntity =
+ V2XRoadEventEntity().also { l1 ->
+ val exploreWayList: List? = this.exploreWay
+ if (!exploreWayList.isNullOrEmpty() && exploreWayList.isNotEmpty()) {
+ for (markerExploreWay in exploreWayList) {
+ if (isRoadEvent(markerExploreWay.poiType)) {
+ val markerLocation = markerExploreWay.location
+ l1.location = markerLocation.toMarkerLocation()
+ l1.poiType = markerExploreWay.poiType
+ l1.noveltyInfo = markerExploreWay.toMarkExploreWay(this.extras)
+ l1.expireTime = 20000
+ }
+ }
+ }
+ }
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/V2XManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/V2XManager.kt
new file mode 100755
index 0000000000..8622fd1f21
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/V2XManager.kt
@@ -0,0 +1,257 @@
+package com.mogo.eagle.core.function.v2x.internal
+
+import android.os.Handler
+import android.os.Looper
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig
+import com.mogo.cloud.socket.SocketManager
+import com.mogo.eagle.core.function.v2x.internal.callback.IV2XCallback
+import com.mogo.eagle.core.function.v2x.internal.config.V2XConfig
+import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerResponse
+import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent
+import com.mogo.eagle.core.function.v2x.internal.http.V2XRefreshModel
+import com.mogo.eagle.core.function.v2x.internal.http.callback.IV2XRefreshCallback
+import com.mogo.eagle.core.function.v2x.internal.logger.Logger
+import com.mogo.eagle.core.function.v2x.internal.socket.*
+import com.mogo.eagle.core.function.v2x.internal.socket.V2XMessageListener_401012
+import com.mogo.eagle.core.function.v2x.internal.socket.V2XMessageListener_401018
+import com.mogo.eagle.core.function.v2x.internal.socket.V2XMessageListener_402000
+import com.mogo.eagle.core.function.v2x.internal.socket.V2XMessageListener_404000
+import com.mogo.eagle.core.function.v2x.internal.utils.DistanceUtils
+import java.util.concurrent.CopyOnWriteArrayList
+import java.util.concurrent.atomic.AtomicBoolean
+import java.util.concurrent.atomic.AtomicReference
+
+object V2XManager {
+
+ internal const val TAG = "V2XManager"
+
+ private val config: AtomicReference by lazy {
+ AtomicReference(null)
+ }
+
+ private val cbs by lazy {
+ CopyOnWriteArrayList()
+ }
+
+ private val lastLongitude by lazy {
+ AtomicReference(0.0)
+ }
+
+ private val lastLatitude by lazy {
+ AtomicReference(0.0)
+ }
+
+ private val realLongitude by lazy { AtomicReference(0.0) }
+
+ private val realLatitude by lazy { AtomicReference(0.0) }
+
+
+
+ /**
+ * 标识此参数是否启动
+ */
+ private val started by lazy {
+ AtomicBoolean(false)
+ }
+
+ private val refreshCallback = object : IV2XRefreshCallback {
+
+ override fun onSuccess(result: V2XMarkerResponse) {
+ cbs.forEach {
+ it.onAck(V2XEvent.Marker(result))
+ }
+ }
+
+ override fun onFail(msg: String?) {
+ cbs.forEach {
+ it.onFail(msg ?: "")
+ }
+ }
+ }
+
+
+ private val refreshTask = object : Runnable {
+ override fun run() {
+ V2XRefreshModel.querySnapshot(longitude = realLongitude.get(), latitude = realLatitude.get(), refreshCallback)
+ handler.postDelayed(this, config.get().durationForTriggerRefresh)
+ }
+ }
+
+ private val handler by lazy {
+ Handler(Looper.getMainLooper())
+ }
+
+ /**
+ * 根据所配置的参数,初始化V2X相关功能(注: 此方法不要重复调用,非首次调用会抛异常)
+ * @param config 相关配置类
+ */
+ fun init(config: V2XConfig) {
+ Logger.d(TAG, "-- init --")
+ if (V2XManager.config.get() != null) {
+ throw IllegalStateException("V2XManager has been initialized, don't initialize repeatably.")
+ }
+ V2XManager.config.set(config)
+ Logger.loggable = config.loggable
+ }
+
+ /**
+ * - 开启V2X功能, 此方法调用前,要确保满足以下两个条件:
+ * 1.初始化方法[init]已调用
+ * 2.确保[MoGoAiCloudClientConfig.sn]和[MoGoAiCloudClientConfig.token]两个值存在,如果其中有一个值不存在,不会启动相关功能
+ * - 此函数的功能如下:
+ * 1.建立长链接[SocketManager.init]
+ * 2.位置上报服务[LocationManager.init]和[LocationManager.start]
+ * 3.短链[V2XRefreshModel.querySnapshot]定时轮循,轮循时长取[V2XConfig.durationForTriggerRefresh]
+ */
+ fun start() {
+ Logger.d(TAG, "-- start --")
+ val config = config.get() ?: throw IllegalStateException("V2XManager has not been initialized, please invoke V2XManager#init(config: X2XConfig) firstly.")
+ if (started.get()) {
+ Logger.d(TAG, "-- has been started --")
+ return
+ }
+ if (config.aiCloudConfig.sn?.isBlank() == true) {
+ Logger.e(TAG, "sn is null or blank, please ensure sn exists and then invoke V2XManager#start() again.")
+ cbs.forEach {
+ it.onFail("sn is null or blank, please ensure sn exists and then invoke V2XManager#start() again.")
+ }
+ return
+ }
+ if (config.aiCloudConfig.token?.isBlank() == true) {
+ Logger.e(TAG, "token is null or blank, please ensure token exists and then invoke V2Manager#start() again.")
+ cbs.forEach {
+ it.onFail("token is null or blank, please ensure token exists and then invoke V2Manager#start() again.")
+ }
+ return
+ }
+ if (started.compareAndSet(false, true)) {
+ Logger.d(TAG, "-- start real --")
+ SocketManager.getInstance().init(config.context,0.0,0.0)
+ SocketManager.getInstance().registerOnMessageListener(401012, V2XMessageListener_401012(cbs))
+ SocketManager.getInstance().registerOnMessageListener(401018, V2XMessageListener_401018(cbs))
+ SocketManager.getInstance().registerOnMessageListener(402000, V2XMessageListener_402000(cbs))
+ SocketManager.getInstance().registerOnMessageListener(404000, V2XMessageListener_404000(cbs))
+ //SocketManager.getInstance().registerOnMessageListener(503000, V2XMessageListener_503000(cbs))
+ SocketManager.getInstance().registerOnMessageListener(70001, V2XMessageListener_70001(cbs))
+ handler.post(refreshTask)
+ }
+ }
+
+ /**
+ * @param sn 更新后的sn
+ * @param token 更新后的token
+ */
+ fun updateSnAndToken(sn: String?, token: String?) {
+ val config = config.get() ?: throw IllegalStateException("V2XManager has not been initialized, please invoke V2XManager#init(config: X2XConfig) firstly.")
+ sn ?: return
+ token ?: return
+ if (started.get()) {
+ return
+ }
+ config.aiCloudConfig.sn = sn
+ config.aiCloudConfig.token = token
+ start()
+ }
+
+ /**
+ * 停止V2X功能
+ * 1. 断开长链接[SocketManager.release]
+ * 2. 停止位置上报[LocationManager.stop]
+ * 3. 取消短链定时轮循任务
+ */
+ fun stop() {
+ Logger.d(TAG, "-- stop --")
+ if (config.get() == null) {
+ throw IllegalStateException("V2XManager has not been initialized, please invoke V2XManager#init(config: X2XConfig) firstly.")
+ }
+ if (started.compareAndSet(true, false)) {
+ Logger.d(TAG, "-- stop real --")
+ SocketManager.getInstance().release()
+ handler.removeCallbacks(refreshTask)
+ lastLatitude.set(0.0)
+ lastLongitude.set(0.0)
+ }
+ }
+
+ /**
+ * 添加相关信息接口回调
+ * @param cb 要添加的回调接口
+ */
+ fun addCallback(cb: IV2XCallback) {
+ Logger.d(TAG, "-- addCallback --")
+ if (cbs.contains(cb)) {
+ return
+ }
+ cbs += cb
+ }
+
+ /**
+ * 移除相关信息接口回调
+ * @param cb 要移除的回调接口
+ */
+ fun removeCallback(cb: IV2XCallback) {
+ Logger.d(TAG, "-- removeCallback --")
+ if (!cbs.contains(cb)) {
+ return
+ }
+ cbs.remove(cb)
+ }
+
+ /**
+ * 当自车位置变量时调用
+ * @param longitude 自车所在精度
+ * @param latitude 自车所在纬度
+ */
+ fun onLocationChanged(longitude: Double, latitude: Double) {
+ if (config.get() == null) {
+ throw IllegalStateException("V2XManager has not been initialized, please invoke V2XManager#init(config: X2XConfig) firstly.")
+ }
+ if (!started.get()) {
+ return
+ }
+ Logger.d(TAG, "--- onLocationChanged --[longitude: $longitude, latitude: $latitude]")
+ realLongitude.set(longitude)
+ realLatitude.set(latitude)
+ val oldLon = lastLongitude.get()
+ val oldLat = lastLatitude.get()
+ var update = false
+ try {
+ if (oldLon == 0.0 || oldLat == 0.0) {
+ Logger.d(TAG, "--- onLocationChanged -- first --[longitude: $longitude, latitude: $latitude]")
+ handler.removeCallbacks(refreshTask)
+ handler.post(refreshTask)
+ update = true
+ return
+ }
+ if (DistanceUtils.calculateLineDistance(oldLon, oldLat, longitude, latitude) >= config.get().distanceForTriggerRefresh) {
+ Logger.d(TAG, "--- onLocationChanged -- trigger --[longitude: $longitude, latitude: $latitude]")
+ handler.removeCallbacks(refreshTask)
+ handler.post(refreshTask)
+ update = true
+ }
+ } finally {
+ if (update) {
+ lastLatitude.set(latitude)
+ lastLongitude.set(longitude)
+ }
+ }
+ }
+
+ /**
+ * 是否已经初始化
+ * @return true: 已初始化过 false: 未初始化
+ */
+ fun hasInit() = getConfig() != null
+
+ /**
+ * 强制刷新道路事件
+ */
+ fun forceRefresh() {
+ if (hasInit()) {
+ handler.removeCallbacks(refreshTask)
+ handler.post(refreshTask)
+ }
+ }
+
+ internal fun getConfig() = config.get()
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/callback/IV2XCallback.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/callback/IV2XCallback.kt
new file mode 100644
index 0000000000..f755c465e4
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/callback/IV2XCallback.kt
@@ -0,0 +1,24 @@
+package com.mogo.eagle.core.function.v2x.internal.callback
+
+import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent
+
+interface IV2XCallback {
+
+
+ /**
+ * 获取到V2X事件成功回调
+ * @param event
+ * - 参数说明:目前此参数支持以下类型
+ * - [V2XEvent.ForwardsWarning]: 路口碰撞预警、盲区预警等预警事件, 数据实体取自[V2XEvent.ForwardsWarning.data]
+ * - [V2XEvent.Road]: 道路事件, 数据实体取自[V2XEvent.Road.data]
+ * - [V2XEvent.Warning]: 预警目标物事件, 数据实体取自[V2XEvent.Warning.data]
+ * - [V2XEvent.Marker]: 道路标记事件, 数据实体取自[V2XEvent.Marker.data]
+ */
+ fun onAck(event: V2XEvent)
+
+ /**
+ * V2X事件获取过程中,出现的异常信息,用于问题排查
+ * @param msg 异常信息
+ */
+ fun onFail(msg: String)
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/config/V2XConfig.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/config/V2XConfig.kt
new file mode 100755
index 0000000000..1ab70b67ac
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/config/V2XConfig.kt
@@ -0,0 +1,174 @@
+package com.mogo.eagle.core.function.v2x.internal.config
+
+import android.content.Context
+import com.mogo.cloud.passport.MoGoAiCloudClientConfig
+import com.mogo.eagle.core.function.v2x.internal.executor.Executors
+import java.util.concurrent.Executor
+import java.util.concurrent.TimeUnit
+import kotlin.IllegalStateException
+
+/**
+ * V2X相关配置
+ */
+class V2XConfig private constructor(builder: Builder) {
+
+ /**
+ * - 应用上下文
+ * - 必选项
+ * - 通过[Builder.context]设置
+ */
+ val context : Context by lazy {
+ builder.context?.applicationContext ?: throw IllegalStateException("context must not be null.")
+ }
+
+ /**
+ * - 云平台配置参数
+ * - 必选项
+ * - 通过[Builder.aiCloudConfig]设置
+ */
+ val aiCloudConfig by lazy {
+ builder.aiCloudConfig ?: throw IllegalStateException("aiCloudConfig must not be null.")
+ }
+
+ /**
+ * - 网络请求使用的线程池,IO类型
+ * - 可选项
+ * - 通过[Builder.executor]设置
+ */
+ val executor: Executor by lazy {
+ builder.executor ?: Executors.IO
+ }
+
+ /**
+ * - 是否开启日志
+ * - 可选项
+ * - 通过[Builder.loggable]设置,开发阶段可以打开,应用发布后记得关闭
+ */
+ val loggable: Boolean by lazy {
+ builder.loggable
+ }
+
+ /**
+ * - 公共参数, 默认为空
+ * - 可选项
+ * - 通过[Builder.staticParams]设置
+ */
+ val staticParams by lazy {
+ builder.staticParams ?: HashMap()
+ }
+
+ /**
+ * - 基础Url, 默认值为`http://dzt-launcherSnapshot.zhidaozhixing.com`
+ * - 可选项
+ * - 通过[Builder.baseUrl]设置
+ */
+ val baseUrl by lazy {
+ builder.baseUrl ?: "http://dzt-launcherSnapshot.zhidaozhixing.com"
+
+ }
+
+ /**
+ * - 多长时间请求一次自车周边信息,单位为毫秒,默认值为`6_000`毫秒
+ * - 可选项
+ * - 通过[Builder.durationForTriggerRefresh]设置
+ */
+ val durationForTriggerRefresh by lazy {
+ val duration = builder.durationForTriggerRefresh
+ if (duration == null || duration <= 0) TimeUnit.SECONDS.toMillis(60) else duration
+ }
+
+ /**
+ * - 自车行驶超过此长度,会刷新自车周边信息,单位为`米`
+ * - 可选项
+ * - 通过[Builder.distanceForTriggerRefresh]设置
+ */
+ val distanceForTriggerRefresh: Float by lazy {
+ val distance = builder.distanceForTriggerRefresh
+ if (distance == null || distance <= 0) 200f else distance
+ }
+
+ internal fun newBuilder() = Builder(this)
+
+ class Builder {
+
+ internal var context: Context? = null
+
+ internal var executor: Executor? = null
+
+ internal var loggable: Boolean = false
+
+ internal var staticParams: Map? = null
+
+ internal var aiCloudConfig: MoGoAiCloudClientConfig? = null
+
+ internal var durationForTriggerRefresh: Long? = null
+
+ internal var baseUrl: String? = null
+
+ internal var distanceForTriggerRefresh: Float? = null
+
+ constructor()
+
+ internal constructor(config: V2XConfig) {
+ context = config.context
+ executor = config.executor
+ loggable = config.loggable
+ baseUrl = config.baseUrl
+ staticParams = config.staticParams
+ aiCloudConfig = config.aiCloudConfig
+ durationForTriggerRefresh = config.durationForTriggerRefresh
+ distanceForTriggerRefresh = config.distanceForTriggerRefresh
+ }
+
+ /**
+ * 应用上下文,此参数为必选项,不设置会抛异常
+ */
+ fun context(context: Context) = apply { this.context = context }
+
+ /**
+ * 是否开启日志
+ */
+ fun loggable(loggable: Boolean) = apply { this.loggable = loggable }
+
+ /**
+ * 公共参数列表
+ */
+ fun staticParams(params: Map) = apply { this.staticParams = params }
+
+ /**
+ * 网络请求线程池,如未设置,会使用内置的线程池[Executors.IO]
+ */
+ fun executor(executor: Executor): Builder = apply {
+ if (this.executor != null) {
+ throw IllegalArgumentException("io executor has been initialized, don't set repeatedly.")
+ }
+ this.executor = executor
+ }
+
+ /**
+ * 刷新周边信息的时间间隔
+ * @param duration 时长
+ * @param unit 时间单位
+ */
+ fun durationForTriggerRefresh(duration: Long, unit: TimeUnit = TimeUnit.SECONDS) = apply { this.durationForTriggerRefresh = unit.toMillis(duration) }
+
+ /**
+ * @param distance 超过此距离会触发刷新周边道路信息,单位为米
+ */
+ fun distanceForTriggerRefresh(distance: Float) = apply { this.distanceForTriggerRefresh = distance }
+
+ /**
+ * 云平台配置信息,此参数为必选项,不设置会抛异常
+ * @param config 云平台配置
+ */
+ fun aiCloudConfig(config: MoGoAiCloudClientConfig) = apply { this.aiCloudConfig = config }
+
+ /**
+ * 云平台baseUrl
+ * @param baseUrl 云平台baseUrl
+ */
+ fun baseUrl(baseUrl: String) = apply { this.baseUrl = baseUrl }
+
+ fun build() : V2XConfig = V2XConfig(this)
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XAdvanceWarning.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XAdvanceWarning.kt
new file mode 100644
index 0000000000..df71ca8175
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XAdvanceWarning.kt
@@ -0,0 +1,120 @@
+package com.mogo.eagle.core.function.v2x.internal.data
+
+import androidx.annotation.Keep
+import java.io.Serializable
+
+/**
+ * 路口碰撞预警、盲区预警等数据实体
+ */
+@Keep
+class V2XAdvanceWarning: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -446395L
+ }
+
+ /**
+ * 物体唯一标识
+ */
+ var objectId: String? = null
+
+ /**
+ * 物体类型:
+ * 1-人
+ * 2-自行车
+ * 3-小轿车
+ * 4-摩托车
+ * 5-红绿灯
+ * 6-公交车
+ * 8-卡车
+ * 9-路边摄像头
+ */
+ var objectType: Int? = -1
+
+ /**
+ * 1-add
+ * 2-update
+ * 3-delete
+ */
+ var status: Int? = -1
+
+ /**
+ * 大类标识
+ * 1-预警
+ * 2-规划
+ * 3-拥堵
+ * 4-事故
+ */
+ var typeId: Int? = -1
+
+ /**
+ * 预警下发时间
+ */
+ var time: Long? = 0
+
+ /**
+ * 预警等级
+ */
+ var level: Int? = -1
+
+ /**
+ * 危险等级:
+ * 0-保留
+ * 1-模型原始颜色
+ * 2-通知--黄
+ * 3-警告--红
+ */
+ var threatLevel: Int? = -1
+
+ /**
+ * 目标预警物所在位置
+ */
+ var position: V2XLocation? = null
+
+ /**
+ * 目标预警物朝向
+ */
+ var heading: Double? = 0.0
+
+ /**
+ * 目标预警物速度
+ */
+ var speed: Double? = 0.0
+
+ /**
+ * 目标预警物到自车距离
+ */
+ var distance: Double? = 0.0
+
+ /**
+ * 道路ID
+ */
+ var roadId: String? = null
+
+ /**
+ * 车道ID
+ */
+ var laneId: String? = null
+
+ /**
+ * 车道号:
+ * 中心线编号为0, 中心线右侧编号为负数。
+ * eg: 3车道通行Road的车道编号,0,-1,-2,-3
+ */
+ var laneNum: Int? = Integer.MIN_VALUE
+
+ /**
+ * 线性经纬度轨迹列表(高德)
+ */
+ var gdLocusList: List? = null
+
+ /**
+ * 轨迹列表(Wgs84坐标系)
+ */
+ var locusList: List? = null
+
+ override fun toString(): String {
+ return "V2XAdvanceWarning(objectId=$objectId, objectType=$objectType, status=$status, typeId=$typeId, time=$time, level=$level, threatLevel=$threatLevel, position=$position, heading=$heading, speed=$speed, distance=$distance, roadId=$roadId, laneId=$laneId, laneNum=$laneNum, gdLocusList=$gdLocusList, locusList=$locusList)"
+ }
+}
+
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XBaseData.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XBaseData.kt
new file mode 100644
index 0000000000..d7df5b04f0
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XBaseData.kt
@@ -0,0 +1,9 @@
+package com.mogo.eagle.core.function.v2x.internal.data
+
+open class V2XBaseData {
+
+ @JvmField
+ var code = -1
+ @JvmField
+ var msg: String? = null
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XLocation.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XLocation.kt
new file mode 100644
index 0000000000..3ce50a38f0
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XLocation.kt
@@ -0,0 +1,26 @@
+package com.mogo.eagle.core.function.v2x.internal.data
+
+import androidx.annotation.Keep
+import java.io.Serializable
+
+@Keep
+class V2XLocation: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 经度
+ */
+ var lon: Double = 0.0
+
+ /**
+ * 纬度
+ */
+ var lat: Double = 0.0
+
+ override fun toString(): String {
+ return "V2XLocation(lon=$lon, lat=$lat)"
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XMarkerCardResult.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XMarkerCardResult.kt
new file mode 100644
index 0000000000..48bd6a55e4
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XMarkerCardResult.kt
@@ -0,0 +1,817 @@
+package com.mogo.eagle.core.function.v2x.internal.data
+
+import androidx.annotation.Keep
+import java.io.Serializable
+
+@Keep
+class V2XMarkerCardResult: V2XBaseData(), Serializable {
+
+ companion object {
+ private const val serialVersionUID = -92L
+ }
+
+ /**
+ * 要查询的数据类型
+ * CARD_TYPE_USER_DATA:用户相关数据
+ * CARD_TYPE_ROAD_CONDITION:路况数据
+ * CARD_TYPE_LIVE:正播相关数据
+ */
+ var dataType: List? = null
+
+ /**
+ * 车聊聊数据集合
+ */
+ var carChat: List? = null
+
+ /**
+ * 分享的音乐数据集合
+ */
+ var shareMusic: List? = null
+
+ /**
+ * 新鲜事分享的数据集合
+ */
+ var noveltyInfo: List? = null
+
+ /**
+ * 在线车辆数据集合
+ */
+ var onlineCar: List? = null
+
+ /**
+ * 探路数据集合
+ */
+ var exploreWay: List? = null
+
+ /**
+ * 服务端下发消息时间
+ */
+ var messageTime: Long = 0
+
+ /**
+ * 额外信息
+ */
+ var extras: Map? = null
+
+ override fun toString(): String {
+ return "MarkerCardResult(dataType=$dataType, carChat=$carChat, shareMusic=$shareMusic, noveltyInfo=$noveltyInfo, onlineCar=$onlineCar, exploreWay=$exploreWay, messageTime=$messageTime, extras=$extras)"
+ }
+}
+
+@Keep
+class V2XMarkerCarChat: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -92L
+ }
+
+ /**
+ * 卡片类型
+ */
+ var type: String? = null
+
+ /**
+ * 地址信息
+ */
+ var location: V2XMarkerLocation? = null
+
+ /**
+ * 用户信息
+ */
+ var userInfo: V2XMarkerUserInfo? = null
+
+ override fun toString(): String {
+ return "V2XMarkerCarChat(type=$type, location=$location, userInfo=$userInfo)"
+ }
+}
+
+@Keep
+class V2XMarkerShareMusic: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 事件类型
+ */
+ var type: String? = null
+
+ /**
+ * 音乐专辑信息
+ */
+ var bookInfo: String? = null
+
+ /**
+ * 歌曲ID
+ */
+ var id = 0
+
+ /**
+ * 点赞数
+ */
+ var likeNumber = 0
+
+ /**
+ * 位置信息
+ */
+ var location: V2XMarkerLocation? = null
+
+ /**
+ * 已弃用
+ */
+ var mediaId: String? = null
+
+ /**
+ * 歌曲封面-已弃用
+ */
+ var mediaImg: String? = null
+
+ /**
+ * 歌曲名字
+ */
+ var mediaName: String? = null
+
+ /**
+ * 歌手名字
+ */
+ var mediaSinger: String? = null
+
+ /**
+ * 播放地址
+ */
+ var mediaUrl: String? = null
+
+ /**
+ * 分享文案
+ */
+ var shareContentText: String? = null
+
+ /**
+ * 分享类型
+ */
+ var shareType = 0
+
+ /**
+ * 用户信息
+ */
+ var userInfo: V2XMarkerUserInfo? = null
+
+ override fun toString(): String {
+ return "V2XMarkerShareMusic(bookInfo=$bookInfo, id=$id, likeNumber=$likeNumber, location=$location, mediaId=$mediaId, mediaImg=$mediaImg, mediaName=$mediaName, mediaSinger=$mediaSinger, mediaUrl=$mediaUrl, shareContentText=$shareContentText, shareType=$shareType, type=$type, userInfo=$userInfo)"
+ }
+}
+
+/**
+ * 新鲜事儿Marker数据
+ */
+@Keep
+class V2XMarkerNoveltyInfo: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 事件类型
+ */
+ var type: String? = null
+
+ /**
+ * 车机唯一标识
+ */
+ var sn: String? = null
+
+ /**
+ * 标记坐标
+ */
+ var location: V2XMarkerLocation? = null
+
+ /**
+ * POI类型
+ */
+ var poiType: String? = null
+
+ /**
+ * 新鲜事分享内容
+ */
+ var contentData: ContentData? = null
+
+ @Keep
+ class ContentData: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 信息ID
+ */
+ var infoId: String? = null
+
+ /**
+ * 分享内容
+ */
+ var content: String? = null
+
+ /**
+ * 分享内容左上角图标
+ */
+ var iconUrl: String? = null
+
+ /**
+ * 分享内容图片
+ */
+ var imgUrl: String? = null
+
+ /**
+ * 点赞数
+ */
+ var likeNum: Long = 0
+
+ /**
+ * 标题
+ */
+ var title: String? = null
+
+ /**
+ * 加油站油价
+ */
+ var gasPrices: String? = null
+
+ /**
+ * 是否显示导航
+ */
+ var isDisplayNavigation = false
+
+ /**
+ * 是否显示好友主页
+ */
+ var isDesplayHost = false
+
+ /**
+ * 是否是新鲜的
+ */
+ var isFabulous = false
+
+ /**
+ * 分享类型
+ */
+ var styleType: String? = null
+
+ /**
+ * 上报类型:
+ * 1-用户上报
+ * 2-后台上报
+ * 3-三方上报
+ */
+ var uploadType: String? = null
+
+ override fun toString(): String {
+ return "ContentData(content=$content, iconUrl=$iconUrl, imgUrl=$imgUrl, infoId=$infoId, likeNum=$likeNum, title=$title, gasPrices=$gasPrices, isDisplayNavigation=$isDisplayNavigation, isDesplayHost=$isDesplayHost, isFabulous=$isFabulous, styleType=$styleType, uploadType=$uploadType)"
+ }
+ }
+
+ override fun toString(): String {
+ return "V2XMarkerNoveltyInfo(type=$type, sn=$sn, location=$location, poiType=$poiType, contentData=$contentData)"
+ }
+}
+
+@Keep
+class V2XMarkerOnlineCar: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 事件类型
+ */
+ var type: String? = null
+
+ /**
+ * 车辆位置
+ */
+ var location: V2XMarkerLocation? = null
+
+ /**
+ * focus:false-未关注,true-关注
+ */
+ var focus: Boolean? = null
+
+ /**
+ * 用户数据
+ */
+ var userInfo: V2XMarkerUserInfo? = null
+
+ /**
+ * 车辆数据
+ */
+ var carInfo: V2XMarkerCarInfo? = null
+
+ /**
+ * 车辆路线
+ */
+ var pois: List? = null
+
+ /**
+ * 动态数据
+ */
+ var dynamicData: V2XMarkerDynamicData? = null
+
+ /**
+ * 爱好数据集合
+ */
+ var hobbyData: V2XMarkerHobbyDatum? = null
+
+ /**
+ * 活动范围数据集合
+ */
+ var activitiesScope: List? = null
+
+ /**
+ * 匹配度
+ */
+ var compatibility = 0
+
+ override fun toString(): String {
+ return "V2XMarkerOnlineCar(type=$type, location=$location, focus=$focus, userInfo=$userInfo, carInfo=$carInfo, pois=$pois, dynamicData=$dynamicData, hobbyData=$hobbyData, activitiesScope=$activitiesScope, compatibility=$compatibility)"
+ }
+}
+
+@Keep
+class V2XMarkerExploreWay: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 事件类型
+ */
+ var type: String? = null
+
+ /**
+ * 信息ID
+ */
+ var infoId: String? = null
+
+ /**
+ * POI类型
+ */
+ var poiType: String? = null
+
+ /**
+ * 车辆唯一标识
+ */
+ var sn: String? = null
+
+ /**
+ * 位置信息
+ */
+ var location: V2XMarkerLocation? = null
+
+ /**
+ * 车辆方位
+ */
+ var direction = 0
+
+ /**
+ * 是否可直播(1为可直播,0不可直播)
+ */
+ var canLive: String? = "0"
+
+ /**
+ * 是图片还是视频(1视频,0图片)
+ */
+ var fileType = 0
+
+ /**
+ * 车辆详细地址
+ */
+ var addr: String? = null
+
+ /**
+ * 事件下发的时间
+ */
+ var generateTime: Long = 0L
+
+ /**
+ * 城市名称
+ */
+ var cityName: String? = null
+
+ /**
+ * 距离
+ */
+ var distance = 0.0
+
+ /**
+ * 用户信息
+ */
+ var userInfo: V2XMarkerUserInfo? = null
+
+ /**
+ * 视频地址和图片地址
+ */
+ var items: List? = null
+
+ /**
+ * 上报类型:
+ * 1-用户上报
+ * 2-后台上报
+ * 3-三方上报
+ */
+ var uploadType: String? = null
+
+ /**
+ * 是否是新鲜的
+ */
+ var isFabulous = false
+
+ /**
+ * 需要用户判断是否拥堵 进行UGC问答
+ */
+ var infoCheckNode = 0
+
+ var coordinateType: Int? = null
+
+ override fun toString(): String {
+ return "V2XMarkerExploreWay(infoId=$infoId, type=$type, poiType=$poiType, sn=$sn, location=$location, direction=$direction, canLive=$canLive, fileType=$fileType, addr=$addr, generateTime=$generateTime, cityName=$cityName, distance=$distance, userInfo=$userInfo, items=$items, uploadType=$uploadType, isFabulous=$isFabulous, infoCheckNode=$infoCheckNode, coordinateType=$coordinateType)"
+ }
+}
+
+@Keep
+class V2XMarkerUserInfo: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 自车车机唯一标识
+ */
+ var sn: String? = null
+
+ /**
+ * 用户ID
+ */
+ var userId: Long = 0
+
+ /**
+ * 用户昵称
+ */
+ var userName: String? = null
+
+ /**
+ * 用户头像
+ */
+ var userHead: String? = null
+
+ /**
+ * gender": "男|女|无(也可以0|1|2根据实际库存返回即可)
+ */
+ var gender: String? = null
+
+ /**
+ * 年龄段,可以为空,与车聊聊一致
+ */
+ var age: Int? = null
+
+ /**
+ * 末次活跃周驾驶行为平均得分
+ */
+ var lastActiveweekAvgscore: String? = null
+
+ /**
+ * 车辆安全标签
+ */
+ var safeLabel: String? = null
+
+ /**
+ * 1-老司机
+ * 2-安全驾驶
+ * 3-危险驾驶
+ */
+ var safeLabelType = 0
+
+ override fun toString(): String {
+ return "V2XMarkerUserInfo(sn=$sn, userId=$userId, userName=$userName, userHead=$userHead, gender=$gender, age=$age, lastActiveweekAvgscore=$lastActiveweekAvgscore, safeLabel=$safeLabel, safeLabelType=$safeLabelType)"
+ }
+}
+
+@Keep
+class V2XMarkerCarInfo: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 车品牌Logo资源链接
+ */
+ var carBrandLogoUrl: String? = null
+
+ /**
+ * 车型名称
+ */
+ var carTypeName: String? = null
+
+ /**
+ * 车类型:
+ * 0-普通车辆
+ * 1-警车
+ * 2-救护车
+ * 3-失控车
+ * 4-道路救援车
+ */
+ var vehicleType: Int = 0
+
+ /**
+ * 车辆直播相关信息
+ */
+ var carLiveInfo: CarLiveInfo? = null
+
+ @Keep
+ class CarLiveInfo: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * rtmp视频直播地址rtmp://
+ */
+ var videoUrl: String? = null
+
+ /**
+ * 直播频道【直播心跳接口参数】C_1
+ */
+ var videoChannel: String? = null
+
+ /**
+ * 直播源sn
+ */
+ var videoSn: String? = null
+
+ override fun toString(): String {
+ return "CarLiveInfo(videoUrl=$videoUrl, videoChannel=$videoChannel, videoSn=$videoSn)"
+ }
+ }
+
+ override fun toString(): String {
+ return "V2XMarkerCarInfo(carBrandLogoUrl=$carBrandLogoUrl, carTypeName=$carTypeName, vehicleType=$vehicleType, carLiveInfo=$carLiveInfo)"
+ }
+}
+
+@Keep
+class V2XMarkerCarPois: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 位置信息,返回的值不为空并且长度为2的倍数
+ */
+ var coordinates: List<*>? = null
+
+ /**
+ * 车的朝向角度
+ */
+ var angle = 0.0
+
+ /**
+ * 地区code
+ */
+ var adcode: String? = null
+
+ override fun toString(): String {
+ return "V2XMarkerCarPois(coordinates=$coordinates, angle=$angle, adcode=$adcode)"
+ }
+}
+
+@Keep
+class V2XMarkerDynamicData: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * QQ音乐,懒人听书,乐听头条 2 为书籍听书,3 为新闻,1 为qq音乐
+ */
+ var type = 0
+
+ /**
+ * qq音乐id,书的bookId
+ */
+ var mediaId: String? = null
+
+ /**
+ * qq音乐url 懒人听书为“”
+ */
+ var mediaUrl: String? = null
+
+ /**
+ * 歌曲名 ,当前播放书名,新闻标题内容
+ */
+ var mediaName: String? = null
+
+ /**
+ * 演唱歌手,当前章节,新闻来源
+ */
+ var mediaSinger: String? = null
+
+ /**
+ * 歌曲封面,书籍封面,新闻预览图
+ */
+ var mediaImg: String? = null
+
+ /**
+ * 音乐类别,类似经典 ,流行只有qq特有
+ */
+ var mediaType: String? = null
+
+ /**
+ * 音频总时长
+ */
+ var maxTime = 0
+
+ /**
+ * 懒人听书json串
+ */
+ var bookInfo: String? = null
+
+ /**
+ * 当前播放时长,可以不加,播放进度单独独立出来
+ */
+ var curTime = 0
+
+ /**
+ * 是否是本地音频,只有qq音乐
+ */
+ var isLocalMedia = false
+
+ /**
+ * 播放模式,顺序,单曲循环,随机
+ */
+ var mediaPlayMode = 0
+
+ /**
+ * 1 播放 2 缓冲 0 暂停/停止 -1 播放错误
+ */
+ var playState = 0
+
+ override fun toString(): String {
+ return "V2XMarkerDynamicData(type=$type, mediaId=$mediaId, mediaUrl=$mediaUrl, mediaName=$mediaName, mediaSinger=$mediaSinger, mediaImg=$mediaImg, mediaType=$mediaType, maxTime=$maxTime, bookInfo=$bookInfo, curTime=$curTime, isLocalMedia=$isLocalMedia, mediaPlayMode=$mediaPlayMode, playState=$playState)"
+ }
+}
+
+@Keep
+class V2XMarkerHobbyDatum: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 最喜欢的两位歌手
+ */
+ var singerTop2: List? = null
+
+ /**
+ * 最喜欢的两种音乐类型
+ */
+ var songTypeTop2: List? = null
+
+ /**
+ * 最喜欢的资讯类型
+ */
+ var newsType: List? = null
+
+ /**
+ * 最喜欢听的两本书
+ */
+ var listenBookTop2: List? = null
+
+ /**
+ * 是否喜爱社交
+ */
+ var ifSociety: List? = null
+
+ @Keep
+ class MarkerOnlineTag: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 社交内容
+ */
+ var content: String? = null
+
+ /**
+ * 是否选中
+ */
+ var isCheck: Boolean = false
+
+ override fun toString(): String {
+ return "MarkerOnlineTag(content=$content, isCheck=$isCheck)"
+ }
+ }
+
+ override fun toString(): String {
+ return "V2XMarkerHobbyDatum(singerTop2=$singerTop2, songTypeTop2=$songTypeTop2, newsType=$newsType, listenBookTop2=$listenBookTop2, ifSociety=$ifSociety)"
+ }
+}
+
+@Keep
+class V2XMarkerActivitiesScope: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 活动范围内容
+ */
+ var content: String? = null
+
+ /**
+ * 是否选中
+ */
+ var isCheck: Boolean = false
+
+ override fun toString(): String {
+ return "V2XMarkerActivitiesScope(content=$content, isCheck=$isCheck)"
+ }
+}
+
+/**
+ * 道路情报,V2X预警,地图道路事件POI,违章停车POI等
+ */
+@Keep
+class MarkerExploreWayItem: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 缩略图
+ */
+ var thumbnail: String? = null
+
+ /**
+ * 正式图
+ */
+ var url: String? = null
+
+ /**
+ * 描述字段
+ */
+ var content: String? = null
+
+ /**
+ * 违章停车人数
+ */
+ var illegalCount = 0.0
+
+ override fun toString(): String {
+ return "MarkerExploreWayItem(thumbnail=$thumbnail, url=$url, content=$content, illegalCount=$illegalCount)"
+ }
+}
+
+@Keep
+class V2XMarkerLocation: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 纬度
+ */
+ var lat: Double = 0.0
+
+ /**
+ * 纬度
+ */
+ var lon: Double = 0.0
+
+ /**
+ * 车头角度,可以没有
+ */
+ var angle: Double = 0.0
+
+ /**
+ * 具体的位置信息
+ */
+ var address: String? = null
+
+ override fun toString(): String {
+ return "V2XMarkerLocation(lat=$lat, lon=$lon, angle=$angle, address=$address)"
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XMarkerResponse.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XMarkerResponse.kt
new file mode 100644
index 0000000000..790bd71b0a
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XMarkerResponse.kt
@@ -0,0 +1,28 @@
+package com.mogo.eagle.core.function.v2x.internal.data
+
+import androidx.annotation.Keep
+import com.elegant.network.BaseResp
+import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerCardResult
+import java.io.Serializable
+
+@Keep
+class V2XMarkerResponse: BaseResp(), Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 响应的数据集
+ */
+ var result: V2XMarkerCardResult? = null
+
+ /**
+ * TODO 不知道啥含义,可以忽略
+ */
+ var sign: String? = null
+
+ override fun toString(): String {
+ return "V2XMarkerResponse(result=$result, sign=$sign)"
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XOptimalRoute.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XOptimalRoute.kt
new file mode 100644
index 0000000000..dd27d302af
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XOptimalRoute.kt
@@ -0,0 +1,56 @@
+package com.mogo.eagle.core.function.v2x.internal.data
+
+import androidx.annotation.Keep
+import com.mogo.eagle.core.function.v2x.internal.data.V2XLocation
+import java.io.Serializable
+
+/**
+ * 最优路线推荐
+ */
+@Keep
+class V2XOptimalRoute: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 自车SN
+ */
+ var sn: String? = null
+
+ /**
+ * 道路ID
+ */
+ var road_id: String? = null
+
+ /**
+ * 车道ID-2D路段
+ */
+ var current_lane_id: String? = null
+
+ /**
+ * 车道号:中心线编号为0, 中心线右侧编号为负数,3车道通行Road的车道编号,0,-1,-2,-3
+ */
+ var current_lane_num = 0
+
+ /**
+ * 最优车道平均速度
+ */
+ var most_speed = 0.0
+
+ /**
+ * 车道号:中心线编号为0, 中心线右侧编号为负数,3车道通行Road的车道编号,0,-1,-2,-3
+ */
+ var most_lane_num = 0
+
+ /**
+ * Wgs84坐标系,线性经纬度轨迹列表
+ */
+ var locus_list: List? = null
+
+ /**
+ * 高德坐标系Gcj,线性经纬度轨迹列表
+ */
+ var gd_locus_list: List? = null
+}
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XRoadXEvent.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XRoadXEvent.kt
new file mode 100644
index 0000000000..a692c2dfa7
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XRoadXEvent.kt
@@ -0,0 +1,59 @@
+package com.mogo.eagle.core.function.v2x.internal.data
+
+import androidx.annotation.Keep
+
+
+@Keep
+data class V2XRoadXData(
+ val poiType: String? = null,
+ val center: Point? = null,
+ val centerRoad: CenterRoad? = null,
+ val congestionLanes: List? = null,
+ val coordinateType: Int? = -1,
+ val id: String? = null,
+ val index: String? = null,
+ val obstacles: List? = null,
+ val polygon: List? = null,
+ val type: Int? = 0,
+ val detectTime: Long? = 0L,
+ val crossId: String? = null
+)
+
+@Keep
+data class CenterRoad(
+ val bearing: Double? = 0.0,
+ val laneNo: Int? = null,
+ val roadId: String? = null,
+ val roadName: String? = null,
+ val tileId: Int? = 0,
+ val heading: String? = null
+)
+
+@Keep
+data class Congestion(
+ val laneId: Int? = null,
+ val level: Int? = null
+)
+
+@Keep
+data class Obstacle(
+ val boundBox: List? = null,
+ val center: Point? = null,
+ val id: Int? = null,
+ val polygon: List? = null,
+ val score: Double? = null,
+ val type: Int? = null
+)
+
+
+@Keep
+data class Point(
+ val lon: Double? = null,
+ val lat: Double? = null
+)
+
+@Keep
+data class PointX(
+ val x: Double? = null,
+ val y: Double? = null
+)
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XWarningTarget.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XWarningTarget.kt
new file mode 100644
index 0000000000..8173032600
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/data/V2XWarningTarget.kt
@@ -0,0 +1,176 @@
+package com.mogo.eagle.core.function.v2x.internal.data
+
+import androidx.annotation.Keep
+import com.mogo.eagle.core.function.v2x.internal.data.V2XLocation
+import java.io.Serializable
+
+/**
+ * 预警目标物数据模型
+ */
+@Keep
+class V2XWarningTarget: Serializable {
+
+ companion object {
+ private const val serialVersionUID = -93L
+ }
+
+ /**
+ * 事件类型
+ * 行人-1
+ * 自行车-2
+ * 摩托车-4
+ * 骑行车辆-11
+ */
+ var type = 0
+
+ /**
+ * 目标物纬度
+ */
+ var lat = 0.0
+
+ /**
+ * 目标物经度
+ */
+ var lon = 0.0
+
+ /**
+ * 目标物颜色
+ */
+ var targetColor: String? = null
+
+ /**
+ * 目标物距自车距离
+ */
+ var distance = 0.0
+
+ /**
+ * 预测碰撞点位置-纬度
+ */
+ var collisionLat = 0.0
+
+ /**
+ * 预测碰撞点位置-经度
+ */
+ var collisionLon = 0.0
+
+ /**
+ * 目标物行驶朝向
+ */
+ var angle = 0.0
+
+ /**
+ * 目标物方位
+ * 方位:前 后 左 右
+ */
+ var direction = 0
+
+ /**
+ * 目标物速度
+ */
+ var speed = 0f
+
+ /**
+ * 停止线经纬度
+ */
+ var stopLines: List? = null
+
+ /**
+ * 自车到停止线距离
+ */
+ var stopLineDistance = 0.0
+
+ /**
+ * 道路唯一标识
+ */
+ var roadId: String? = null
+
+ /**
+ * 车道唯一标识
+ */
+ var laneId: String? = null
+
+ /**
+ * 识别物体唯一标识
+ */
+ var uuid: String? = null
+
+ /**
+ * 红绿灯颜色
+ */
+ var color: String? = null
+
+ /**
+ * 车ID 暂不使用
+ */
+ var carId: String? = null
+
+ /**
+ * 预警文案
+ */
+ var warningContent: String? = null
+
+ /**
+ * 车头朝向
+ */
+ var heading = 0.0
+
+ /**
+ * 系统时间 暂时没用
+ */
+ var systemTime: Long = 0
+
+ /**
+ * 定位卫星时间 暂时没用
+ */
+ var satelliteTime: Long = 0
+
+ /**
+ * 预警蒙层等展示时长
+ */
+ var showTime: Long = 0
+
+ /**
+ * 设计划线宽度与道路同宽
+ */
+ var roadwidth = 0f
+
+ /**
+ * 自组字段, tts播报
+ */
+ var tts: String? = null
+
+ /**
+ * 自车位置
+ */
+ var carLocation: V2XLocation? = null
+
+ override fun toString(): String {
+ return "V2XWarningEntity{" +
+ "type=" + type +
+ ", lat=" + lat +
+ ", lon=" + lon +
+ ", targetColor='" + targetColor + '\'' +
+ ", distance=" + distance +
+ ", collisionLat=" + collisionLat +
+ ", collisionLon=" + collisionLon +
+ ", angle=" + angle +
+ ", direction=" + direction +
+ ", speed=" + speed +
+ ", stopLines=" + stopLines +
+ ", stopLineDistance=" + stopLineDistance +
+ ", roadId='" + roadId + '\'' +
+ ", laneId='" + laneId + '\'' +
+ ", uuid='" + uuid + '\'' +
+ ", color='" + color + '\'' +
+ ", carId='" + carId + '\'' +
+ ", warningContent='" + warningContent + '\'' +
+ ", heading=" + heading +
+ ", systemTime=" + systemTime +
+ ", satelliteTime=" + satelliteTime +
+ ", showTime=" + showTime +
+ ", roadwidth=" + roadwidth +
+ ", tts='" + tts + '\'' +
+ ", carLocation=" + carLocation +
+ '}'
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/event/V2XEvent.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/event/V2XEvent.kt
new file mode 100644
index 0000000000..40bf0b65c4
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/event/V2XEvent.kt
@@ -0,0 +1,75 @@
+package com.mogo.eagle.core.function.v2x.internal.event
+
+import com.mogo.eagle.core.function.v2x.internal.data.*
+import roadwork.Road.RW_PB
+
+sealed class V2XEvent {
+
+ /**
+ * 长链-路口碰撞预警、盲区预警等通用Bean
+ */
+ class ForwardsWarning(val type: Int = 404000, val data: V2XAdvanceWarning): V2XEvent() {
+ override fun toString(): String {
+ return "ForwardsWarning(type=$type, data=$data)"
+ }
+ }
+
+ /**
+ * 长链-最优推荐线种
+ */
+ class OptimalRoute(val type: Int = 402000, val data: V2XOptimalRoute): V2XEvent() {
+ override fun toString(): String {
+ return "OptimalRoute(type=$type, data=$data)"
+ }
+ }
+
+ /**
+ * 长链-预警目标物
+ */
+ class Warning(val type: Int = 401018, val data: V2XWarningTarget): V2XEvent() {
+ override fun toString(): String {
+ return "Warning(type=$type, data=$data)"
+ }
+ }
+
+ /**
+ * 长链-道路事件
+ */
+ class Road(val type: Int = 401012, val data: V2XMarkerCardResult): V2XEvent() {
+ override fun toString(): String {
+ return "Road(type=$type, data=$data)"
+ }
+ }
+
+ /**
+ * 长链-道路事件云识别
+ */
+ class RoadAI(val type: Int = 503000, val data: RW_PB): V2XEvent() {
+
+ override fun toString(): String {
+ return "RoadAI(type=$type, data=$data)"
+ }
+ }
+
+
+ /**
+ * 短链-道路标记事件
+ */
+ class Marker(val data: V2XMarkerResponse): V2XEvent() {
+
+ override fun toString(): String {
+ return "Marker(data=$data)"
+ }
+ }
+
+
+ /**
+ * 长链-道路事件扩展数据结构
+ */
+ class RoadEventX(val type: Int = 70001, val data: V2XRoadXData): V2XEvent() {
+
+ override fun toString(): String {
+ return "RoadEventX(type=$type, data=$data)"
+ }
+ }
+}
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/executor/Executors.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/executor/Executors.kt
new file mode 100755
index 0000000000..aed7f4549c
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/executor/Executors.kt
@@ -0,0 +1,35 @@
+package com.mogo.eagle.core.function.v2x.internal.executor
+
+import java.util.concurrent.*
+import java.util.concurrent.atomic.AtomicLong
+import kotlin.math.max
+import kotlin.math.min
+
+
+internal object Executors {
+
+ private val group: ThreadGroup by lazy {
+ ThreadGroup("v2x-group")
+ }
+
+ private val CPU_CORE_COUNT by lazy {
+ Runtime.getRuntime().availableProcessors()
+ }
+
+ private val DEFAULT_CORE_COUNT by lazy {
+ (max(2, min(CPU_CORE_COUNT - 1, 6)) * 3) + 1
+ }
+
+ private const val DEFAULT_MAX_COUNT_4_IO = 128
+
+ val IO by lazy {
+ val idGenerator = AtomicLong(0)
+ ThreadPoolExecutor(
+ DEFAULT_CORE_COUNT, DEFAULT_MAX_COUNT_4_IO, 30, TimeUnit.SECONDS, LinkedBlockingDeque()
+ ) { r ->
+ Thread(group, r).apply {
+ name = "io-thread-${idGenerator.getAndIncrement()}"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/V2XRefreshModel.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/V2XRefreshModel.kt
new file mode 100644
index 0000000000..2b57db3ab8
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/V2XRefreshModel.kt
@@ -0,0 +1,84 @@
+package com.mogo.eagle.core.function.v2x.internal.http
+
+import com.elegant.network.utils.GsonUtil
+import com.elegant.network.utils.SignUtil
+import com.elegant.utils.CommonUtils
+import com.mogo.cloud.network.RetrofitFactory
+import com.mogo.eagle.core.function.v2x.internal.V2XManager
+import com.mogo.eagle.core.function.v2x.internal.config.V2XConfig
+import com.mogo.eagle.core.function.v2x.internal.data.V2XLocation
+import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerResponse
+import com.mogo.eagle.core.function.v2x.internal.http.api.V2XApiService
+import com.mogo.eagle.core.function.v2x.internal.http.body.V2XRefreshEntity
+import com.mogo.eagle.core.function.v2x.internal.http.callback.IV2XRefreshCallback
+import com.mogo.eagle.core.function.v2x.internal.utils.DeviceUtils
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.Disposable
+import io.reactivex.schedulers.Schedulers
+
+internal class V2XRefreshModel {
+
+ companion object {
+
+ fun querySnapshot(
+ longitude: Double,
+ latitude: Double,
+ callback: IV2XRefreshCallback?
+ ): Disposable? {
+ val config = V2XManager.getConfig()
+ val retrofit = RetrofitFactory.getInstance(config.baseUrl) ?: return null
+ return retrofit
+ .create(V2XApiService::class.java)
+ .querySnapshotSync(buildParams(longitude, latitude, config))
+ .subscribeOn(Schedulers.from(config.executor))
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe({ data ->
+ if (data == null) {
+ callback?.onFail("returned data is null.")
+ return@subscribe
+ }
+ if (data.code != 0 && data.code != 200) {
+ callback?.onFail("code:${data.code}, msg: ${data.msg}")
+ } else {
+ callback?.onSuccess(data)
+ }
+ }, {
+ callback?.onFail(it.message)
+ })
+ }
+
+ private fun buildParams(
+ longitude: Double,
+ latitude: Double,
+ config: V2XConfig
+ ): Map = mutableMapOf().apply {
+ putAll(config.staticParams.let {
+ val handled = mutableMapOf()
+ it.asIterable().forEach { itx ->
+ val value = itx.value
+ if (value != null) {
+ handled[itx.key] = value
+ }
+ }
+ handled
+ })
+ this["netType"] = CommonUtils.getNetworkType(config.context)
+ this["cellId"] = DeviceUtils.getCellId(config.context) ?: ""
+ this["sn"] = config.aiCloudConfig.sn
+ this["ticket"] = config.aiCloudConfig.token
+ this["sig"] = SignUtil.createSign(this, "JGjZx6")
+ this["data"] = GsonUtil.jsonFromObject(V2XRefreshEntity().apply {
+ limit = 999
+ location = V2XLocation().also {
+ it.lat = latitude
+ it.lon = longitude
+ }
+ radius = 1000
+ dataType.add("CARD_TYPE_ROAD_CONDITION")
+ viewPush = true
+ })
+ }
+ }
+
+
+}
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/api/V2XApiService.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/api/V2XApiService.kt
new file mode 100644
index 0000000000..a8f3266337
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/api/V2XApiService.kt
@@ -0,0 +1,14 @@
+package com.mogo.eagle.core.function.v2x.internal.http.api
+
+import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerResponse
+import io.reactivex.Maybe
+import retrofit2.http.FieldMap
+import retrofit2.http.FormUrlEncoded
+import retrofit2.http.POST
+
+internal interface V2XApiService {
+
+ @FormUrlEncoded
+ @POST("/yycp-launcherSnapshot/launcherSnapshot/querySnapshotSync")
+ fun querySnapshotSync(@FieldMap parameters: Map): Maybe
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/body/V2XRefreshEntity.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/body/V2XRefreshEntity.kt
new file mode 100644
index 0000000000..82d5661ab5
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/body/V2XRefreshEntity.kt
@@ -0,0 +1,39 @@
+package com.mogo.eagle.core.function.v2x.internal.http.body
+
+import androidx.annotation.Keep
+import com.mogo.eagle.core.function.v2x.internal.data.V2XLocation
+
+/**
+ * 刷新地图信息接口
+ */
+@Keep
+internal class V2XRefreshEntity {
+
+ @JvmField
+ var dataType: MutableList = mutableListOf() // 要查询的类型
+
+ @JvmField
+ var limit = 50 // 请求数量
+
+ @JvmField
+ var radius = 2000 // 地理围栏半径(米)
+
+ @JvmField
+ var location // 坐标
+ : V2XLocation? = null
+ @JvmField
+ var sn: String? = null
+
+ @JvmField
+ var onlyFocus // 是否仅查询已关注的好友
+ = false
+ @JvmField
+ var onlySameCity // 是否仅查询注册城市相同的同城用户
+ = false
+ @JvmField
+ var viewPush // 是否走V2X通道 ,true-401011,false -401001
+ = false
+ @JvmField
+ var onlyRealUser = false
+
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/callback/IV2XRefreshCallback.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/callback/IV2XRefreshCallback.kt
new file mode 100644
index 0000000000..3fb17ffef7
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/http/callback/IV2XRefreshCallback.kt
@@ -0,0 +1,11 @@
+package com.mogo.eagle.core.function.v2x.internal.http.callback
+
+/**
+ * 刷新回调
+ */
+internal interface IV2XRefreshCallback {
+
+ fun onSuccess(result: T)
+
+ fun onFail(msg: String?)
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/logger/Logger.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/logger/Logger.kt
new file mode 100644
index 0000000000..c230c13abf
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/logger/Logger.kt
@@ -0,0 +1,24 @@
+package com.mogo.eagle.core.function.v2x.internal.logger
+
+import android.util.Log
+
+internal object Logger {
+
+ var loggable: Boolean = false
+
+ fun v(tag: String, msg: String) = if (loggable) Log.v(tag, msg) else 0
+
+ fun d(tag: String, msg: String) = if (loggable) Log.d(tag, msg) else 0
+
+ fun i(tag: String, msg: String) = if (loggable) Log.i(tag, msg) else 0
+
+ fun w(tag: String, msg: String) = if (loggable) Log.w(tag, msg) else 0
+
+ fun e(tag: String, msg: String, t: Throwable? = null) = if (loggable) {
+ if (t == null) {
+ Log.e(tag, msg)
+ } else {
+ Log.e(tag, msg, t)
+ }
+ } else 0
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_401012.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_401012.kt
new file mode 100644
index 0000000000..94fa71b532
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_401012.kt
@@ -0,0 +1,27 @@
+package com.mogo.eagle.core.function.v2x.internal.socket
+
+import com.mogo.cloud.socket.IMogoCloudSocketOnMessageListener
+import com.mogo.eagle.core.function.v2x.internal.V2XManager
+import com.mogo.eagle.core.function.v2x.internal.callback.IV2XCallback
+import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerCardResult
+import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent
+import com.mogo.eagle.core.function.v2x.internal.logger.Logger
+
+internal class V2XMessageListener_401012(val cbs: Iterable?): IMogoCloudSocketOnMessageListener {
+
+ override fun target(msgType: Int): Class = V2XMarkerCardResult::class.java
+
+ override fun onMsgReceived(msgType: Int, data: V2XMarkerCardResult?) {
+ if (msgType != 401012) {
+ return
+ }
+ if (data == null) {
+ Logger.i(V2XManager.TAG, "V2XMessageListener_401012:message is null!")
+ return
+ }
+ Logger.i(V2XManager.TAG, "V2XMessageListener_401012:$data")
+ cbs?.forEach {
+ it.onAck(V2XEvent.Road(data = data))
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_401018.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_401018.kt
new file mode 100644
index 0000000000..b9f8c8747d
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_401018.kt
@@ -0,0 +1,27 @@
+package com.mogo.eagle.core.function.v2x.internal.socket
+
+import com.mogo.cloud.socket.IMogoCloudSocketOnMessageListener
+import com.mogo.eagle.core.function.v2x.internal.V2XManager
+import com.mogo.eagle.core.function.v2x.internal.callback.IV2XCallback
+import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent
+import com.mogo.eagle.core.function.v2x.internal.data.V2XWarningTarget
+import com.mogo.eagle.core.function.v2x.internal.logger.Logger
+
+internal class V2XMessageListener_401018(val cbs: Iterable?): IMogoCloudSocketOnMessageListener {
+
+ override fun target(msgType: Int): Class = V2XWarningTarget::class.java
+
+ override fun onMsgReceived(msgType: Int, data: V2XWarningTarget?) {
+ if (msgType != 401018) {
+ return
+ }
+ if (data == null) {
+ Logger.i(V2XManager.TAG, "V2XMessageListener_401018:message is null!")
+ return
+ }
+ Logger.i(V2XManager.TAG, "V2XMessageListener_401018:$data")
+ cbs?.forEach {
+ it.onAck(V2XEvent.Warning(data = data))
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_402000.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_402000.kt
new file mode 100644
index 0000000000..c968eb1e5a
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_402000.kt
@@ -0,0 +1,27 @@
+package com.mogo.eagle.core.function.v2x.internal.socket
+
+import com.mogo.cloud.socket.IMogoCloudSocketOnMessageListener
+import com.mogo.eagle.core.function.v2x.internal.V2XManager
+import com.mogo.eagle.core.function.v2x.internal.callback.IV2XCallback
+import com.mogo.eagle.core.function.v2x.internal.data.V2XOptimalRoute
+import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent
+import com.mogo.eagle.core.function.v2x.internal.logger.Logger
+
+internal class V2XMessageListener_402000(val cbs: Iterable?): IMogoCloudSocketOnMessageListener {
+
+ override fun target(msgType: Int): Class = V2XOptimalRoute::class.java
+
+ override fun onMsgReceived(msgType: Int, data: V2XOptimalRoute?) {
+ if (msgType != 402000) {
+ return
+ }
+ if (data == null) {
+ Logger.i(V2XManager.TAG, "V2XMessageListener_402000:message is null!")
+ return
+ }
+ Logger.i(V2XManager.TAG, "V2XMessageListener_402000:$data")
+ cbs?.forEach {
+ it.onAck(V2XEvent.OptimalRoute(data = data))
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_404000.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_404000.kt
new file mode 100644
index 0000000000..4d9c046429
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_404000.kt
@@ -0,0 +1,27 @@
+package com.mogo.eagle.core.function.v2x.internal.socket
+
+import com.mogo.cloud.socket.IMogoCloudSocketOnMessageListener
+import com.mogo.eagle.core.function.v2x.internal.V2XManager
+import com.mogo.eagle.core.function.v2x.internal.callback.IV2XCallback
+import com.mogo.eagle.core.function.v2x.internal.data.V2XAdvanceWarning
+import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent
+import com.mogo.eagle.core.function.v2x.internal.logger.Logger
+
+internal class V2XMessageListener_404000(val cbs: Iterable?): IMogoCloudSocketOnMessageListener {
+
+ override fun target(msgType: Int): Class = V2XAdvanceWarning::class.java
+
+ override fun onMsgReceived(msgType: Int, data: V2XAdvanceWarning?) {
+ if (msgType != 404000) {
+ return
+ }
+ if (data == null) {
+ Logger.i(V2XManager.TAG, "V2XMessageListener_404000:message is null!")
+ return
+ }
+ Logger.i(V2XManager.TAG, "V2XMessageListener_404000:$data")
+ cbs?.forEach {
+ it.onAck(V2XEvent.ForwardsWarning(data = data))
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_503000.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_503000.kt
new file mode 100644
index 0000000000..cbfeca79df
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_503000.kt
@@ -0,0 +1,27 @@
+package com.mogo.eagle.core.function.v2x.internal.socket
+
+import com.mogo.cloud.socket.IMogoCloudSocketOnMessageListener
+import com.mogo.eagle.core.function.v2x.internal.V2XManager
+import com.mogo.eagle.core.function.v2x.internal.callback.IV2XCallback
+import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent.RoadAI
+import com.mogo.eagle.core.function.v2x.internal.logger.Logger
+import roadwork.Road.RW_PB
+
+internal class V2XMessageListener_503000(val cbs: Iterable?): IMogoCloudSocketOnMessageListener {
+
+ override fun target(msgType: Int): Class = RW_PB::class.java
+
+ override fun onMsgReceived(msgType: Int, data: RW_PB?) {
+ if (msgType != 503000) {
+ return
+ }
+ if (data == null) {
+ Logger.i(V2XManager.TAG, "V2XMessageListener_503000:message is null!")
+ return
+ }
+ Logger.i(V2XManager.TAG, "V2XMessageListener_503000:$data")
+ cbs?.forEach {
+ it.onAck(RoadAI(data = data))
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_70001.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_70001.kt
new file mode 100644
index 0000000000..cb1b9be044
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/socket/V2XMessageListener_70001.kt
@@ -0,0 +1,27 @@
+package com.mogo.eagle.core.function.v2x.internal.socket
+
+import com.mogo.cloud.socket.IMogoCloudSocketOnMessageListener
+import com.mogo.eagle.core.function.v2x.internal.V2XManager
+import com.mogo.eagle.core.function.v2x.internal.callback.IV2XCallback
+import com.mogo.eagle.core.function.v2x.internal.data.V2XRoadXData
+import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent
+import com.mogo.eagle.core.function.v2x.internal.logger.Logger
+
+internal class V2XMessageListener_70001(val cbs: Iterable?): IMogoCloudSocketOnMessageListener {
+
+ override fun target(msgType: Int): Class = V2XRoadXData::class.java
+
+ override fun onMsgReceived(msgType: Int, data: V2XRoadXData?) {
+ if (msgType != 70001) {
+ return
+ }
+ if (data == null) {
+ Logger.i(V2XManager.TAG, "V2XMessageListener_70001:message is null!")
+ return
+ }
+ Logger.i(V2XManager.TAG, "V2XMessageListener_70001:$data")
+ cbs?.forEach {
+ it.onAck(V2XEvent.RoadEventX(data = data))
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/utils/DeviceUtils.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/utils/DeviceUtils.kt
new file mode 100644
index 0000000000..b7c6dc3312
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/utils/DeviceUtils.kt
@@ -0,0 +1,46 @@
+package com.mogo.eagle.core.function.v2x.internal.utils
+
+import android.Manifest
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.pm.PackageManager
+import android.telephony.CellLocation
+import android.telephony.TelephonyManager
+import android.telephony.cdma.CdmaCellLocation
+import android.telephony.gsm.GsmCellLocation
+import java.lang.Exception
+
+internal class DeviceUtils {
+
+ companion object {
+
+ @SuppressLint("MissingPermission")
+ @JvmStatic
+ fun getCellId(context: Context): String? {
+ val tm = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
+ val pm = context.packageManager
+ val accessCoarseLocationPermission = PackageManager.PERMISSION_GRANTED ==
+ pm.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION, context.packageName)
+ val accessFineLocationPermission = PackageManager.PERMISSION_GRANTED ==
+ pm.checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, context.packageName)
+ if (!accessCoarseLocationPermission || !accessFineLocationPermission) return "noPermission"
+ var location: CellLocation? = null
+ try {
+ location = tm.cellLocation
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ if (location != null) {
+ // Gsm网络 , 联通移动的网络属于这一套
+ if (location is GsmCellLocation) {
+ val cellid = location.cid
+ return cellid.toString()
+ // Cdma网络 , 电信网络属于这一种
+ } else if (location is CdmaCellLocation) {
+ return location.baseStationId.toString()
+ }
+ }
+ return null
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/utils/DistanceUtils.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/utils/DistanceUtils.kt
new file mode 100644
index 0000000000..43f59ca92c
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/internal/utils/DistanceUtils.kt
@@ -0,0 +1,52 @@
+package com.mogo.eagle.core.function.v2x.internal.utils
+
+import kotlin.math.asin
+import kotlin.math.cos
+import kotlin.math.sin
+import kotlin.math.sqrt
+
+internal class DistanceUtils {
+
+ companion object {
+
+ /**
+ * @param lon1
+ * @param lat1
+ * @param lon2
+ * @param lat2
+ * @return 两坐标的距离 单位:米(M)
+ */
+ fun calculateLineDistance(lon1: Double, lat1: Double, lon2: Double, lat2: Double): Float {
+ return try {
+ var var2 = lon1
+ var var4 = lat1
+ var var6 = lon2
+ var var8 = lat2
+ var2 *= 0.01745329251994329
+ var4 *= 0.01745329251994329
+ var6 *= 0.01745329251994329
+ var8 *= 0.01745329251994329
+ val var10 = sin(var2)
+ val var12 = sin(var4)
+ val var14 = cos(var2)
+ val var16 = cos(var4)
+ val var18 = sin(var6)
+ val var20 = sin(var8)
+ val var22 = cos(var6)
+ val var24 = cos(var8)
+ val var28 = DoubleArray(3)
+ val var29 = DoubleArray(3)
+ var28[0] = var16 * var14
+ var28[1] = var16 * var10
+ var28[2] = var12
+ var29[0] = var24 * var22
+ var29[1] = var24 * var18
+ var29[2] = var20
+ (asin(sqrt((var28[0] - var29[0]) * (var28[0] - var29[0]) + (var28[1] - var29[1]) * (var28[1] - var29[1]) + (var28[2] - var29[2]) * (var28[2] - var29[2])) / 2.0) * 1.27420015798544E7).toFloat()
+ } catch (var26: Throwable) {
+ var26.printStackTrace()
+ 0.0f
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/road/V2XEventResult.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/road/V2XEventResult.kt
new file mode 100644
index 0000000000..7a98c26ab4
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/road/V2XEventResult.kt
@@ -0,0 +1,73 @@
+package com.mogo.eagle.core.function.v2x.road
+
+import androidx.annotation.Keep
+
+import com.google.gson.annotations.SerializedName
+import com.mogo.eagle.core.data.BaseData
+
+
+@Keep
+data class V2XEventResult (
+ @SerializedName("result")
+ var result: Result?
+): BaseData()
+
+@Keep
+data class Result(
+ @SerializedName("eventList")
+ var v2XEventList: List?
+)
+
+@Keep
+data class V2XEvent(
+ @SerializedName("receiveTime")
+ var receiveTime: Long,
+
+ @SerializedName("detectTime")
+ var detectTime: Long,
+
+ @SerializedName("id")
+ var id: String?,
+
+ @SerializedName("center")
+ var center: Center?,
+
+ @SerializedName("centerRoad")
+ var centerRoad: CenterRoad?,
+
+ @SerializedName("radius")
+ var radius: Double,
+
+ @SerializedName("poiType")
+ var poiType: String?,
+
+ @SerializedName("coordinateType")
+ var coordinateType:Int? = null
+)
+
+@Keep
+data class Center(
+ @SerializedName("lat")
+ var lat: Double,
+
+ @SerializedName("lon")
+ var lon: Double
+)
+
+@Keep
+data class CenterRoad(
+ @SerializedName("bearing")
+ var bearing: Double,
+
+ @SerializedName("laneNo")
+ var laneNo: Long,
+
+ @SerializedName("roadId")
+ var roadId: String?,
+
+ @SerializedName("roadName")
+ var roadName: String?,
+
+ @SerializedName("tileId")
+ var tileId: Long
+)
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/road/V2XEventServiceApi.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/road/V2XEventServiceApi.kt
new file mode 100644
index 0000000000..5b73866375
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/road/V2XEventServiceApi.kt
@@ -0,0 +1,11 @@
+package com.mogo.eagle.core.function.v2x.road
+
+import io.reactivex.Observable
+import retrofit2.http.GET
+import retrofit2.http.Query
+
+interface V2XEventServiceApi {
+
+ @GET("/eagleEye-mis/config/queryV2NInformation")
+ fun queryAllV2XEventsByLineId(@Query("lineId") lineId: String, @Query("sn") sn: String): Observable
+}
\ No newline at end of file
diff --git a/core/function-impl/mogo-core-function-v2x/src/main/proto/road.proto b/core/function-impl/mogo-core-function-v2x/src/main/proto/road.proto
new file mode 100644
index 0000000000..71c087aa5b
--- /dev/null
+++ b/core/function-impl/mogo-core-function-v2x/src/main/proto/road.proto
@@ -0,0 +1,59 @@
+syntax = "proto2";
+
+package roadwork;
+
+message RW_PB {
+ required Roadwork_PB roadwork =1;
+ optional Header header = 2;
+}
+
+message Roadwork_PB{
+ optional string id = 1; // 对应id
+ required int32 score = 2; // 置信度
+ required int64 detect_time = 3; // 发送时间
+ required int32 poi_type = 4; // poi 类型
+ optional int32 type = 5; // 事件类型
+ required Center_PB center = 6; // 中心点坐标
+ repeated GPSPoint_PB polygon = 7; // 多边形范围
+ repeated Road_PB road = 8; // 车道集合信息
+}
+
+message GPSPoint_PB {
+ required double lat = 1; // 纬度
+ required double lon = 2; // 经度
+ optional double hgt = 3; // 高程
+}
+
+message Road_PB{
+ required string road_id = 1; // 路段id
+ required string lane_no = 2; // 车道号
+ required string tile_id = 3; // 瓦片id
+ required int32 bearing = 4; // 方向角,正北是0度 顺时针
+}
+
+message Center_PB{
+ required Road_PB road = 1; // 道路信息
+ required GPSPoint_PB point = 2; // 坐标
+}
+
+// header
+
+message Time {
+ optional uint32 sec = 1; // 秒
+ optional uint32 nsec = 2; // 纳秒
+}
+
+message Header {
+ // Sequence number for each message. Each module maintains its own counter for
+ // sequence_num, always starting from 1 on boot.
+ optional uint32 seq = 1;
+
+ // Message publishing time in seconds.
+ optional Time stamp = 2;
+
+ // frame id
+ optional string frame_id = 3;
+
+ // Module name.
+ optional string module_name = 4;
+}
diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/CloudPoiManager.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/CloudPoiManager.java
index 540ffc7574..7bb1b06c72 100644
--- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/CloudPoiManager.java
+++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/CloudPoiManager.java
@@ -7,6 +7,7 @@ import android.util.ArrayMap;
import com.elegant.network.utils.GsonUtil;
import com.mogo.eagle.core.data.R;
import com.mogo.eagle.core.data.enums.EventTypeEnum;
+import com.mogo.eagle.core.data.enums.EventTypeEnumNew;
import com.mogo.eagle.core.data.map.PoiWrapper;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
@@ -44,7 +45,7 @@ public class CloudPoiManager {
R.drawable.module_common_icon_map_marker_road_block_off2, R.drawable.module_common_icon_map_marker_road_block_off2_white, "封路"));
poiWrapper.put(EventTypeEnum.FOURS_ROAD_WORK.getPoiType(), new PoiWrapper(EventTypeEnum.FOURS_ROAD_WORK.getPoiType(),
R.drawable.module_common_icon_map_marker_road_work2, R.drawable.module_common_icon_map_marker_road_work2_white, "施工"));
- poiWrapper.put(EventTypeEnum.AI_ROAD_WORK.getPoiType(), new PoiWrapper(EventTypeEnum.AI_ROAD_WORK.getPoiType(),
+ poiWrapper.put(EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType(), new PoiWrapper(EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType(),
R.drawable.module_common_icon_map_marker_road_work2, R.drawable.module_common_icon_map_marker_road_work2_white, "施工"));
poiWrapper.put(EventTypeEnum.FOURS_BLOCK_UP.getPoiType(), new PoiWrapper(EventTypeEnum.FOURS_BLOCK_UP.getPoiType(),
R.drawable.module_common_icon_map_marker_road_block_up2, R.drawable.module_common_icon_map_marker_road_block_up2_white, "拥堵"));
diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt
index 1f4090e56a..24fd2fe73e 100644
--- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt
+++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt
@@ -7,18 +7,6 @@ package com.mogo.eagle.core.data.config
*/
object HmiBuildConfig {
- /**
- * 是否展示 自动驾驶 按钮
- */
- @JvmField
- var isShowAutopilotStatusView = true
-
- /**
- * 是否展示 切换视角 按钮
- */
- @JvmField
- var isShowPerspectiveSwitchView = true
-
/**
* 是否展示 转向灯ui
*/
@@ -43,12 +31,6 @@ object HmiBuildConfig {
@JvmField
var isShowTrafficLightView = false
- /**
- * 是否显示摄像头图标
- */
- @JvmField
- var isShowCameraView = true
-
/**
* 是否展示 sn绑定的弹框
*/
diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt
index 748b847aef..977ff69174 100644
--- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt
+++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/EventTypeEnumNew.kt
@@ -33,12 +33,6 @@ enum class EventTypeEnumNew(
"注意施工占道", "注意施工占道"
),
- //施工-AI云下发
- AI_ROAD_WORK(
- "100061", "道路施工", "前方施工", R.drawable.icon_warning_v2x_road_construction,
- "前方施工", "道路施工"
- ),
-
//拥堵
FOURS_BLOCK_UP(
"10007", "道路拥堵", "前方拥堵", R.drawable.icon_warning_v2x_congestion,
@@ -112,6 +106,12 @@ enum class EventTypeEnumNew(
GHOST_PROBE("10024", "前方盲区行人预警", "前方盲区行人预警", R.drawable.icon_warning_v2x_pedestrian_crossing,
"前方盲区行人通行,请注意", "前方盲区即将有行人通过,请减速慢行"),
+ //接管
+ TAKE_OVER_EVENT(
+ "20000", "注意周围、立即接管", "注意周围、立即接管", R.drawable.icon_warning_take_over,
+ "注意周围、立即接管", "自动驾驶退出请立即接管"
+ ),
+
// 前方静止or慢速车辆报警
ALERT_FRONT_CAR("99999"),
@@ -133,21 +133,30 @@ enum class EventTypeEnumNew(
// 违章停车
ALERT_ILLEGAL_PARK("99992"),
- //-------------v2n start ------------>
+ //TODO 这个确认值
+ TYPE_USECASE_OPTIMAL_LANE(
+ 0x2B06.toString(),
+ "最优车道",
+ poiTypeSrcVr = R.drawable.v2x_icon_live_logo,
+ content = "最优车道",
+ tts = "最优车道"
+ ),
+
+ //-------------obu v2v start ------------>
TYPE_USECASE_ID_FCW(
- 2000.toString(),
+ 2010.toString(),
"前向碰撞预警",
poiTypeSrcVr = R.drawable.icon_warning_v2x_collision_warning,
content = "前车碰撞预警",
tts = "小心前车"
),
- // TYPE_USECASE_ID_ICW(
- // 1.toString(),
- // "交叉路口碰撞预警",
- // poiTypeSrcVr = R.drawable.icon_warning_v2x_collision_warning,
- // content = "交叉路口碰撞预警",
- // tts = "注意交叉路口车辆"
- // ),
+ TYPE_USECASE_ID_ICW(
+ 2009.toString(),
+ "交叉路口碰撞预警",
+ poiTypeSrcVr = R.drawable.icon_warning_v2x_collision_warning,
+ content = "交叉路口碰撞预警",
+ tts = "注意交叉路口车辆"
+ ),
TYPE_USECASE_ID_LTA(
2001.toString(),
"左转辅助",
@@ -205,16 +214,15 @@ enum class EventTypeEnumNew(
content = "注意特种车辆通行",
tts = "请避让特种车辆"
),
- //-------------v2n end ------------>
+ //-------------obu v2v end ------------>
-
- //---------弱势交通参与者 start ------>
+ //---------弱势交通参与者 obu and cloud start ------>
TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES(
1001.toString(),
"弱势交通参与者碰撞预警",
poiTypeSrcVr = R.drawable.icon_warning_v2x_motorcycle_collision,
- content = "注意机动车",
- tts = "注意机动车"
+ content = "注意摩托车",
+ tts = "注意摩托车"
),
TYPE_USECASE_ID_VRUCW_NOT_MOTOR_VEHICLES(
1002.toString(),
@@ -237,10 +245,9 @@ enum class EventTypeEnumNew(
content = "前方有未知障碍物",
tts = "前方有未知障碍物"
),
- //---------弱势交通参与者 end -------->
+ //---------弱势交通参与者 obu and cloud end -------->
-
- //--------------红绿灯 start -------> TODO 修改重复
+ //--------------红绿灯 start ------->
TYPE_USECASE_ID_IVP_RED(
1666.toString(),
"闯红灯预警",
@@ -258,7 +265,7 @@ enum class EventTypeEnumNew(
),
//-------------红绿灯 end ---------->
- //-----------道路危险情况预警 start --------------->
+ //-----------道路危险情况预警 obu start --------------->
TYPE_USECASE_ID_BREAKDOWN_WARNING( //故障车辆
101.toString(),
"车辆故障",
@@ -308,10 +315,9 @@ enum class EventTypeEnumNew(
content = "您已超速,请减速行驶",
tts = "您已超速,请减速行驶"
),
- //------------道路危险情况预警 end ----------->
+ //------------道路危险情况预警 obu end ----------->
-
- //------------车内标牌 start -------------->
+ //------------车内标牌 obu start -------------->
TYPE_ID_SHAPR_TURNS(
2.toString(),
"急转弯",
@@ -447,13 +453,44 @@ enum class EventTypeEnumNew(
),
TYPE_USECASE_ID_ACCIDENT(
244.toString(),
- "事故",
+ "交通事故",
poiTypeSrcVr = R.drawable.v2x_icon_jiaotongshigu_vr,
- content = "前方%s米事故",
- tts = "前方%s米事故"
+ content = "前方%s米交通事故",
+ tts = "前方%s米交通事故"
),
- //------------车内标牌 end -------------->
+ //------------车内标牌 obu end -------------->
+ TYPE_SOCKET_ROAD_CONGESTION(
+ "100071",
+ "交通拥堵",
+ poiTypeSrcVr = R.drawable.v2x_icon_yongdu_vr,
+ content = "前方%s米交通拥堵",
+ tts = "前方%s米交通拥堵"
+ ),
+
+ TYPE_SOCKET_ROAD_JINGZHI(
+ "100251",
+ "前方%s米静止障碍物占道",
+ poiTypeSrcVr = R.drawable.v2x_icon_jingzhi_zhangai,
+ content = "前方%s米静止障碍物占道",
+ tts = "前方%s米静止障碍物占道"
+ ),
+
+ TYPE_SOCKET_ROAD_SHIGU(
+ "100321",
+ "前方%s米道路事故",
+ poiTypeSrcVr = R.drawable.v2x_icon_shigu_sanjiaopai,
+ content = "前方%s米道路事故",
+ tts = "前方%s米道路事故"
+ ),
+
+ TYPE_SOCKET_ROAD_SHIGONG(
+ "100061",
+ "前方%s米道路施工",
+ poiTypeSrcVr = R.drawable.v2x_icon_shigong_zhandao,
+ content = "前方%s米道路施工",
+ tts = "前方%s米道路施工"
+ ),
TYPE_ERROR(
0.toString(),
@@ -463,8 +500,9 @@ enum class EventTypeEnumNew(
tts = ""
),
- TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯,请优先通行"),
-
+ TYPE_VIP_IDENTIFICATION_PASS("20022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行,已为您变为绿灯", "VIP车辆优先通行,已为您变为绿灯"),
+ TYPE_VIP_IDENTIFICATION_EXTEND("20023", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行,已为您延长绿灯", "VIP车辆优先通行,已为您延长绿灯"),
+ TYPE_VIP_ERROR_IDENTIFICATION("20024", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败,稍后重试"),
TYPE_OPTIMAL_ROUTE_RECOMMEND("2000", "", "", R.drawable.icon_warning_v2x_optimal_route, "为您推荐最优路线", "已为您选择最优路线");
@@ -480,7 +518,6 @@ enum class EventTypeEnumNew(
TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.poiTypeStr
ROAD_CLOSED.poiType -> ROAD_CLOSED.poiTypeStr
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.poiTypeStr
- AI_ROAD_WORK.poiType -> AI_ROAD_WORK.poiTypeStr
FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.poiTypeStr
FOURS_PONDING.poiType -> FOURS_PONDING.poiTypeStr
FOURS_FOG.poiType -> FOURS_FOG.poiTypeStr
@@ -502,7 +539,6 @@ enum class EventTypeEnumNew(
TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.poiTypeStrVr
ROAD_CLOSED.poiType -> ROAD_CLOSED.poiTypeStrVr
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.poiTypeStrVr
- AI_ROAD_WORK.poiType -> AI_ROAD_WORK.poiTypeStrVr
FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.poiTypeStrVr
FOURS_PONDING.poiType -> FOURS_PONDING.poiTypeStrVr
FOURS_FOG.poiType -> FOURS_FOG.poiTypeStrVr
@@ -524,7 +560,6 @@ enum class EventTypeEnumNew(
TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.poiTypeSrcVr
ROAD_CLOSED.poiType -> ROAD_CLOSED.poiTypeSrcVr
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.poiTypeSrcVr
- AI_ROAD_WORK.poiType -> AI_ROAD_WORK.poiTypeSrcVr
FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.poiTypeSrcVr
FOURS_PONDING.poiType -> FOURS_PONDING.poiTypeSrcVr
FOURS_FOG.poiType -> FOURS_FOG.poiTypeSrcVr
@@ -546,7 +581,7 @@ enum class EventTypeEnumNew(
fun getPoiTypeBg(poiType: String, isVrMode: Boolean): Int {
return when (poiType) {
FOURS_BLOCK_UP.poiType, FOURS_LIVING.poiType-> if (isVrMode) R.drawable.bg_v2x_event_type_orange_vr else R.drawable.bg_v2x_event_type_orange
- TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType, FOURS_ROAD_WORK.poiType, AI_ROAD_WORK.poiType,
+ TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType, FOURS_ROAD_WORK.poiType,
FOURS_PONDING.poiType, FOURS_FOG.poiType, FOURS_ICE.poiType, FOURS_ACCIDENT.poiType,
FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType, FOURS_ACCIDENT_03.poiType,
FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> if (isVrMode) R.drawable.bg_v2x_event_type_red_vr else R.drawable.bg_v2x_event_type_read
@@ -562,7 +597,7 @@ enum class EventTypeEnumNew(
FOURS_BLOCK_UP.poiType, FOURS_LIVING.poiType ->
R.drawable.bg_v2x_event_type_orange
TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType,
- FOURS_ROAD_WORK.poiType, AI_ROAD_WORK.poiType, FOURS_PONDING.poiType,
+ FOURS_ROAD_WORK.poiType, FOURS_PONDING.poiType,
FOURS_FOG.poiType, FOURS_ICE.poiType,
FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType,
FOURS_ACCIDENT_02.poiType, FOURS_ACCIDENT_03.poiType,
@@ -579,65 +614,40 @@ enum class EventTypeEnumNew(
fun isRoadEvent(poiType: String?): Boolean {
return when (poiType) {
TRAFFIC_CHECK.poiType, ROAD_CLOSED.poiType,
- FOURS_ROAD_WORK.poiType, AI_ROAD_WORK.poiType, FOURS_BLOCK_UP.poiType,
+ FOURS_ROAD_WORK.poiType, FOURS_BLOCK_UP.poiType,
FOURS_PONDING.poiType, FOURS_FOG.poiType,
FOURS_ICE.poiType, FOURS_ACCIDENT.poiType,
FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType,
FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType,
- FOURS_ACCIDENT_05.poiType, GHOST_PROBE.poiType, AI_ROAD_WORK.poiType -> true
+ FOURS_ACCIDENT_05.poiType, GHOST_PROBE.poiType,
+ TYPE_SOCKET_ROAD_SHIGONG.poiType,
+ TYPE_SOCKET_ROAD_JINGZHI.poiType,
+ TYPE_SOCKET_ROAD_SHIGU.poiType,
+ TYPE_SOCKET_ROAD_CONGESTION.poiType -> true
else -> false
}
}
- /**
- * 是否需要UGC预警
- */
- @JvmStatic
- fun isNeedRoadEventUgc(poiType: String?): Boolean {
- return when (poiType) {
- ROAD_CLOSED.poiType, FOURS_ROAD_WORK.poiType, AI_ROAD_WORK.poiType,
- FOURS_BLOCK_UP.poiType, FOURS_ACCIDENT.poiType,
- FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType,
- FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType,
- FOURS_ACCIDENT_05.poiType, GHOST_PROBE.poiType -> true
- else -> false
- }
- }
-
-
@JvmStatic
fun getTts(poiType: String?): String {
return when (poiType) {
TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.tts
ROAD_CLOSED.poiType -> ROAD_CLOSED.tts
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.tts
- AI_ROAD_WORK.poiType -> AI_ROAD_WORK.tts
FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.tts
FOURS_PONDING.poiType -> FOURS_PONDING.tts
FOURS_FOG.poiType -> FOURS_FOG.tts
FOURS_ICE.poiType -> FOURS_ICE.tts
FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType,
FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> FOURS_ACCIDENT.tts
+ TYPE_SOCKET_ROAD_SHIGONG.poiType -> TYPE_SOCKET_ROAD_SHIGONG.tts
+ TYPE_SOCKET_ROAD_JINGZHI.poiType -> TYPE_SOCKET_ROAD_JINGZHI.tts
+ TYPE_SOCKET_ROAD_SHIGU.poiType -> TYPE_SOCKET_ROAD_SHIGU.tts
+ TYPE_SOCKET_ROAD_CONGESTION.poiType -> TYPE_SOCKET_ROAD_CONGESTION.tts
else -> "道路事件"
}
}
- @JvmStatic
- fun getTtsWithFeedback(poiType: String?): String {
- return when (poiType) {
- TRAFFIC_CHECK.poiType -> "交通检查"
- ROAD_CLOSED.poiType -> "封路"
- FOURS_ROAD_WORK.poiType -> "施工"
- AI_ROAD_WORK.poiType -> "施工"
- FOURS_BLOCK_UP.poiType -> "道路拥堵"
- FOURS_PONDING.poiType -> "道路积水"
- FOURS_FOG.poiType -> "出现浓雾"
- FOURS_ICE.poiType -> "路面结冰"
- FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType,
- FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> "交通事故"
- else -> "道路事件"
- }
- }
@JvmStatic
fun getAlarmContent(poiType: String?): String {
@@ -645,7 +655,6 @@ enum class EventTypeEnumNew(
TRAFFIC_CHECK.poiType -> TRAFFIC_CHECK.content
ROAD_CLOSED.poiType -> ROAD_CLOSED.content
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.content
- AI_ROAD_WORK.poiType -> AI_ROAD_WORK.content
FOURS_BLOCK_UP.poiType -> FOURS_BLOCK_UP.content
FOURS_PONDING.poiType -> FOURS_PONDING.content
FOURS_FOG.poiType -> FOURS_FOG.content
@@ -654,136 +663,94 @@ enum class EventTypeEnumNew(
FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType ->
FOURS_ACCIDENT.content
GHOST_PROBE.poiType -> GHOST_PROBE.content
+ TYPE_SOCKET_ROAD_SHIGONG.poiType -> TYPE_SOCKET_ROAD_SHIGONG.content
+ TYPE_SOCKET_ROAD_JINGZHI.poiType -> TYPE_SOCKET_ROAD_JINGZHI.content
+ TYPE_SOCKET_ROAD_SHIGU.poiType -> TYPE_SOCKET_ROAD_SHIGU.content
+ TYPE_SOCKET_ROAD_CONGESTION.poiType -> TYPE_SOCKET_ROAD_CONGESTION.content
else -> "道路事件"
}
}
- @JvmStatic
- fun getTypeSmallRes(type: String): Int {
- return when (type) {
- TRAFFIC_CHECK.poiType ->
- R.drawable.mogo_image_jiaotongjiancha_small
- ROAD_CLOSED.poiType -> R.drawable.mogo_image_fenglu_small
- FOURS_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_small
- AI_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_small
- FOURS_BLOCK_UP.poiType -> R.drawable.mogo_image_yongdu_small
- FOURS_PONDING.poiType -> R.drawable.mogo_image_jishui_small
- FOURS_ICE.poiType -> R.drawable.mogo_image_jiebing_small
- FOURS_FOG.poiType -> R.drawable.mogo_image_nongwu_small
- FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType,
- FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType ->
- R.drawable.mogo_image_accident_small
- else -> R.drawable.mogo_image_shishilukuang_small
- }
- }
-
- @JvmStatic
- fun getTypeRes(type: String): Int {
- return when (type) {
- TRAFFIC_CHECK.poiType -> R.drawable.mogo_image_jiaotongjiancha_nor
- ROAD_CLOSED.poiType -> R.drawable.mogo_image_fenglu_nor
- FOURS_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_nor
- AI_ROAD_WORK.poiType -> R.drawable.mogo_image_daolushigong_nor
- FOURS_BLOCK_UP.poiType -> R.drawable.mogo_image_yongdu_nor
- FOURS_PONDING.poiType -> R.drawable.mogo_image_jishui_nor
- FOURS_ICE.poiType -> R.drawable.mogo_image_jiebing_nor
- FOURS_FOG.poiType -> R.drawable.mogo_image_nongwu_nor
- FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType,
- FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType ->
- R.drawable.mogo_image_jiaotongshigu_nor
- else -> R.drawable.mogo_image_shishlukuang_nor
- }
- }
-
- @JvmStatic
- fun getTypeName(type: String?): String {
- return when (type) {
- ROAD_CLOSED.poiType -> "封路"
- FOURS_ICE.poiType -> "道路结冰"
- FOURS_FOG.poiType -> "浓雾"
- TRAFFIC_CHECK.poiType -> "交通检查"
- FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType,
- FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> "交通事故"
- FOURS_BLOCK_UP.poiType -> "拥堵"
- FOURS_ROAD_WORK.poiType -> "施工"
- AI_ROAD_WORK.poiType -> "施工"
- FOURS_PONDING.poiType -> "道路积水"
- else -> "实时路况"
- }
- }
@JvmStatic
fun getMarker3DRes(poiType: String?): Int {
return when (poiType) {
FOURS_BLOCK_UP.poiType -> R.raw.v2x_yongdu
- FOURS_ACCIDENT.poiType -> R.raw.v2x_shigu
+ FOURS_ACCIDENT.poiType,FOURS_ACCIDENT_04.poiType -> R.raw.v2x_shigu
FOURS_LIVING.poiType -> R.raw.v2x_shishilukuang
FOURS_FOG.poiType -> R.raw.v2x_nongwu
TRAFFIC_CHECK.poiType -> R.raw.v2x_jiaotongjiancha
FOURS_ROAD_WORK.poiType -> R.raw.v2x_daolushigong
- AI_ROAD_WORK.poiType -> R.raw.v2x_daolushigong
FOURS_ICE.poiType -> R.raw.v2x_daolujiebing
FOURS_PONDING.poiType -> R.raw.v2x_daolujishui
GHOST_PROBE.poiType -> R.raw.v2x_guzhangqiuzhu
+ TYPE_SOCKET_ROAD_SHIGONG.poiType -> R.raw.v2x_shigong_warning
+ TYPE_SOCKET_ROAD_JINGZHI.poiType -> R.raw.v2x_zhangai
+ TYPE_SOCKET_ROAD_SHIGU.poiType -> R.raw.v2x_shigu_sanjiaopai
+ TYPE_SOCKET_ROAD_CONGESTION.poiType -> R.raw.v2x_yongdu
else -> 0
}
}
- @JvmStatic
- fun getTypeNameTTS(type: String?): String {
- return when (type) {
- ROAD_CLOSED.poiType -> "封路"
- FOURS_ICE.poiType -> "道路结冰"
- FOURS_FOG.poiType -> "浓雾"
- TRAFFIC_CHECK.poiType -> "交通检查"
- FOURS_ACCIDENT.poiType, FOURS_ACCIDENT_01.poiType, FOURS_ACCIDENT_02.poiType,
- FOURS_ACCIDENT_03.poiType, FOURS_ACCIDENT_04.poiType, FOURS_ACCIDENT_05.poiType -> "交通事故"
- FOURS_BLOCK_UP.poiType -> "拥堵"
- FOURS_ROAD_WORK.poiType -> "施工"
- AI_ROAD_WORK.poiType -> "施工"
- FOURS_PONDING.poiType -> "道路积水"
- else -> "实时路况"
- }
- }
-
@JvmStatic
fun getUpdateIconRes(poiType: String?): Int {
return when (poiType) {
//交通检查
TRAFFIC_CHECK.poiType -> {
- R.drawable.v_to_x_marker_2
+ R.drawable.v2x_icon_jiaotongjiancha_vr
}
//封路
ROAD_CLOSED.poiType -> {
- R.drawable.v_to_x_marker_16
+ R.drawable.v2x_icon_fenglu_vr
}
//施工
FOURS_ROAD_WORK.poiType -> {
- R.drawable.v_to_x_marker_11
+ R.drawable.icon_warning_v2x_road_construction
}
//AI施工
- AI_ROAD_WORK.poiType -> {
- R.drawable.v_to_x_marker_11
- }
+ TYPE_SOCKET_ROAD_SHIGONG.poiType -> R.drawable.icon_warning_v2x_road_construction
+ TYPE_SOCKET_ROAD_JINGZHI.poiType -> R.drawable.v2x_icon_jingzhi_zhangai
+ TYPE_SOCKET_ROAD_SHIGU.poiType -> R.drawable.v2x_icon_shigu_sanjiaopai
+ TYPE_SOCKET_ROAD_CONGESTION.poiType -> R.drawable.v2x_icon_yongdu_vr
//拥堵
FOURS_BLOCK_UP.poiType -> {
- R.drawable.v_to_x_marker_5
+ R.drawable.icon_warning_v2x_congestion
}
//积水
FOURS_PONDING.poiType -> {
- R.drawable.v_to_x_marker_6
+ R.drawable.v2x_icon_jishui_vr
}
//浓雾
FOURS_FOG.poiType -> {
- R.drawable.v_to_x_marker_9
+ R.drawable.v2x_icon_nongwu_vr
}
//结冰
FOURS_ICE.poiType -> {
- R.drawable.v_to_x_marker_8
+ R.drawable.v2x_icon_jiebing_vr
}
//事故
FOURS_ACCIDENT.poiType -> {
- R.drawable.v_to_x_marker_7
+ R.drawable.v2x_icon_jiaotongshigu_vr
+ }
+ //重大事故
+ FOURS_ACCIDENT_01.poiType -> {
+ R.drawable.v2x_icon_jiaotongshigu_vr
+ }
+ //特大事故
+ FOURS_ACCIDENT_02.poiType -> {
+ R.drawable.v2x_icon_jiaotongshigu_vr
+ }
+ //较大事故
+ FOURS_ACCIDENT_03.poiType -> {
+ R.drawable.v2x_icon_jiaotongshigu_vr
+ }
+ //一般事故
+ FOURS_ACCIDENT_04.poiType -> {
+ R.drawable.v2x_icon_jiaotongshigu_vr
+ }
+ //轻微事故
+ FOURS_ACCIDENT_05.poiType -> {
+ R.drawable.v2x_icon_jiaotongshigu_vr
}
//事故
FOURS_LIVING.poiType -> {
@@ -805,16 +772,38 @@ enum class EventTypeEnumNew(
ALERT_CAR_TROUBLE_WARNING.poiType -> {
R.drawable.icon_car_red
}
-
- //闯红灯预警
- TYPE_USECASE_ID_IVP_RED.poiType -> {
- R.drawable.icon_warning_v2x_traffic_lights_red
+ //VIP车辆优先通行,已为您变为绿灯
+ TYPE_VIP_IDENTIFICATION_PASS.poiType -> {
+ R.drawable.icon_warning_v2x_vip_turn_light
+ }
+ //VIP车辆优先通行,已为您延长绿灯
+ TYPE_VIP_IDENTIFICATION_EXTEND.poiType -> {
+ R.drawable.icon_warning_v2x_vip_turn_light
+ }
+ //VIP变灯请求失败
+ TYPE_VIP_ERROR_IDENTIFICATION.poiType -> {
+ R.drawable.icon_warning_v2x_vip_turn_light
+ }
+ //最优路线
+ TYPE_OPTIMAL_ROUTE_RECOMMEND.poiType -> {
+ R.drawable.icon_warning_v2x_optimal_route
}
//绿波通行
TYPE_USECASE_ID_IVP_GREEN.poiType -> {
R.drawable.icon_warning_v2x_traffic_lights_green
}
-
+ //闯红灯预警
+ TYPE_USECASE_ID_IVP_RED.poiType -> {
+ R.drawable.icon_warning_v2x_traffic_lights_red
+ }
+ //鬼探头类型
+ GHOST_PROBE.poiType -> {
+ R.drawable.icon_warning_v2x_pedestrian_crossing
+ }
+ //接管
+ TAKE_OVER_EVENT.poiType -> {
+ R.drawable.icon_warning_take_over
+ }
//机动车
TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.poiType -> {
R.drawable.icon_warning_v2x_motorcycle_collision
@@ -872,7 +861,7 @@ enum class EventTypeEnumNew(
return when (poiType) {
TYPE_USECASE_ID_EBW.poiType -> TYPE_USECASE_ID_EBW.poiTypeSrcVr
TYPE_USECASE_ID_FCW.poiType -> TYPE_USECASE_ID_FCW.poiTypeSrcVr
-// TYPE_USECASE_ID_ICW.poiType -> TYPE_USECASE_ID_ICW.poiTypeSrcVr
+ TYPE_USECASE_ID_ICW.poiType -> TYPE_USECASE_ID_ICW.poiTypeSrcVr
TYPE_USECASE_ID_CLW.poiType -> TYPE_USECASE_ID_CLW.poiTypeSrcVr
TYPE_USECASE_ID_DNPW.poiType -> TYPE_USECASE_ID_DNPW.poiTypeSrcVr
TYPE_USECASE_ID_AVW.poiType -> TYPE_USECASE_ID_AVW.poiTypeSrcVr
@@ -880,11 +869,15 @@ enum class EventTypeEnumNew(
TYPE_USECASE_ID_LCW.poiType -> TYPE_USECASE_ID_LCW.poiTypeSrcVr
TYPE_USECASE_ID_EVW.poiType -> TYPE_USECASE_ID_EVW.poiTypeSrcVr
TYPE_USECASE_ID_LTA.poiType -> TYPE_USECASE_ID_LTA.poiTypeSrcVr
- TYPE_VIP_IDENTIFICATION.poiType -> TYPE_VIP_IDENTIFICATION.poiTypeSrcVr
+ TYPE_VIP_IDENTIFICATION_PASS.poiType -> TYPE_VIP_IDENTIFICATION_PASS.poiTypeSrcVr
+ TYPE_VIP_IDENTIFICATION_EXTEND.poiType -> TYPE_VIP_IDENTIFICATION_EXTEND.poiTypeSrcVr
TYPE_ERROR.poiType -> TYPE_ERROR.poiTypeSrcVr
TYPE_OPTIMAL_ROUTE_RECOMMEND.poiType -> TYPE_OPTIMAL_ROUTE_RECOMMEND.poiTypeSrcVr
GHOST_PROBE.poiType -> GHOST_PROBE.poiTypeSrcVr
- AI_ROAD_WORK.poiType -> AI_ROAD_WORK.poiTypeSrcVr
+ TYPE_SOCKET_ROAD_SHIGONG.poiType -> TYPE_SOCKET_ROAD_SHIGONG.poiTypeSrcVr
+ TYPE_SOCKET_ROAD_JINGZHI.poiType -> TYPE_SOCKET_ROAD_JINGZHI.poiTypeSrcVr
+ TYPE_SOCKET_ROAD_SHIGU.poiType -> TYPE_SOCKET_ROAD_SHIGU.poiTypeSrcVr
+ TYPE_SOCKET_ROAD_CONGESTION.poiType -> TYPE_SOCKET_ROAD_CONGESTION.poiTypeSrcVr
TYPE_USECASE_ID_IVP_RED.poiType -> TYPE_USECASE_ID_IVP_RED.poiTypeSrcVr
TYPE_USECASE_ID_IVP_GREEN.poiType -> TYPE_USECASE_ID_IVP_GREEN.poiTypeSrcVr
@@ -933,7 +926,7 @@ enum class EventTypeEnumNew(
return when (poiType) {
TYPE_USECASE_ID_EBW.poiType -> TYPE_USECASE_ID_EBW.content
TYPE_USECASE_ID_FCW.poiType -> TYPE_USECASE_ID_FCW.content
-// TYPE_USECASE_ID_ICW.poiType -> TYPE_USECASE_ID_ICW.content
+ TYPE_USECASE_ID_ICW.poiType -> TYPE_USECASE_ID_ICW.content
TYPE_USECASE_ID_CLW.poiType -> TYPE_USECASE_ID_CLW.content
TYPE_USECASE_ID_DNPW.poiType -> TYPE_USECASE_ID_DNPW.content
TYPE_USECASE_ID_AVW.poiType -> TYPE_USECASE_ID_AVW.content
@@ -941,9 +934,13 @@ enum class EventTypeEnumNew(
TYPE_USECASE_ID_LCW.poiType -> TYPE_USECASE_ID_LCW.content
TYPE_USECASE_ID_EVW.poiType -> TYPE_USECASE_ID_EVW.content
TYPE_USECASE_ID_LTA.poiType -> TYPE_USECASE_ID_LTA.content
- TYPE_VIP_IDENTIFICATION.poiType -> TYPE_VIP_IDENTIFICATION.content
+ TYPE_VIP_IDENTIFICATION_PASS.poiType -> TYPE_VIP_IDENTIFICATION_PASS.content
+ TYPE_VIP_IDENTIFICATION_EXTEND.poiType -> TYPE_VIP_IDENTIFICATION_EXTEND.content
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.content
- AI_ROAD_WORK.poiType -> AI_ROAD_WORK.content
+ TYPE_SOCKET_ROAD_SHIGONG.poiType -> TYPE_SOCKET_ROAD_SHIGONG.content
+ TYPE_SOCKET_ROAD_JINGZHI.poiType -> TYPE_SOCKET_ROAD_JINGZHI.content
+ TYPE_SOCKET_ROAD_SHIGU.poiType -> TYPE_SOCKET_ROAD_SHIGU.content
+ TYPE_SOCKET_ROAD_CONGESTION.poiType -> TYPE_SOCKET_ROAD_CONGESTION.content
TYPE_ERROR.poiType -> TYPE_ERROR.content
TYPE_OPTIMAL_ROUTE_RECOMMEND.poiType -> TYPE_OPTIMAL_ROUTE_RECOMMEND.content
GHOST_PROBE.poiType -> GHOST_PROBE.content
@@ -996,7 +993,7 @@ enum class EventTypeEnumNew(
return when (poiType) {
TYPE_USECASE_ID_EBW.poiType -> TYPE_USECASE_ID_EBW.tts
TYPE_USECASE_ID_FCW.poiType -> TYPE_USECASE_ID_FCW.tts
-// TYPE_USECASE_ID_ICW.poiType -> TYPE_USECASE_ID_ICW.tts
+ TYPE_USECASE_ID_ICW.poiType -> TYPE_USECASE_ID_ICW.tts
TYPE_USECASE_ID_CLW.poiType -> TYPE_USECASE_ID_CLW.tts
TYPE_USECASE_ID_DNPW.poiType -> TYPE_USECASE_ID_DNPW.tts
TYPE_USECASE_ID_AVW.poiType -> TYPE_USECASE_ID_AVW.tts
@@ -1004,9 +1001,13 @@ enum class EventTypeEnumNew(
TYPE_USECASE_ID_LCW.poiType -> TYPE_USECASE_ID_LCW.tts
TYPE_USECASE_ID_EVW.poiType -> TYPE_USECASE_ID_EVW.tts
TYPE_USECASE_ID_LTA.poiType -> TYPE_USECASE_ID_LTA.tts
- TYPE_VIP_IDENTIFICATION.poiType -> TYPE_VIP_IDENTIFICATION.tts
+ TYPE_VIP_IDENTIFICATION_PASS.poiType -> TYPE_VIP_IDENTIFICATION_PASS.tts
+ TYPE_VIP_IDENTIFICATION_EXTEND.poiType -> TYPE_VIP_IDENTIFICATION_EXTEND.tts
FOURS_ROAD_WORK.poiType -> FOURS_ROAD_WORK.tts
- AI_ROAD_WORK.poiType -> AI_ROAD_WORK.tts
+ TYPE_SOCKET_ROAD_SHIGONG.poiType -> TYPE_SOCKET_ROAD_SHIGONG.tts
+ TYPE_SOCKET_ROAD_JINGZHI.poiType -> TYPE_SOCKET_ROAD_JINGZHI.tts
+ TYPE_SOCKET_ROAD_SHIGU.poiType -> TYPE_SOCKET_ROAD_SHIGU.tts
+ TYPE_SOCKET_ROAD_CONGESTION.poiType -> TYPE_SOCKET_ROAD_CONGESTION.tts
TYPE_ERROR.poiType -> TYPE_ERROR.tts
TYPE_OPTIMAL_ROUTE_RECOMMEND.poiType -> TYPE_OPTIMAL_ROUTE_RECOMMEND.tts
GHOST_PROBE.poiType -> GHOST_PROBE.tts
@@ -1053,6 +1054,16 @@ enum class EventTypeEnumNew(
else -> TYPE_ERROR.tts
}
}
- }
+ @JvmStatic
+ fun isCloudSocketEvent(poiType: String?): Boolean {
+ return when(poiType) {
+ TYPE_SOCKET_ROAD_SHIGONG.poiType,
+ TYPE_SOCKET_ROAD_JINGZHI.poiType,
+ TYPE_SOCKET_ROAD_SHIGU.poiType,
+ TYPE_SOCKET_ROAD_CONGESTION.poiType -> true
+ else -> false
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/V2XRoadEventEntity.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/V2XRoadEventEntity.java
index eea9b6b93e..0bd2dab8fd 100644
--- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/V2XRoadEventEntity.java
+++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/V2XRoadEventEntity.java
@@ -4,6 +4,7 @@ import android.text.TextUtils;
import com.mogo.eagle.core.data.enums.EventTypeEnum;
+import com.mogo.eagle.core.data.enums.EventTypeEnumNew;
import java.io.Serializable;
import java.util.Objects;
@@ -37,6 +38,7 @@ public class V2XRoadEventEntity implements Serializable {
// 绑定 MarkerView 的数据, 业务需要啥数据就传入啥数据
private Object bindObj;
+
public MarkerLocation getLocation() {
return location;
}
@@ -84,7 +86,7 @@ public class V2XRoadEventEntity implements Serializable {
}
public String getTts() {
- return tts;
+ return EventTypeEnumNew.getTts(getPoiType());
}
public void setTts(String tts) {
diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/DataSourceType.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/DataSourceType.kt
new file mode 100644
index 0000000000..af15d0b8a7
--- /dev/null
+++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/DataSourceType.kt
@@ -0,0 +1,9 @@
+package com.mogo.eagle.core.data.msgbox
+
+enum class DataSourceType {
+ DEFAULT,
+ OBU,
+ TELEMATIC,
+ AICLOUD,
+ SUMMARY// V2X事件汇总
+}
\ No newline at end of file
diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgBoxBean.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgBoxBean.kt
index 7a08d71212..9c370be85d 100644
--- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgBoxBean.kt
+++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgBoxBean.kt
@@ -3,4 +3,5 @@ package com.mogo.eagle.core.data.msgbox
data class MsgBoxBean(val type: MsgBoxType, val bean: Any) {
var timestamp: Long = 0
var bean2Json: String = ""
+ var sourceType: DataSourceType = DataSourceType.DEFAULT
}
diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewControlListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewControlListener.kt
index 5e426155bc..4a1c67310f 100644
--- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewControlListener.kt
+++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewControlListener.kt
@@ -10,6 +10,7 @@ interface IViewControlListener {
const val PerspectiveSwitchView_TAG = "PerspectiveSwitchView_TAG"
const val CameraView_TAG = "CameraView_TAG"
const val ToolsView_TAG = "ToolsView_TAG"
+ const val TrafficLightView_TAG = "TrafficLightView_TAG"
}
/** --------- View --------- **/
diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewLimitingVelocity.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewLimitingVelocity.kt
index aef782d2d6..c1b5499a1d 100644
--- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewLimitingVelocity.kt
+++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/view/IViewLimitingVelocity.kt
@@ -13,6 +13,7 @@ abstract class IViewLimitingVelocity(context: Context?, attrs: AttributeSet?, de
/**
* 更新限速数据
* @param limitingSpeed 限速值,单位:km/h
+ * @param limitSource 限速来源 1:MAP, 2:RSU
*/
- open fun updateLimitingSpeed(limitingSpeed: Int) {}
+ open fun updateLimitingSpeed(limitingSpeed: Int, limitSource: Int) {}
}
\ No newline at end of file
diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt
index b1c3b75fe1..266eaa8fa6 100644
--- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt
+++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoHmiProvider.kt
@@ -139,8 +139,9 @@ interface IMoGoHmiProvider : IMoGoHmiViewProxy {
* 展示限速预警
*
* @param limitingSpeed 限速速度
+ * @param limitSpeedSource 限速来源 1:MAP, 2:RSU
*/
- fun showLimitingVelocity(limitingSpeed: Int)
+ fun showLimitingVelocity(limitingSpeed: Int, limitSpeedSource: Int)
/**
* 关闭限速预警
diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuTrafficLightListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuTrafficLightListener.kt
new file mode 100644
index 0000000000..1b4be4e95c
--- /dev/null
+++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuTrafficLightListener.kt
@@ -0,0 +1,15 @@
+package com.mogo.eagle.core.function.api.obu
+
+
+/**
+ * @author lixiaopeng
+ * @date 2022/1/30 10:28 下午
+ * OBU 灯态信息
+ */
+interface IMoGoObuTrafficLightListener {
+ /**
+ * @param light 灯的信息
+ */
+ fun onObuTrafficLight(light: Int){}
+
+}
\ No newline at end of file
diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obucombine/IMoGoObuDcCombineListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obucombine/IMoGoObuDcCombineListener.kt
new file mode 100644
index 0000000000..942102318c
--- /dev/null
+++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obucombine/IMoGoObuDcCombineListener.kt
@@ -0,0 +1,17 @@
+package com.mogo.eagle.core.function.api.obucombine
+
+import mogo.v2x.ObuWarningEvent
+
+/**
+ * obu和dc 通道打通融合
+ */
+interface IMoGoObuDcCombineListener {
+
+ /**
+ * obu透传v2i数据,(标牌,弱势交通,红绿灯,限速,道路危险状况)
+ * @param obuWarningData
+ */
+ fun onMoGoObuDcCombineData(obuWarningData: ObuWarningEvent.ObuWarningData?)
+
+
+ }
\ No newline at end of file
diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/v2x/IV2XEventProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/v2x/IV2XEventProvider.kt
new file mode 100644
index 0000000000..629ed5938d
--- /dev/null
+++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/v2x/IV2XEventProvider.kt
@@ -0,0 +1,7 @@
+package com.mogo.eagle.core.function.api.v2x
+
+import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider
+
+interface IV2XEventProvider: IMoGoFunctionServerProvider {
+ fun queryWholeRoadEvents()
+}
\ No newline at end of file
diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/v2x/ObuLimitingSpeedListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/v2x/ObuLimitingSpeedListener.kt
new file mode 100644
index 0000000000..1fb84cdeaa
--- /dev/null
+++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/v2x/ObuLimitingSpeedListener.kt
@@ -0,0 +1,8 @@
+package com.mogo.eagle.core.function.api.v2x
+
+/**
+ * 限速信息
+ */
+interface ObuLimitingSpeedListener {
+ fun onObuLimitingSpeedChange(limitingSpeed: Int)
+}
\ No newline at end of file
diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt
index 5fb02a84f6..1a1eedf412 100644
--- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt
+++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt
@@ -143,7 +143,7 @@ object CallerHmiManager {
* 展示红绿灯预警
*
* @param checkLightId 0-都是默认,1-红,2-黄,3-绿
- * @param lightSource 1:云端下发;2:自车感知
+ * @param lightSource 1:云端下发;2:自车感知;3:OBU
*/
fun showWarningTrafficLight(checkLightId: Int, lightSource: Int) {
waringProviderApi?.showWarningTrafficLight(checkLightId, lightSource)
@@ -204,10 +204,11 @@ object CallerHmiManager {
* 展示限速预警
*
* @param limitingSpeed 限速速度
+ * @param limitSpeedSource 限速来源 1:MAP, 2:RSU
*/
@BizConfig(V2I, "", BIZ_SLW)
- fun showLimitingVelocity(limitingSpeed: Int) {
- waringProviderApi?.showLimitingVelocity(limitingSpeed)
+ fun showLimitingVelocity(limitingSpeed: Int, limitSpeedSource: Int) {
+ waringProviderApi?.showLimitingVelocity(limitingSpeed, limitSpeedSource)
}
/**
diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt
index e0281c2f76..16fbe0a4e9 100644
--- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt
+++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerSmpManager.kt
@@ -3,8 +3,10 @@ package com.mogo.eagle.core.function.call.map
import android.os.Looper
import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.eagle.core.data.constants.MoGoFragmentPaths
+import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.data.map.MogoLatLng
import com.mogo.eagle.core.function.api.map.smp.IMogoSmallMapProvider
+import com.mogo.eagle.core.function.api.v2x.IV2XEventProvider
import com.mogo.eagle.core.function.call.base.CallerBase
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
@@ -22,6 +24,10 @@ object CallerSmpManager : CallerBase() {
get() = ARouter.getInstance().build(MoGoFragmentPaths.PATH_FRAGMENT_OVERVIEW)
.navigation() as IMogoSmallMapProvider
+ private val v2xProvider: IV2XEventProvider
+ get() = ARouter.getInstance().build(MogoServicePaths.PATH_V2X_MODULE)
+ .navigation() as IV2XEventProvider
+
/**
* 绘制路径线
*/
@@ -58,9 +64,11 @@ object CallerSmpManager : CallerBase() {
fun startQueryV2XEvents() {
if (Thread.currentThread() !== Looper.getMainLooper().thread) {
UiThreadHandler.post {
+ v2xProvider.queryWholeRoadEvents()
mogoOverViewMapProvider.startQueryV2XEvents()
}
} else {
+ v2xProvider.queryWholeRoadEvents()
mogoOverViewMapProvider.startQueryV2XEvents()
}
}
diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt
index c01e0b89d7..75b7b224e5 100644
--- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt
+++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt
@@ -301,9 +301,12 @@ object CallerVisualAngleManager {
return@launch
}
}
-
+ if (prev.priority == current.priority) {
+ Log.d("${M_DEVA}${TAG}", "--- 9 --- 场景[$prev]正在展示,尚未收到关闭,优先级一致,直接return")
+ return@launch
+ }
if (prev.priority > current.priority && prev.displayThreshold < 0) {
- Log.d("${M_DEVA}${TAG}", "--- 6 --- 场景[$prev]正在展示,尚未收到关闭,场景,依然展示当前场景,直接return")
+ Log.d("${M_DEVA}${TAG}", "--- 10 --- 场景[$prev]正在展示,尚未收到关闭,场景,依然展示当前场景,直接return")
return@launch
}
doRealVisualAngleChange(triggerTime, current, displayed)
diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuTrafficLightListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuTrafficLightListenerManager.kt
new file mode 100644
index 0000000000..e881947ad9
--- /dev/null
+++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuTrafficLightListenerManager.kt
@@ -0,0 +1,25 @@
+package com.mogo.eagle.core.function.call.obu
+
+import com.mogo.eagle.core.function.api.obu.IMoGoObuTrafficLightListener
+import com.mogo.eagle.core.function.call.base.CallerBase
+import java.util.concurrent.ConcurrentHashMap
+
+
+object CallerObuTrafficLightListenerManager : CallerBase() {
+
+ private val M_OBU_TRAFFIC_LIGHT_LISTENER: ConcurrentHashMap =
+ ConcurrentHashMap()
+
+ var mLight: Int = 0
+
+
+ fun invokeObuTrafficLight(light: Int) {
+ this.mLight = light
+ M_OBU_TRAFFIC_LIGHT_LISTENER.forEach {
+ val tag = it.key
+ val listener = it.value
+ listener.onObuTrafficLight(light)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obucombine/CallerObuDcCombineListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obucombine/CallerObuDcCombineListenerManager.kt
new file mode 100644
index 0000000000..2ecbf31c29
--- /dev/null
+++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obucombine/CallerObuDcCombineListenerManager.kt
@@ -0,0 +1,66 @@
+package com.mogo.eagle.core.function.call.obucombine
+
+import androidx.annotation.Nullable
+import com.mogo.eagle.core.function.api.obu.IMoGoObuStatusListener
+import com.mogo.eagle.core.function.api.obucombine.IMoGoObuDcCombineListener
+import com.mogo.eagle.core.function.call.base.CallerBase
+import mogo.v2x.ObuWarningEvent
+import java.util.concurrent.ConcurrentHashMap
+
+/**
+ * obu和dc数据通道 回调监听
+ */
+object CallerObuDcCombineListenerManager : CallerBase() {
+ // 存储所有注册了监听的对象,invokeXXXX进行遍历回调,将信息同步
+ private val M_DC_COMBINE_LISTENERS: ConcurrentHashMap =
+ ConcurrentHashMap()
+
+ /**
+ * 添加 obu和dc数据通道 监听
+ * @param tag 标记,用来注销监听使用
+ * @param listener 监听回调
+ */
+// fun addListener(
+// @Nullable tag: String,
+// @Nullable listener: IMoGoObuDcCombineListener
+// ) {
+// if (M_DC_COMBINE_LISTENERS.containsKey(tag)) {
+// return
+// }
+// M_DC_COMBINE_LISTENERS[tag] = listener
+// }
+
+ /**
+ * 删除监听
+ * @param tag 标记,用来注销监听使用
+ */
+// fun removeListener(@Nullable tag: String) {
+// if (!M_DC_COMBINE_LISTENERS.containsKey(tag)) {
+// return
+// }
+// M_DC_COMBINE_LISTENERS.remove(tag)
+// }
+
+ /**
+ * 删除自动驾驶按钮选中监听
+ * @param listener 要删除的监听对象
+ */
+// fun removeListener(@Nullable listener: IMoGoObuDcCombineListener) {
+// M_DC_COMBINE_LISTENERS.forEach {
+// if (it.value == listener) {
+// M_DC_COMBINE_LISTENERS.remove(it.key)
+// }
+// }
+// }
+
+ /**
+ * v2i数据
+ */
+ fun invokeObuDcData(obuWarningData: ObuWarningEvent.ObuWarningData?){
+ M_DC_COMBINE_LISTENERS.forEach{
+ val listener = it.value
+ listener.onMoGoObuDcCombineData(obuWarningData)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/v2x/CallObuLimitingSpeedListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/v2x/CallObuLimitingSpeedListenerManager.kt
new file mode 100644
index 0000000000..1a33b7af68
--- /dev/null
+++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/v2x/CallObuLimitingSpeedListenerManager.kt
@@ -0,0 +1,26 @@
+package com.mogo.eagle.core.function.call.v2x
+
+import com.mogo.eagle.core.function.api.v2x.ObuLimitingSpeedListener
+import com.mogo.eagle.core.function.call.base.CallerBase
+import java.util.concurrent.ConcurrentHashMap
+
+/**
+ * 限速信息监听
+ */
+object CallObuLimitingSpeedListenerManager : CallerBase(){
+
+ private const val TAG = "CallObuLimitingSpeedListenerManager"
+ private val M_TRAFFIC_LIGHT_LISTENER: ConcurrentHashMap =
+ ConcurrentHashMap()
+ private var mObuLimitSpeed = 0
+
+ fun invokeOnObuLimitingSpeedChange(limitingSpeed: Int) {
+ this.mObuLimitSpeed = limitingSpeed
+ M_TRAFFIC_LIGHT_LISTENER.forEach {
+ val tag = it.key
+ val listener = it.value
+ listener.onObuLimitingSpeedChange(limitingSpeed)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_obstacle.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_obstacle.png
new file mode 100644
index 0000000000..c5e2711db3
Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_obstacle.png differ
diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_road_accidents.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_road_accidents.png
new file mode 100644
index 0000000000..10e3accd56
Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_road_accidents.png differ
diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_road_congestion.png b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_road_congestion.png
new file mode 100644
index 0000000000..390ed0bdef
Binary files /dev/null and b/core/mogo-core-res/src/main/function-hmi-res/drawable-xhdpi/icon_v2x_road_congestion.png differ
diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/v2x_icon_jingzhi_zhangai.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/v2x_icon_jingzhi_zhangai.png
new file mode 100644
index 0000000000..c5e2711db3
Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/v2x_icon_jingzhi_zhangai.png differ
diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/v2x_icon_shigong_zhandao.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/v2x_icon_shigong_zhandao.png
new file mode 100644
index 0000000000..0a21b49728
Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/v2x_icon_shigong_zhandao.png differ
diff --git a/core/mogo-core-res/src/main/res/drawable-xhdpi/v2x_icon_shigu_sanjiaopai.png b/core/mogo-core-res/src/main/res/drawable-xhdpi/v2x_icon_shigu_sanjiaopai.png
new file mode 100644
index 0000000000..10e3accd56
Binary files /dev/null and b/core/mogo-core-res/src/main/res/drawable-xhdpi/v2x_icon_shigu_sanjiaopai.png differ
diff --git a/core/mogo-core-res/src/main/res/raw/v2x_shigu_sanjiaopai.nt3d b/core/mogo-core-res/src/main/res/raw/v2x_shigu_sanjiaopai.nt3d
new file mode 100644
index 0000000000..79c8df21ad
Binary files /dev/null and b/core/mogo-core-res/src/main/res/raw/v2x_shigu_sanjiaopai.nt3d differ
diff --git a/core/mogo-core-res/src/main/res/raw/v2x_zhangai.nt3d b/core/mogo-core-res/src/main/res/raw/v2x_zhangai.nt3d
new file mode 100644
index 0000000000..a5a7d00b5f
Binary files /dev/null and b/core/mogo-core-res/src/main/res/raw/v2x_zhangai.nt3d differ
diff --git a/gradle.properties b/gradle.properties
index 1cad441c1f..f2137c890c 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -145,8 +145,7 @@ MOGO_OCH_NOOP_VERSION=2.0.66
MOGO_OCH_TAXI_VERSION=2.0.66
# mogoAiCloud sdk services
MOGO_AICLOUD_SERVICES_SDK_VERSION=2.1.16.10
-# v2x-sdk
-MOGO_V2X_SDK_VERSION=1.4.3.20
+
################# 旧版本架构模块版本 #################
diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java
index 681c4241e8..80f9e2a682 100644
--- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java
+++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java
@@ -878,7 +878,7 @@ public class AMapViewWrapper implements IMogoMapView,
case 5:
return MAP_STYLE_VR_ANGLE_CROSS;
default:
- throw new IllegalStateException("mode is unCorrect");
+ return MODE_MEDIUM_SIGHT;
}
}
diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java
index 77fe42cd29..5e092f589e 100644
--- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java
+++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java
@@ -277,12 +277,17 @@ public class AMapWrapper implements IMogoMap {
@Override
public CenterLine getCenterLineRangeInfo(double lon, double lat, float angle, float distance) {
- com.zhidaoauto.map.sdk.open.road.CenterLine info = MapDataApi.INSTANCE.getCenterLineRangeInfo(lon, lat, angle, distance);
- CenterLine ret = null;
- if (info != null) {
- ret = new CenterLine(info.id, info.tile_id, info.road_id, info.lane_id, convert(info.points), info.angle == null ? 0f : info.angle);
+ try {
+ com.zhidaoauto.map.sdk.open.road.CenterLine info = MapDataApi.INSTANCE.getCenterLineRangeInfo(lon, lat, angle, distance);
+ CenterLine ret = null;
+ if (info != null) {
+ ret = new CenterLine(info.id, info.tile_id, info.road_id, info.lane_id, convert(info.points), info.angle == null ? 0f : info.angle);
+ }
+ return ret;
+ } catch (Throwable t) {
+ t.printStackTrace();
+ return null;
}
- return ret;
}
@Override