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