diff --git a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml index c9a14ee169..3e12a1ebb2 100644 --- a/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml +++ b/OCH/mogo-och-bus-passenger/src/main/res/layout/bus_p_base_fragment.xml @@ -51,7 +51,7 @@ if (controller != null) { //切换地图的远近视图 if (controller.getCurrentMapVisualAngle().isLongSight()) { + CallerVisualAngleManager.INSTANCE.updateLongSightLevel(false); + Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(true); controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null); mSwitchMapModeImage.setImageResource(R.drawable.bus_switch_map_medium); } else if (controller.getCurrentMapVisualAngle().isMediumSight()) { - controller.changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null); + CallerVisualAngleManager.INSTANCE.updateLongSightLevel(true); + if (FunctionBuildConfig.isRomaMode) { + controller.setRomaMode(1); + } else { + Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(false); + controller.changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null); + } mSwitchMapModeImage.setImageResource(R.drawable.bus_switch_map_long); } else { controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null); 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 92952c1214..975b76ad84 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 @@ -63,7 +63,7 @@ listFSMFunctionStates = new ArrayList<>(); public final List listRoboSweeperTaskIndex = new ArrayList<>(); public final List listBagManagerCmd = new ArrayList<>(); - public final List listObuWarningData = new ArrayList<>(); + public final List listObuSpat = new ArrayList<>(); + public final List listObuRsi = new ArrayList<>(); + public final List listObuRsm = new ArrayList<>(); + public final List listObuMap = new ArrayList<>(); private long listTrajectorySize = 0; private long listTrackedObjectsSize = 0; @@ -150,7 +156,11 @@ public class DataDistribution { private long listFSMFunctionStatesSize = 0; private long listRoboSweeperTaskIndexSize = 0; private long listBagManagerCmdSize = 0; - private long listObuWarningDataSize = 0; + private long listObuSpatSize = 0; + private long listObuRsiSize = 0; + private long listObuRsmSize = 0; + private long listObuMapSize = 0; + public void clearCount() { listTrajectorySize = 1; @@ -175,7 +185,10 @@ public class DataDistribution { listFSMFunctionStatesSize = 1; listRoboSweeperTaskIndexSize = 1; listBagManagerCmdSize = 1; - listObuWarningDataSize = 1; + listObuSpatSize = 1; + listObuRsiSize = 1; + listObuRsmSize = 1; + listObuMapSize = 1; } public String cutDown(String str) { @@ -228,12 +241,36 @@ public class DataDistribution { if (listener != null && Constants.TITLE.RECEIVE_PLANNING_DECISION_STATE.equals(listener.first)) { listener.second.onRefresh(); } - } else if (data instanceof ObuWarningData) { - listObuWarningData.add(0, new DataShow(listObuWarningDataSize++, time + str)); - if (listObuWarningData.size() > LIST_SIZE) { - listObuWarningData.remove(listObuWarningData.size() - 1); + } else if (data instanceof ObuSpat) { + listObuSpat.add(0, new DataShow(listObuSpatSize++, time + str)); + if (listObuSpat.size() > LIST_SIZE) { + listObuSpat.remove(listObuSpat.size() - 1); } - if (listener != null && Constants.TITLE.RECEIVE_OBU_WARNING_DATA.equals(listener.first)) { + if (listener != null && Constants.TITLE.RECEIVE_OBU_SPAT.equals(listener.first)) { + listener.second.onRefresh(); + } + } else if (data instanceof ObuRsi) { + listObuRsi.add(0, new DataShow(listObuRsiSize++, time + str)); + if (listObuRsi.size() > LIST_SIZE) { + listObuRsi.remove(listObuRsi.size() - 1); + } + if (listener != null && Constants.TITLE.RECEIVE_OBU_RSI.equals(listener.first)) { + listener.second.onRefresh(); + } + } else if (data instanceof ObuRsm) { + listObuRsm.add(0, new DataShow(listObuRsmSize++, time + str)); + if (listObuRsm.size() > LIST_SIZE) { + listObuRsm.remove(listObuRsm.size() - 1); + } + if (listener != null && Constants.TITLE.RECEIVE_OBU_RSM.equals(listener.first)) { + listener.second.onRefresh(); + } + } else if (data instanceof ObuMap) { + listObuMap.add(0, new DataShow(listObuMapSize++, time + str)); + if (listObuMap.size() > LIST_SIZE) { + listObuMap.remove(listObuMap.size() - 1); + } + if (listener != null && Constants.TITLE.RECEIVE_OBU_MAP.equals(listener.first)) { listener.second.onRefresh(); } } else if (data instanceof GnssInfo) { diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuMap.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuMap.java new file mode 100644 index 0000000000..88c93caf6e --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuMap.java @@ -0,0 +1,24 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; +import com.mogo.support.obu.ObuScene; + +import java.text.SimpleDateFormat; + +import mogo.telematics.pad.MessagePad; + +public class ObuMap extends BaseInfo { + public final ObuScene.MapMatchData bean; + + + public ObuMap(MessagePad.Header header, ObuScene.MapMatchData bean, SimpleDateFormat sdf) { + super("接收", bean.getSerializedSize(), header, sdf); + this.bean = bean; + } + + @Override + public String toString() { + return super.toString() + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuRsi.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuRsi.java new file mode 100644 index 0000000000..d433245ebe --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuRsi.java @@ -0,0 +1,24 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; +import com.mogo.support.obu.ObuScene; + +import java.text.SimpleDateFormat; + +import mogo.telematics.pad.MessagePad; + +public class ObuRsi extends BaseInfo { + public final ObuScene.RsiWarningData bean; + + + public ObuRsi(MessagePad.Header header, ObuScene.RsiWarningData bean, SimpleDateFormat sdf) { + super("接收", bean.getSerializedSize(), header, sdf); + this.bean = bean; + } + + @Override + public String toString() { + return super.toString() + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuRsm.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuRsm.java new file mode 100644 index 0000000000..6045845ae4 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuRsm.java @@ -0,0 +1,24 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; +import com.mogo.support.obu.ObuScene; + +import java.text.SimpleDateFormat; + +import mogo.telematics.pad.MessagePad; + +public class ObuRsm extends BaseInfo { + public final ObuScene.RsmWarningData bean; + + + public ObuRsm(MessagePad.Header header, ObuScene.RsmWarningData bean, SimpleDateFormat sdf) { + super("接收", bean.getSerializedSize(), header, sdf); + this.bean = bean; + } + + @Override + public String toString() { + return super.toString() + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuSpat.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuSpat.java new file mode 100644 index 0000000000..bb4707903e --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ObuSpat.java @@ -0,0 +1,24 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; +import com.mogo.support.obu.ObuScene; + +import java.text.SimpleDateFormat; + +import mogo.telematics.pad.MessagePad; + +public class ObuSpat extends BaseInfo { + public final ObuScene.SpatWarningData bean; + + + public ObuSpat(MessagePad.Header header, ObuScene.SpatWarningData bean, SimpleDateFormat sdf) { + super("接收", bean.getSerializedSize(), header, sdf); + this.bean = bean; + } + + @Override + public String toString() { + return super.toString() + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java index 0ddd1d4549..06da977405 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java @@ -132,8 +132,14 @@ public class InfoFragment extends BaseFragment { adapter.setData(DataDistribution.getInstance().listArrivalNotification); } else if (Constants.TITLE.RECEIVE_STATUS_QUERY_RESP.equals(title)) { adapter.setData(DataDistribution.getInstance().listStatusInfo); - } else if (Constants.TITLE.RECEIVE_OBU_WARNING_DATA.equals(title)) { - adapter.setData(DataDistribution.getInstance().listObuWarningData); + } else if (Constants.TITLE.RECEIVE_OBU_SPAT.equals(title)) { + adapter.setData(DataDistribution.getInstance().listObuSpat); + } else if (Constants.TITLE.RECEIVE_OBU_RSI.equals(title)) { + adapter.setData(DataDistribution.getInstance().listObuRsi); + } else if (Constants.TITLE.RECEIVE_OBU_RSM.equals(title)) { + adapter.setData(DataDistribution.getInstance().listObuRsm); + } else if (Constants.TITLE.RECEIVE_OBU_MAP.equals(title)) { + adapter.setData(DataDistribution.getInstance().listObuMap); } else if (Constants.TITLE.RECEIVE_RECORD_DATA_CONFIG_RESP.equals(title)) { adapter.setData(DataDistribution.getInstance().listRecordDataConfig); } else if (Constants.TITLE.RECEIVE_GLOBAL_PATH_RESP.equals(title)) { diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index 110601a0f9..e42fc21d1d 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -44,7 +44,6 @@ import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; import com.google.protobuf.TextFormat; -import com.mogo.support.obu.ObuPenetrate; import com.mogo.support.obu.ObuScene; import com.mogo.telematic.MogoProtocolMsg; import com.mogo.telematic.NSDNettyManager; @@ -70,7 +69,10 @@ import com.zhidao.adas.client.bean.GlobalPathResp; import com.zhidao.adas.client.bean.GnssInfo; import com.zhidao.adas.client.bean.IPCConnectState; import com.zhidao.adas.client.bean.MogoReportMessage; -import com.zhidao.adas.client.bean.ObuWarningData; +import com.zhidao.adas.client.bean.ObuMap; +import com.zhidao.adas.client.bean.ObuRsi; +import com.zhidao.adas.client.bean.ObuRsm; +import com.zhidao.adas.client.bean.ObuSpat; import com.zhidao.adas.client.bean.OriginalPointCloudData; import com.zhidao.adas.client.bean.PerceptionTrafficLight; import com.zhidao.adas.client.bean.PlanningDecisionState; @@ -123,7 +125,6 @@ import chassis.ChassisStatesOuterClass; import function_state_management.FunctionStates; import io.netty.channel.Channel; import mogo.telematics.pad.MessagePad; -import mogo.v2x.ObuWarningEvent; import mogo_msg.MogoReportMsg; import perception.TrafficLightOuterClass; import planning.RoboSweeperTaskIndexOuterClass; @@ -550,7 +551,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onClick(View v) { if (TextUtils.equals(title.getText(), getString(R.string.have_error_data))) { - int position=titleFragmentData.size() - 1; + int position = titleFragmentData.size() - 1; infoFragment.smoothScrollToPosition(position); fragmentAdapter.setSelectedPosition(position); showFragment(Constants.TITLE.RECEIVE_ERROR); @@ -662,7 +663,10 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas titleFragmentData.add(Constants.TITLE.RECEIVE_GLOBAL_PATH_RESP); titleFragmentData.add(Constants.TITLE.RECEIVE_ARRIVAL_NOTIFICATION); titleFragmentData.add(Constants.TITLE.RECEIVE_STATUS_QUERY_RESP); - titleFragmentData.add(Constants.TITLE.RECEIVE_OBU_WARNING_DATA); + titleFragmentData.add(Constants.TITLE.RECEIVE_OBU_SPAT); + titleFragmentData.add(Constants.TITLE.RECEIVE_OBU_RSI); + titleFragmentData.add(Constants.TITLE.RECEIVE_OBU_RSM); + titleFragmentData.add(Constants.TITLE.RECEIVE_OBU_MAP); titleFragmentData.add(Constants.TITLE.RECEIVE_SWEEPER_TASK_INDEX_DATA); titleFragmentData.add(Constants.TITLE.RECEIVE_WARN); titleFragmentData.add(Constants.TITLE.RECEIVE_ERROR); @@ -1023,30 +1027,29 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas DataDistribution.getInstance().addData(base); } + @Override - public void onObuWarningData(MessagePad.Header header, ObuWarningEvent.ObuWarningData obuWarningData) { - ObuWarningData base = new ObuWarningData(header, obuWarningData, sdf); + public void onObuSpatWarning(MessagePad.Header header, ObuScene.SpatWarningData spatWarningData) { + ObuSpat base = new ObuSpat(header, spatWarningData, sdf); DataDistribution.getInstance().addData(base); } @Override - public void onoObuSpatWarning(MessagePad.Header header, ObuScene.SpatWarningData spatWarningData) { - + public void onObuRsiWarning(MessagePad.Header header, ObuScene.RsiWarningData rsiWarningData) { + ObuRsi base = new ObuRsi(header, rsiWarningData, sdf); + DataDistribution.getInstance().addData(base); } @Override - public void onoObuRsiWarning(MessagePad.Header header, ObuScene.RsiWarningData rsiWarningData) { - + public void onObuRsmWarning(MessagePad.Header header, ObuScene.RsmWarningData rsmWarningData) { + ObuRsm base = new ObuRsm(header, rsmWarningData, sdf); + DataDistribution.getInstance().addData(base); } @Override - public void onoObuRsmWarning(MessagePad.Header header, ObuScene.RsmWarningData rsmWarningData) { - - } - - @Override - public void onoObuObuMapMath(MessagePad.Header header, ObuScene.MapMatchData mapMatchData) { - + public void onObuMapMath(MessagePad.Header header, ObuScene.MapMatchData mapMatchData) { + ObuMap base = new ObuMap(header, mapMatchData, sdf); + DataDistribution.getInstance().addData(base); } @Override diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java index 5e3b49ebe1..1a0e9f160e 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java @@ -171,7 +171,10 @@ public class Constants { String RECEIVE_WARN = MessageType.TYPE_RECEIVE_WARN.desc; String RECEIVE_ARRIVAL_NOTIFICATION = MessageType.TYPE_RECEIVE_ARRIVAL_NOTIFICATION.desc; String RECEIVE_STATUS_QUERY_RESP = MessageType.TYPE_RECEIVE_STATUS_QUERY_RESP.desc; - String RECEIVE_OBU_WARNING_DATA = MessageType.TYPE_RECEIVE_OBU_WARNING_DATA.desc; + String RECEIVE_OBU_SPAT = "OBU SPAT信息"; + String RECEIVE_OBU_RSI = "OBU RSI信息"; + String RECEIVE_OBU_RSM = "OBU RSM信息"; + String RECEIVE_OBU_MAP = "OBU MAP信息"; String RECEIVE_ERROR = "错误数据"; diff --git a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java index da44f80a01..41dc187407 100644 --- a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java +++ b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java @@ -71,7 +71,6 @@ import chassis.ChassisStatesOuterClass; import chassis.VehicleStateOuterClass; import function_state_management.FunctionStates; import mogo.telematics.pad.MessagePad; -import mogo.v2x.ObuWarningEvent; import mogo_msg.MogoReportMsg; import perception.TrafficLightOuterClass; import planning.RoboSweeperTaskIndexOuterClass; @@ -548,28 +547,24 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } + @Override - public void onObuWarningData(MessagePad.Header header, ObuWarningEvent.ObuWarningData obuWarningData) { + public void onObuSpatWarning(MessagePad.Header header, ObuScene.SpatWarningData spatWarningData) { } @Override - public void onoObuSpatWarning(MessagePad.Header header, ObuScene.SpatWarningData spatWarningData) { + public void onObuRsiWarning(MessagePad.Header header, ObuScene.RsiWarningData rsiWarningData) { } @Override - public void onoObuRsiWarning(MessagePad.Header header, ObuScene.RsiWarningData rsiWarningData) { + public void onObuRsmWarning(MessagePad.Header header, ObuScene.RsmWarningData rsmWarningData) { } @Override - public void onoObuRsmWarning(MessagePad.Header header, ObuScene.RsmWarningData rsmWarningData) { - - } - - @Override - public void onoObuObuMapMath(MessagePad.Header header, ObuScene.MapMatchData mapMatchData) { + public void onObuMapMath(MessagePad.Header header, ObuScene.MapMatchData mapMatchData) { } diff --git a/build.gradle b/build.gradle index cbd64fba4f..afc1ee4733 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ buildscript { 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' - classpath 'io.github.knight-zxw:lancet-plugin:0.0.4' + classpath 'io.github.knight-zxw:lancet-plugin:0.0.4_mogo' // classpath ("com.tencent.matrix:matrix-gradle-plugin:0.6.6") { changing = true } } diff --git a/config.gradle b/config.gradle index d073b6b0a7..fab8cfd576 100644 --- a/config.gradle +++ b/config.gradle @@ -1,6 +1,7 @@ ext { time = "" - kotlin_version = "1.4.31" +// kotlin_version = "1.4.31" + kotlin_version = "1.5.0" dependencies = [ // androidx androidxappcompat : "androidx.appcompat:appcompat:1.3.1", @@ -22,9 +23,10 @@ ext { // amapnavi3dmap : "com.amap.api:navi-3dmap:8.0.1_3dmap8.0.1", // amapsearch : "com.amap.api:search:7.9.0", // amaplocation : "com.amap.api:location:5.5.0", - amapnavi3dmap : "com.amap.api:navi-3dmap:9.5.1_3dmap9.5.0", + amapnavi3dmap : "com.amap.api:navi-3dmap:9.6.0_3dmap9.6.0", amapsearch : "com.amap.api:search:9.5.0", amaplocation : "com.amap.api:location:6.2.0", + // json 转换 gson : "com.google.code.gson:gson:2.8.4", // 内存泄漏检测 @@ -91,7 +93,7 @@ ext { // obu sdk obusdk : "com.zhidao.enterprise.smartv2x:smartv2x:1.0.0.3", - mogoobu : 'com.mogo.support.obu:mogo-obu:1.1.0_beta0', + mogoobu : 'com.mogo.support.obu:mogo-obu:1.1.0_beta1', // google googlezxing : "com.google.zxing:core:3.3.3", @@ -124,9 +126,6 @@ ext { mogocustommapoperational : "com.zhidaoauto.map:operational:${MAP_SDK_OPERATION_VERSION}", modulemap : "com.mogo.module:module-map:${MOGO_MODULE_MAP_VERSION}", - chat : "com.mogo.module.carchatim:module-chat:${MOGO_MODULE_CHAT_VERSION}", - callchat : "com.mogo.module.carchatim:module-carchatting:${MOGO_MODULE_CARCHATTING_VERSION}", - callchatprovider : "com.mogo.module.carchatim:module-carchatting-provider:${MOGO_MODULE_CARCHATTINGPROVIDER_VERSION}", // V2X moduleV2x : "com.mogo.module:module-v2x:${MOGO_MODULE_V2X_VERSION}", @@ -135,10 +134,8 @@ ext { mogologlib : "com.mogo.module:module-loglib:${LOGLIB_VERSION}", kotlingradleplugin : "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}", crashreport : "com.mogo.test:crashreport:${CRASHREPORT_VERSION}", - crashreportbugly : "com.mogo.test:crashreport-bugly:${CRASHREPORT_BUGLY_VERSION}", crashreportapmbyte : "com.mogo.test:crashreport-apmbyte:${CRASHREPORT_APMBYTE_VERSION}", crashreportnoop : "com.mogo.test:crashreport-noop:${CRASHREPORT_NOOP_VERSION}", - crashreportupgrade : "com.mogo.test:crashreport-upgrade:${CRASHREPORT_UPGRADE_VERSION}", apm_insight : 'com.volcengine:apm_insight:1.4.9.cn-rc.5', apm_insight_crash : 'com.volcengine:apm_insight_crash:1.4.6-rc.14', cicle_indicator : 'me.relex:circleindicator:2.1.6', @@ -220,7 +217,7 @@ ext { //========================= LancetX =================== - lancetx_runtime : "io.github.knight-zxw:lancet-runtime:0.0.4", + lancetx_runtime : "io.github.knight-zxw:lancet-runtime:0.0.4_mogo", //========================= autosize ====================== androidautoSize : 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1', diff --git a/core/README.md b/core/README.md index 180e9b16db..5b05f4cb24 100644 --- a/core/README.md +++ b/core/README.md @@ -24,3 +24,4 @@ - mogo-core-res:程序中涉及到的图片及布局资源,同一管理,并通过设置不同的目录指定是那个模块的资源,这里只存放公共资源,图片,布局,动画等 - mogo-core-utils:基于成熟的工具类开源框架下沉的,这里可以增添针对我们业务上的一些工具类 + - MultiDisplayUtils :多屏幕管理工具 diff --git a/core/README_MULT_DISPLAY.md b/core/README_MULT_DISPLAY.md new file mode 100644 index 0000000000..4ff2f4c49e --- /dev/null +++ b/core/README_MULT_DISPLAY.md @@ -0,0 +1,16 @@ +## 多屏幕场景 + +```java +// 在第二个屏幕启动页面 +MultiDisplayUtils.INSTANCE.startActWithSecond( + context, + VideoAdAtc.class); +``` + +```java +// 在指定屏幕启动页面 +MultiDisplayUtils.INSTANCE.startActWithProcess( + 1, + context, + VideoAdAtc.class); +``` diff --git a/core/function-impl/mogo-core-function-biz/build.gradle b/core/function-impl/mogo-core-function-biz/build.gradle index 7ca8ee96d9..0e59185cde 100644 --- a/core/function-impl/mogo-core-function-biz/build.gradle +++ b/core/function-impl/mogo-core-function-biz/build.gradle @@ -62,7 +62,6 @@ dependencies { implementation rootProject.ext.dependencies.androidxroomktx implementation project(':foudations:mogo-commons') - implementation project(':core:mogo-core-data') implementation project(':core:mogo-core-utils') implementation project(':core:mogo-core-network') implementation project(':core:mogo-core-function-call') 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 6f37a8d741..86a2933f6e 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 @@ -26,7 +26,7 @@ class FuncBizProvider : IMoGoFuncBizProvider { noticeSocketManager.init(context) dispatchAutoPilotManager.init(context) cronTaskManager.startCronTask() - + OverviewDb.getDb(context) MogoTrafficLightManager.INSTANCE.initServer(context) VipCarManager.INSTANCE.initServer(context) // RedLightWarningManager.INSTANCE.listenTrafficLight() @@ -75,10 +75,6 @@ class FuncBizProvider : IMoGoFuncBizProvider { OverViewDataManager.getAllV2XEventsByLineId(MoGoAiCloudClientConfig.getInstance().sn) } - override fun initOverViewDb(context: Context) { - OverviewDb.getDb(context) - } - override fun onDestroy() { noticeSocketManager.release() dispatchAutoPilotManager.release() diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/network/TrafficLightApiService.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/network/TrafficLightApiService.kt index c40fd2c124..f72a79e86d 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/network/TrafficLightApiService.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/network/TrafficLightApiService.kt @@ -12,17 +12,17 @@ interface TrafficLightApiService { //获取前方路口RoadID @FormUrlEncoded - @POST("ai-roadInfo-service/cross/near") + @POST("eagle-eye-dns/ai-roadInfo-service/cross/near") suspend fun getFrontRoadID(@FieldMap roadID: Map): BaseResponse //获取前方红绿灯状态 @FormUrlEncoded - @POST("mec-etl-server/light/bgd/channel/realTime") + @POST("eagle-eye-dns/mec-etl-server/light/bgd/channel/realTime") suspend fun getTrafficLight(@FieldMap status: Map): BaseResponse //变灯 @FormUrlEncoded - @POST("mec-etl-server/light/bdg/newTask") + @POST("eagle-eye-dns/mec-etl-server/light/bdg/newTask") suspend fun changeLight(@FieldMap turnLight: Map): BaseResponse } \ 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/network/TrafficLightNetWorkModel.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/network/TrafficLightNetWorkModel.kt index e537960c39..fb54d5cda1 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/network/TrafficLightNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/trafficlight/network/TrafficLightNetWorkModel.kt @@ -1,18 +1,18 @@ package com.mogo.eagle.function.biz.v2x.trafficlight.network import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.constants.HostConst import com.mogo.eagle.core.data.BaseResponse import com.mogo.eagle.core.data.trafficlight.* import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.network.apiCall import com.mogo.eagle.core.network.cancel import com.mogo.eagle.core.network.request -import com.mogo.commons.constants.HostConst.CITY_HOST import com.mogo.eagle.core.utilcode.util.GsonUtils class TrafficLightNetWorkModel { - private fun getNetWorkApi(baseUrl: String = CITY_HOST): TrafficLightApiService { + private fun getNetWorkApi(baseUrl: String = HostConst.getEagleHost()): TrafficLightApiService { return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) .create(TrafficLightApiService::class.java) } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/network/VipApiService.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/network/VipApiService.kt index 1bc23b7452..db9077191b 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/network/VipApiService.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/network/VipApiService.kt @@ -7,7 +7,7 @@ import retrofit2.http.* interface VipApiService { //查询是否为VIP车辆 - @GET("/dataService/carUser/getVipStatusBySn") + @GET("eagle-eye-dns/dataService/carUser/getVipStatusBySn") suspend fun requestVip(@Query("sn") sn: String): BaseResponse } \ 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/vip/network/VipNetWorkModel.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/network/VipNetWorkModel.kt index f161184cdc..cb1600345c 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/network/VipNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/network/VipNetWorkModel.kt @@ -1,17 +1,17 @@ package com.mogo.eagle.function.biz.v2x.vip.network import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.constants.HostConst import com.mogo.eagle.core.data.BaseResponse import com.mogo.eagle.core.data.v2x.VipRequest import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.network.apiCall import com.mogo.eagle.core.network.request -import com.mogo.commons.constants.HostConst.DATA_SERVICE_HOST class VipNetWorkModel { - private fun getNetWorkApi(baseUrl: String = DATA_SERVICE_HOST): VipApiService { + private fun getNetWorkApi(baseUrl: String = HostConst.getEagleHost()): VipApiService { return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) .create(VipApiService::class.java) } diff --git a/core/function-impl/mogo-core-function-chat/build.gradle b/core/function-impl/mogo-core-function-chat/build.gradle index c097863b5b..af1385fc7d 100644 --- a/core/function-impl/mogo-core-function-chat/build.gradle +++ b/core/function-impl/mogo-core-function-chat/build.gradle @@ -61,13 +61,11 @@ dependencies { implementation rootProject.ext.dependencies.androidxrecyclerview if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { - 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 } else { implementation project(':foudations:mogo-commons') - implementation project(':core:mogo-core-data') implementation project(':core:mogo-core-utils') implementation project(':core:mogo-core-function-call') implementation project(':core:mogo-core-res') diff --git a/core/function-impl/mogo-core-function-datacenter/README.md b/core/function-impl/mogo-core-function-datacenter/README.md index 9591c43e02..b17a6584f3 100644 --- a/core/function-impl/mogo-core-function-datacenter/README.md +++ b/core/function-impl/mogo-core-function-datacenter/README.md @@ -44,7 +44,7 @@ MogoObuManager.getInstance().init(Context context); ``` ## 连接 ```java -//默认192.168.8.199 +//默认192.168.1.199 MogoObuManager.getInstance().connect(); //自定义 IP MogoObuManager.getInstance().connect(String ip); diff --git a/core/function-impl/mogo-core-function-datacenter/build.gradle b/core/function-impl/mogo-core-function-datacenter/build.gradle index 5c5057184b..a689c55ff7 100644 --- a/core/function-impl/mogo-core-function-datacenter/build.gradle +++ b/core/function-impl/mogo-core-function-datacenter/build.gradle @@ -55,23 +55,18 @@ dependencies { implementation rootProject.ext.dependencies.androidxroomktx implementation rootProject.ext.dependencies.mogoaicloudtelematic - - implementation rootProject.ext.dependencies.mogoobu implementation rootProject.ext.dependencies.amapnavi3dmap + implementation project(':libraries:mogo-obu') + implementation project(':libraries:mogo-adas') + implementation project(':libraries:mogo-adas-data') if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { - implementation rootProject.ext.dependencies.mogo_core_data implementation rootProject.ext.dependencies.mogo_core_utils implementation rootProject.ext.dependencies.mogo_core_function_call - - implementation project(':libraries:mogo-adas') implementation rootProject.ext.dependencies.mogocommons } else { - implementation project(':core:mogo-core-data') implementation project(':core:mogo-core-utils') implementation project(':core:mogo-core-function-call') - - implementation project(':libraries:mogo-adas') implementation project(':foudations:mogo-commons') } } 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 593e610927..c0d126bb3c 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 @@ -526,23 +526,13 @@ class MoGoAdasListenerImpl : OnAdasListener { } } - /** - * OBU预警事件 - * - * @param header 头 - * @param obuWarningData 数据 - */ - override fun onObuWarningData(header: MessagePad.Header?, obuWarningData: ObuWarningEvent.ObuWarningData?) { - CallerObuDcCombineListenerManager.invokeObuDcData(obuWarningData) - } - /** * OBU 红绿灯预警信息 * * @param header 头 * @param spatWarningData 数据 */ - override fun onoObuSpatWarning(header: MessagePad.Header?, spatWarningData: ObuScene.SpatWarningData?) { + override fun onObuSpatWarning(header: MessagePad.Header?, spatWarningData: ObuScene.SpatWarningData?) { CallerObuWarningSpatListenerManager.invokeObuSpatWarning(spatWarningData!!) } /** @@ -551,7 +541,7 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param header 头 * @param rsiWarningData 数据 */ - override fun onoObuRsiWarning(header: MessagePad.Header?, rsiWarningData: ObuScene.RsiWarningData?) { + override fun onObuRsiWarning(header: MessagePad.Header?, rsiWarningData: ObuScene.RsiWarningData?) { CallerObuWarningRsiListenerManager.invokeObuRsiWarning(rsiWarningData!!) } @@ -561,7 +551,7 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param header 头 * @param rsmWarningData 数据 */ - override fun onoObuRsmWarning(header: MessagePad.Header?, rsmWarningData: ObuScene.RsmWarningData?) { + override fun onObuRsmWarning(header: MessagePad.Header?, rsmWarningData: ObuScene.RsmWarningData?) { CallerObuWarningRsmListenerManager.invokeObuRsmWarning(rsmWarningData!!) } /** @@ -570,7 +560,7 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param header 头 * @param mapMatchData 数据 */ - override fun onoObuObuMapMath(header: MessagePad.Header?, mapMatchData: ObuScene.MapMatchData?) { + override fun onObuMapMath(header: MessagePad.Header?, mapMatchData: ObuScene.MapMatchData?) { CallerObuMapMathListenerManager.invokeObuMapMath(mapMatchData!!) } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/location/MoGoLocationDispatcher.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/location/MoGoLocationDispatcher.kt index 4b5444ccb2..c66bdb3f4c 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/location/MoGoLocationDispatcher.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/location/MoGoLocationDispatcher.kt @@ -17,7 +17,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84Lis import com.mogo.eagle.core.function.call.obu.CallerObuLocationWGS84ListenerManager import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr import com.mogo.eagle.core.utilcode.util.CoordinateTransform -import com.mogo.eagle.core.utilcode.util.FileUtils import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.Utils import com.mogo.support.obu.model.MogoObuHvBasicsData @@ -89,6 +88,11 @@ object MoGoLocationDispatcher : lastGnssLocation.lastReceiveTime = TimeUtils.getNowMills() // 将高德中的一些用于业务的数据进行融合,例如:CityCode、address等 mapLocation?.let { + //agps 高德 + //agps_rtk 高德-高精 + lastGnssLocation.locType = 1000 // 定位类型为WGS84进行转译的坐标 + lastGnssLocation.satellite = 4 + lastGnssLocation.cityName = it.city lastGnssLocation.cityCode = it.cityCode lastGnssLocation.provider = it.provider @@ -145,6 +149,9 @@ object MoGoLocationDispatcher : lastGaoDeLocation.satelliteTime = it.time lastGaoDeLocation.lastReceiveTime = TimeUtils.getNowMills() + lastGaoDeLocation.locType = 1 // 定位类型为高德坐标(网路或者硬件定位) + lastGaoDeLocation.satellite = 4 + lastGaoDeLocation.cityName = it.city lastGaoDeLocation.cityCode = it.cityCode lastGaoDeLocation.provider = it.provider @@ -228,6 +235,11 @@ object MoGoLocationDispatcher : // 将高德中的一些用于业务的数据进行融合,例如:CityCode、address等 mapLocation?.let { + //agps 高德 + //agps_rtk 高德-高精 + lastOBULocation.locType = 1000 // 定位类型为WGS84进行转译的坐标 + lastOBULocation.satellite = 4 + lastOBULocation.cityName = it.city lastOBULocation.cityCode = it.cityCode lastOBULocation.provider = it.provider diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MoGoObuProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MoGoObuProvider.kt index 16afda3c40..29eb90cdbc 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MoGoObuProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MoGoObuProvider.kt @@ -22,8 +22,7 @@ class MoGoObuProvider : IMoGoObuProvider { private val TAG = "MoGoObuProvider" private var mContext: Context? = null - private val busObuIp = "192.168.8.199" - private val taxiObuIp = "192.168.1.199" + private val taxiObuIp = "192.168.1.199" //obu的taxi和bus的ip已经全部统一成1网段ip override val functionName: String get() = TAG @@ -37,35 +36,16 @@ class MoGoObuProvider : IMoGoObuProvider { MogoObuDcCombineManager.INSTANCE.init(context) CallerLogger.d("$M_OBU$TAG", "初始化蘑菇自研OBU…… localIp = " + CommonUtils.getLocalIPAddress()) - //bus乘客版本obu功能去掉 - if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) - && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) - ) { - //不处理 - } else { - mContext = context - mContext?.let { - if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { //bus 司机端 - val ipAddress = - SharedPrefsMgr.getInstance(context).getString(MoGoConfig.OBU_IP, busObuIp) - - //mogo obu - MogoPrivateObuNewManager.INSTANCE.connectObu( - it, - ipAddress, - CommonUtils.getIpAddressString() - ) - } else if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) { //taxi 司机端和乘客端 - val ipAddress = - SharedPrefsMgr.getInstance(context).getString(MoGoConfig.OBU_IP, taxiObuIp) - //mogo obu - MogoPrivateObuNewManager.INSTANCE.connectObu( - it, - ipAddress, - CommonUtils.getIpAddressString() - ) - } - } + //bus乘客版本obu功能去掉,大理项目需要全部车辆接收,不在限制 + mContext = context + mContext?.let { + val ipAddress = SharedPrefsMgr.getInstance(context).getString(MoGoConfig.OBU_IP, taxiObuIp) + //mogo obu + MogoPrivateObuNewManager.INSTANCE.connectObu( + it, + ipAddress, + CommonUtils.getIpAddressString() + ) } } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt index 501cb50af4..448913e959 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt @@ -8,12 +8,12 @@ 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.api.map.angle.Default +import com.mogo.eagle.core.function.api.map.angle.TooClose import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager 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.CallerObuConnectListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuLocationWGS84ListenerManager @@ -23,8 +23,8 @@ import com.mogo.eagle.core.function.datacenter.obu.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.util.UiThreadHandler -import com.mogo.support.obu.MogoObuManager -import com.mogo.support.obu.OnMogoObuListener +import com.mogo.support.obu.ObuBase +import com.mogo.support.obu.ObuScene import com.mogo.support.obu.constants.MogoObuComType import com.mogo.support.obu.constants.MogoObuConstants import com.mogo.support.obu.constants.MogoObuTopicId @@ -32,6 +32,9 @@ import com.mogo.support.obu.model.* import com.mogo.support.obu.model.advance.SpatLight import com.mogo.support.obu.option.MogoObuCom import com.mogo.support.obu.option.MogoObuOptions +import com.zhidao.support.obu.ObuManager +import com.zhidao.support.obu.OnObuListener +import mogo.telematics.pad.MessagePad import kotlin.math.roundToInt /** @@ -50,7 +53,7 @@ class MogoPrivateObuNewManager private constructor() { private var mObuStatusInfo = CallerObuConnectListenerManager.getObuStatusInfo() fun connectObu(context: Context, obuIpAddress: String, padIpAddress: String) { - MogoObuManager.getInstance().registerMogoObuListener(mogoObuListener) + ObuManager.getInstance().registerObuListener(mogoObuListener) val com = MogoObuCom.newBuilder() .setLocalIp(padIpAddress) .setComType(MogoObuComType.UDP) @@ -70,27 +73,27 @@ class MogoPrivateObuNewManager private constructor() { .build() //每次连接的时候如果连接连接了,先断开 - if (MogoObuManager.getInstance().connectStatus == 1) { + if (ObuManager.getInstance().connectStatus == 1) { try { - MogoObuManager.getInstance().disconnect() + ObuManager.getInstance().disconnect() } catch (e: Exception) { e.printStackTrace() } } - MogoObuManager.getInstance().connect(options) + ObuManager.getInstance().connect(options) } - fun getMogoObuListener(): OnMogoObuListener { + fun getMogoObuListener(): OnObuListener { return mogoObuListener } fun disconnect() { - MogoObuManager.getInstance().disconnect() + ObuManager.getInstance().disconnect() } - private val mogoObuListener: OnMogoObuListener = object : OnMogoObuListener() { + private val mogoObuListener: OnObuListener = object : OnObuListener { /** * 连接状态的改变 */ @@ -105,23 +108,23 @@ class MogoPrivateObuNewManager private constructor() { } /** - * HV车辆基础信息 CvxHvCarIndInfo CvxHvInfoIndInfo + * HV车辆基础信息 gnssInfo */ - override fun onMogoObuHvBasics(mogoObuHvBasicsData: MogoObuHvBasicsData?) { - if (mogoObuHvBasicsData != null && mogoObuHvBasicsData.vehBasicsMsg != null) { + override fun onGnssInfo(gnssInfo: MessagePad.GnssInfo?) { + if (gnssInfo != null ) { CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", - "onMogoObuHvBasics lon = ${mogoObuHvBasicsData.vehBasicsMsg.longitude} --- lat = ${mogoObuHvBasicsData.vehBasicsMsg.latitude} ---speed = ${mogoObuHvBasicsData.vehBasicsMsg.speed} ---heading = ${mogoObuHvBasicsData.vehBasicsMsg.heading} --acceleration = ${mogoObuHvBasicsData.vehBasicsMsg.accFourAxes.accLat} --yawRate = ${mogoObuHvBasicsData.vehBasicsMsg.accFourAxes.accYaw}" + "onGnssInfo lon = ${gnssInfo.longitude} --- lat = ${gnssInfo.latitude} ---speed = ${gnssInfo.gnssSpeed} ---heading = ${gnssInfo.heading} --acceleration = ${gnssInfo.acceleration} --yawRate = ${gnssInfo.yawRate}" ) // 使用与渠道配置一样的gps提供者提供的数据,app/productFlavors/fPadLenovo.gradle GPS_PROVIDER 0-Android系统,1-工控机,2-OBU if (2 == FunctionBuildConfig.gpsProvider) { - // 同步给MAP地图 - CallerObuLocationWGS84ListenerManager.invokeObuLocationWGS84(mogoObuHvBasicsData) + // 同步给MAP地图 TODO +// CallerObuLocationWGS84ListenerManager.invokeObuLocationWGS84(gnssInfo) // 同步更新经纬度和系统时间至 AutoPilotStatusListener CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon( System.currentTimeMillis() / 1000.0, - mogoObuHvBasicsData.vehBasicsMsg.longitude, - mogoObuHvBasicsData.vehBasicsMsg.latitude + gnssInfo.longitude, + gnssInfo.latitude ) } } @@ -130,12 +133,11 @@ class MogoPrivateObuNewManager private constructor() { /** * v2v预警信息 CvxRvInfoIndInfo CvxV2vThreatIndInfo 他车 */ - override fun onMogoObuRvWarning(data: MogoObuRvWarningData) { - super.onMogoObuRvWarning(data) + override fun onObuRvWarning(data: ObuScene.RvWarningData) { // if (HmiBuildConfig.isShowObuV2vView) { //TODO 临时需要关闭v2v开关 - if (!data.warningMsg.warningData.isNullOrEmpty()) { + if (data.warningMsg != null && !data.warningMsg.warningDataList.isNullOrEmpty()) { // 更新数据,远车数据,之前要匹配uuid - TrafficDataConvertUtilsNew.cvxRvInfoIndInfo2TrafficData(data)?.let { + TrafficDataConvertUtilsNew.cvxRvInfoIndInfo2TrafficData(data.vehBasicsMsg)?.let { CallerMapUIServiceManager.getMarkerService()?.updateITrafficLocationInfo(it) } @@ -150,10 +152,10 @@ class MogoPrivateObuNewManager private constructor() { 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 (data.warningMsg.warningDataList != null && data.warningMsg.warningDataList.size > 0) { + level = data.warningMsg.warningDataList[0].warningLevel + appId = data.warningMsg.warningDataList[0].warningType.toString() + status = data.warningMsg.warningDataList[0].status //拼凑数据 handleSdkObu(appId, direction, status, level, data) } @@ -174,38 +176,36 @@ class MogoPrivateObuNewManager private constructor() { /** * 红绿灯预警信息 CvxIvpThreatIndInfo */ - override fun onMogoObuSpatWarning(data: MogoObuSpatWarningData) { - super.onMogoObuSpatWarning(data) + override fun onObuSpatWarning(data: ObuScene.SpatWarningData) { handlerTrafficLight( data.warningType, data.status, - data.lights + data.lightsList ) } /** * RSI预警信息 onMogoObuRsiWarning(交通标志预警(前方限速、前方学校等等),交通事件预警(前方拥堵、前方积水等等)) */ - override fun onMogoObuRsiWarning(data: MogoObuRsiWarningData) { - super.onMogoObuRsiWarning(data) + override fun onObuRsiWarning(data: ObuScene.RsiWarningData) { // if (HmiBuildConfig.isShowObuV2iView) { - if (data.warningMsg != null && data.warningMsg.size > 0) { + if (data.warningMsgList != null && data.warningMsgList.size > 0) { var alertContent = "" var ttsContent = "" - var appId = data.warningMsg[0].sceneType.toString() + var appId = data.warningMsgList[0].sceneType.toString() val status = data.status - val level = data.warningMsg[0].warningLevel - val direction = getMessageDirection(data.warningMsg[0].targetPosition) + val level = data.warningMsgList[0].warningLevel + val direction = getMessageDirection(data.warningMsgList[0].targetPosition) CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", - "onMogoObuRsiWarning appId = $appId --status = $status --level = $level -- eventSerialNum = ${data.warningMsg[0].eventSerialNum} ---signSerialNum = ${data.warningMsg[0].signSerialNum} --- direction = $direction -- targetPosition = ${data.warningMsg[0].targetPosition}" + "onMogoObuRsiWarning appId = $appId --status = $status --level = $level -- eventSerialNum = ${data.warningMsgList[0].eventSerialNum} ---signSerialNum = ${data.warningMsgList[0].signSerialNum} --- direction = $direction -- targetPosition = ${data.warningMsgList[0].targetPosition}" ) if (appId != "0") { when (appId) { // 道路危险情况预警 MogoObuConstants.RSI_SCENE_TYPE.HLW.toString() -> { - when (data.warningMsg[0].eventSerialNum) { + when (data.warningMsgList[0].eventSerialNum) { MogoObuConstants.RTE.RTI_TYPE_BREAKDOWN -> {//车辆故障 appId = EventTypeEnumNew.TYPE_USECASE_ID_BREAKDOWN_WARNING.poiType @@ -231,19 +231,19 @@ class MogoPrivateObuNewManager private constructor() { ttsContent = EventTypeEnumNew.getWarningTts(appId) alertContent = String.format( //事件才有影响范围 alertContent, - Math.round(data.warningMsg[0].distance).toString(), - Math.round(data.warningMsg[0].eventRadius).toString() + Math.round(data.warningMsgList[0].distance).toString(), + Math.round(data.warningMsgList[0].eventRadius).toString() ) ttsContent = String.format( ttsContent, - Math.round(data.warningMsg[0].distance).toString(), - Math.round(data.warningMsg[0].eventRadius).toString() + Math.round(data.warningMsgList[0].distance).toString(), + Math.round(data.warningMsgList[0].eventRadius).toString() ) } //车内标牌 MogoObuConstants.RSI_SCENE_TYPE.IVS.toString() -> { - when (data.warningMsg[0].signSerialNum) { + when (data.warningMsgList[0].signSerialNum) { // MogoObuConstants.RTS.RTI_TYPE_INTERSECTION -> { //十字路口 // appId = EventTypeEnumNew.TYPE_ID_NTERSECTION.poiType // } @@ -323,11 +323,11 @@ class MogoPrivateObuNewManager private constructor() { ttsContent = EventTypeEnumNew.getWarningTts(appId) alertContent = String.format( //标牌是没有影响范围的 alertContent, - Math.round(data.warningMsg[0].distance).toString() + Math.round(data.warningMsgList[0].distance).toString() ) ttsContent = String.format( ttsContent, - Math.round(data.warningMsg[0].distance).toString() + Math.round(data.warningMsgList[0].distance).toString() ) } @@ -338,13 +338,13 @@ class MogoPrivateObuNewManager private constructor() { ttsContent = EventTypeEnumNew.getWarningTts(appId) alertContent = String.format( //事件才有影响范围 alertContent, - Math.round(data.warningMsg[0].distance).toString(), - Math.round(data.warningMsg[0].eventRadius).toString() + Math.round(data.warningMsgList[0].distance).toString(), + Math.round(data.warningMsgList[0].eventRadius).toString() ) ttsContent = String.format( ttsContent, - Math.round(data.warningMsg[0].distance).toString(), - Math.round(data.warningMsg[0].eventRadius).toString() + Math.round(data.warningMsgList[0].distance).toString(), + Math.round(data.warningMsgList[0].eventRadius).toString() ) } @@ -358,9 +358,9 @@ class MogoPrivateObuNewManager private constructor() { CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", - "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()}" + "new onMogoObuRsiWarning appId = $appId ---status = $status --- ttsContent = $ttsContent --alertContent = $alertContent -- eventSerialNum = ${data.warningMsgList[0].eventSerialNum} ---signSerialNum = ${data.warningMsgList[0].signSerialNum} ---direction = ${direction.direction} --distance = ${ + Math.round(data.warningMsgList[0].distance) + } ---eventRadius = ${Math.round(data.warningMsgList[0].eventRadius)} --speedMaxLimit = ${data.warningMsgList[0].speedMaxLimit.toInt()}" ) when (status) { @@ -425,10 +425,9 @@ class MogoPrivateObuNewManager private constructor() { * 3:行人 * 4:OBU自身 */ - override fun onMogoObuRsmWarning( - data: MogoObuRsmWarningData? + override fun onObuRsmWarning( + data: ObuScene.RsmWarningData? ) { - super.onMogoObuRsmWarning(data) CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "onMogoObuRsmWarning ------> ${data.toString()}" @@ -505,13 +504,13 @@ class MogoPrivateObuNewManager private constructor() { } //预警status - if (data.warningMsg != null && data.warningMsg.warningData != null && data.warningMsg.warningData.size > 0) { - level = data.warningMsg.warningData[0].warningLevel //默认是1个 + if (data.warningMsg != null && data.warningMsg.warningDataList != null && data.warningMsg.warningDataList.size > 0) { + level = data.warningMsg.warningDataList[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" + "onMogoObuRsmWarning ---status---> ${data.status} ---data.warningMsg.warningData[0].status = ${data.warningMsg.warningDataList[0].status} ---v2xType = $v2xType ---alertContent = $alertContent ---ttsContent = $ttsContent ---level = $level" ) - when (data.warningMsg.warningData[0].status) { + when (data.warningMsg.warningDataList[0].status) { MogoObuConstants.STATUS.ADD -> { // 添加 //更新模型的颜色 TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data) @@ -564,8 +563,7 @@ class MogoPrivateObuNewManager private constructor() { /** * 地图匹配 是OBU算法输出地图匹配结果,主车匹配道路哪条路或者哪条车道 */ - override fun onMogoObuMapMath(data: MogoObuMapMathData?) { - super.onMogoObuMapMath(data) + override fun onObuMapMath(data: ObuScene.MapMatchData?) { if (data != null) { CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", @@ -595,371 +593,200 @@ class MogoPrivateObuNewManager private constructor() { } } } + } + } + } + + /** + * 获取消息的方位 车辆相关 + */ + private fun getMessageDirection(targetClassification: Int): WarningDirectionEnum { + // 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 //正前方 + + 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 } } -} + /** + * 构造对应展示数据和场景 根据obu的场景,add change delete确定是否展示 + * + * @param appId 使用WarningTypeEnum获取icon、提示内容、tts内容 TODO 添加事件频繁播报拦截 + * + * @see com.mogo.module.common.enums.EventTypeEnum + */ + private fun handleSdkObu( + appId: String, + direction: WarningDirectionEnum, + status: Int, + level: Int, + info: ObuScene.RvWarningData + ) { + // 这里排除需要特殊定制的语音及文案外,其余的都可以使用 EventTypeEnumNew 提供的 + var alertContent: String = "" + var ttsContent: String = "" + var changeVisualAngle = false + when (appId) { + //交叉路口碰撞预警 + MogoObuConstants.V2X_WARNING_TYPE.FCW.toString() -> { + alertContent = + EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_FCW.poiType) + ttsContent = + EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_FCW.poiType) + } -/** - * 获取消息的方位 车辆相关 - */ -private fun getMessageDirection(targetClassification: Int): WarningDirectionEnum { - // 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 //正前方 + //交叉路口碰撞预警 + MogoObuConstants.V2X_WARNING_TYPE.ICW.toString() -> { + alertContent = + EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType) + ttsContent = + EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType) + } - MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_IN_LANE -> WarningDirectionEnum.ALERT_WARNING_BOTTOM //正后方 + //左转辅助预警 + MogoObuConstants.V2X_WARNING_TYPE.LTA.toString() -> { + alertContent = + EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_LTA.poiType) + ttsContent = + EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_LTA.poiType) + } - MogoObuConstants.VEH_TARGET_POSITION.INTERSECTION_RIGHT -> WarningDirectionEnum.ALERT_WARNING_RIGHT //正右方 + //盲区预警 + 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 || + direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT + ) { //左后 + changeVisualAngle = true + 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 + ) { //右后 + changeVisualAngle = true + ttsContent = String.format(ttsContent, "右") + alertContent = String.format(alertContent, "右") + } + } - MogoObuConstants.VEH_TARGET_POSITION.INTERSECTION_LEFT -> WarningDirectionEnum.ALERT_WARNING_LEFT //正左方 + // 变道预警,注意左后车辆/注意右后车辆 + 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.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.V2X_WARNING_TYPE.DNPW.toString() -> { + alertContent = + EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_DNPW.poiType) + ttsContent = + EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_DNPW.poiType) + } - 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.V2X_WARNING_TYPE.EBW.toString() -> { + alertContent = + EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_EBW.poiType) + ttsContent = + EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_EBW.poiType) + } - MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_LEFT, MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_FAR_LEFT, - -> WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT //左后方 + //异常车辆提醒 + 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.VEH_TARGET_POSITION.BEHEAD_RIGHT, MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_FAR_RIGHT, - -> WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT //右后方 + //车辆失控预警 + 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) + } - MogoObuConstants.VEH_TARGET_POSITION.UNCLASSIFIED -> WarningDirectionEnum.ALERT_WARNING_NON //未知 - else -> WarningDirectionEnum.ALERT_WARNING_ALL - } -} - -/** - * 构造对应展示数据和场景 根据obu的场景,add change delete确定是否展示 - * - * @param appId 使用WarningTypeEnum获取icon、提示内容、tts内容 TODO 添加事件频繁播报拦截 - * - * @see com.mogo.module.common.enums.EventTypeEnum - */ -private fun handleSdkObu( - appId: String, - direction: WarningDirectionEnum, - status: Int, - level: Int, - info: MogoObuRvWarningData -) { - // 这里排除需要特殊定制的语音及文案外,其余的都可以使用 EventTypeEnumNew 提供的 - var alertContent: String = "" - var ttsContent: String = "" - var changeVisualAngle = false - when (appId) { - //交叉路口碰撞预警 - MogoObuConstants.V2X_WARNING_TYPE.FCW.toString() -> { - alertContent = - EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_FCW.poiType) - ttsContent = - EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_FCW.poiType) - } - - //交叉路口碰撞预警 - MogoObuConstants.V2X_WARNING_TYPE.ICW.toString() -> { - alertContent = - EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType) - ttsContent = - EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType) - } - - //左转辅助预警 - MogoObuConstants.V2X_WARNING_TYPE.LTA.toString() -> { - alertContent = - EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_LTA.poiType) - ttsContent = - EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_LTA.poiType) - } - - //盲区预警 - 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 || - direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT - ) { //左后 - changeVisualAngle = true - 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 - ) { //右后 - changeVisualAngle = true - ttsContent = String.format(ttsContent, "右") - alertContent = String.format(alertContent, "右") + // 这里处理固定的提示信息,包括了<紧急车辆提醒> + else -> { //TODO + // ttsContent = EventTypeEnumNew.getWarningTts(appId.toString()) + // alertContent = EventTypeEnumNew.getWarningContent(appId.toString()) } } - // 变道预警,注意左后车辆/注意右后车辆 - 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 -> { //TODO -// ttsContent = EventTypeEnumNew.getWarningTts(appId.toString()) -// alertContent = EventTypeEnumNew.getWarningContent(appId.toString()) - } - } - - when (status) { - // 添加,更新 add的时候,可能级别是2, - MogoObuConstants.STATUS.ADD, - MogoObuConstants.STATUS.UPDATE -> { - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", - "new handleSdkObu appId2 = $appId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction" - ) - if (level == 2 || level == 3) { - //不显示弹框,其它保留 - CallerMsgBoxManager.saveMsgBox( - MsgBoxBean( - MsgBoxType.V2X, - V2XMsg( - appId, - alertContent, - ttsContent - ) - ).apply { - sourceType = DataSourceType.OBU - } - ) - CallerHmiManager.warningV2X( - appId, - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - object : IMoGoWarningStatusListener { - override fun onShow() { - super.onShow() - if (changeVisualAngle) { - CallerVisualAngleManager.changeVisualAngle(TooClose) - } - } - - override fun onDismiss() { - if (changeVisualAngle) { - CallerVisualAngleManager.changeVisualAngle(Default()) - } - } - }, direction - ) - } - //更新周边车辆进行预警颜色变换,车辆实时移动和变色 ,UUID不需要匹配了 - TrafficDataConvertUtilsNew.cvxV2vThreatIndInfo2TrafficData(info)?.let { - CallerMapUIServiceManager.getMarkerService() - ?.updateITrafficThreatLevelInfo(it) - } - } - // 删除 - MogoObuConstants.STATUS.DELETE -> { - // 关闭警告红边 - CallerHmiManager.dismissWarning(WarningDirectionEnum.ALERT_WARNING_ALL) - //更新周边车辆进行预警颜色变换,车辆实时移动和变色 - TrafficDataConvertUtilsNew.cvxV2vThreatIndInfo2TrafficData(info)?.let { - it.threatLevel = 0x01 - CallerMapUIServiceManager.getMarkerService() - ?.updateITrafficThreatLevelInfo(it) - } - } - } -} - -/** - * 处理红绿灯 - */ -private fun handlerTrafficLight(appId: Int, status: Int, lights: List) { - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", - "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 -> { - // 移除顶部弹窗 - CallerTrafficLightListenerManager.disableTrafficLight() - isShowGreenWave = false - isShowRunRedLight = false -// lightCountDownRed = 1 -// lightCountDownGreen = 1 -// lightCountDownYellow = 1 - } - } -} - -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.d( - "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", - "changeTrafficLightStatus currentLight = $currentLight ----currentLight.light = ${currentLight.light} ---currentLight.phase = ${currentLight.phaseId} ---appId = $appId --countDown = ${currentLight.countDown.toInt()}" - ) - // 闯红灯预警,绿波通行和闯红灯是互斥的 - when (appId) { - 0 -> {//不可用 V2I_RLVW_VIOLATION_TYPE_UNAVAILABLE 无效 - - } - 1 -> {//闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT 一个红灯周期只显示一次 - if (!isShowRunRedLight) { - isShowRunRedLight = true + when (status) { + // 添加,更新 add的时候,可能级别是2, + MogoObuConstants.STATUS.ADD, + MogoObuConstants.STATUS.UPDATE -> { CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", - "changeTrafficLightStatus 闯红灯 --------> " + "new handleSdkObu appId2 = $appId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction" ) - 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( - EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType, - alertContent, - ttsContent// 只有第一次才tts,防止更新的时候不断的提醒 - ) - } - } - - 2 -> { //绿波通行引导 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION 一个绿灯周期只显示一次 100m的时候 - if (!isShowGreenWave) { - isShowGreenWave = true - - 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(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 - if (maxSpeed > 0) { + if (level == 2 || level == 3) { + //不显示弹框,其它保留 CallerMsgBoxManager.saveMsgBox( MsgBoxBean( MsgBoxType.V2X, V2XMsg( - EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType, + appId, alertContent, ttsContent ) @@ -968,50 +795,213 @@ private fun changeTrafficLightStatus( } ) CallerHmiManager.warningV2X( - EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType, + appId, alertContent, - ttsContent// 只有第一次才tts,防止更新的时候不断的提醒 + ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 + object : IMoGoWarningStatusListener { + override fun onShow() { + super.onShow() + if (changeVisualAngle) { + CallerVisualAngleManager.changeAngle(TooClose) + } + } + + override fun onDismiss() { + if (changeVisualAngle) { + CallerVisualAngleManager.changeAngle(Default()) + } + } + }, direction ) } + //更新周边车辆进行预警颜色变换,车辆实时移动和变色 ,UUID不需要匹配了 + TrafficDataConvertUtilsNew.cvxV2vThreatIndInfo2TrafficData(info)?.let { + CallerMapUIServiceManager.getMarkerService() + ?.updateITrafficThreatLevelInfo(it) + } + } + // 删除 + MogoObuConstants.STATUS.DELETE -> { + // 关闭警告红边 + CallerHmiManager.dismissWarning(WarningDirectionEnum.ALERT_WARNING_ALL) + //更新周边车辆进行预警颜色变换,车辆实时移动和变色 + TrafficDataConvertUtilsNew.cvxV2vThreatIndInfo2TrafficData(info)?.let { + it.threatLevel = 0x01 + CallerMapUIServiceManager.getMarkerService() + ?.updateITrafficThreatLevelInfo(it) + } } } } - when (currentLight.light) { - // 灯光不可用 - 0 -> { - CallerTrafficLightListenerManager.invokeTrafficLightPlusSource( - TrafficLightEnum.BLACK, - -1, - DataSourceType.OBU - ) - } - // 红灯 - 2, 3 -> { - val red = currentLight.countDown.toInt() - CallerTrafficLightListenerManager.invokeTrafficLightPlusSource( - TrafficLightEnum.RED, - red, - DataSourceType.OBU - ) - } - // 绿灯 - 4, 5, 6 -> { - val green = currentLight.countDown.toInt() - CallerTrafficLightListenerManager.invokeTrafficLightPlusSource( - TrafficLightEnum.GREEN, - green, - DataSourceType.OBU - ) - } - // 黄灯 - 7, 8 -> { - val yellow = currentLight.countDown.toInt() - CallerTrafficLightListenerManager.invokeTrafficLightPlusSource( - TrafficLightEnum.YELLOW, - yellow, - DataSourceType.OBU - ) + /** + * 处理红绿灯 + */ + private fun handlerTrafficLight(appId: Int, status: Int, lights: MutableList) { + CallerLogger.d( + "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", + "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 -> { + // 移除顶部弹窗 + CallerTrafficLightListenerManager.disableTrafficLight() + isShowGreenWave = false + isShowRunRedLight = false + // lightCountDownRed = 1 + // lightCountDownGreen = 1 + // lightCountDownYellow = 1 + } } } -} + + private var isShowGreenWave = false + private var isShowRunRedLight = false + + + /** + * 修改红绿灯 + */ + @Synchronized + private fun changeTrafficLightStatus( + appId: Int, + lights: MutableList + ) { + var ttsContent = "" + var alertContent = "" + //这里需要根据真实数据确定 index 取值方式 + val currentLight = lights[0] + CallerLogger.d( + "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", + "changeTrafficLightStatus currentLight = $currentLight ----currentLight.light = ${currentLight.light} ---currentLight.phase = ${currentLight.phaseID} ---appId = $appId --countDown = ${currentLight.countDown.toInt()}" + ) + // 闯红灯预警,绿波通行和闯红灯是互斥的 + when (appId) { + 0 -> {//不可用 V2I_RLVW_VIOLATION_TYPE_UNAVAILABLE 无效 + + } + 1 -> {//闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT 一个红灯周期只显示一次 + if (!isShowRunRedLight) { + isShowRunRedLight = true + 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( + EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType, + alertContent, + ttsContent// 只有第一次才tts,防止更新的时候不断的提醒 + ) + } + } + + 2 -> { //绿波通行引导 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION 一个绿灯周期只显示一次 100m的时候 + if (!isShowGreenWave) { + isShowGreenWave = true + 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" + 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 + if (maxSpeed > 0) { + CallerMsgBoxManager.saveMsgBox( + MsgBoxBean( + MsgBoxType.V2X, + V2XMsg( + EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType, + alertContent, + ttsContent + ) + ).apply { + sourceType = DataSourceType.OBU + } + ) + CallerHmiManager.warningV2X( + EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType, + alertContent, + ttsContent// 只有第一次才tts,防止更新的时候不断的提醒 + ) + } + } + } + } + + when (currentLight.light) { + // 灯光不可用 + 0 -> { + CallerTrafficLightListenerManager.invokeTrafficLightPlusSource( + TrafficLightEnum.BLACK, + -1, + DataSourceType.OBU + ) + } + // 红灯 + 2, 3 -> { + val red = currentLight.countDown.toInt() + CallerTrafficLightListenerManager.invokeTrafficLightPlusSource( + TrafficLightEnum.RED, + red, + DataSourceType.OBU + ) + } + // 绿灯 + 4, 5, 6 -> { + val green = currentLight.countDown.toInt() + CallerTrafficLightListenerManager.invokeTrafficLightPlusSource( + TrafficLightEnum.GREEN, + green, + DataSourceType.OBU + ) + } + // 黄灯 + 7, 8 -> { + val yellow = currentLight.countDown.toInt() + CallerTrafficLightListenerManager.invokeTrafficLightPlusSource( + TrafficLightEnum.YELLOW, + yellow, + DataSourceType.OBU + ) + } + } + } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/receiver/ObuTestNewObuReceiver.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/receiver/ObuTestNewObuReceiver.kt index ed1abd5575..8a6eb1f7c0 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/receiver/ObuTestNewObuReceiver.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/receiver/ObuTestNewObuReceiver.kt @@ -47,11 +47,11 @@ class ObuTestNewObuReceiver : BroadcastReceiver() { val warningList = listOf(warningData1) warningMsg.warningData = warningList - val cvxHvInfoIndInfo = MogoObuRvWarningData(0, vehBasicsMsg, warningMsg) +// val cvxHvInfoIndInfo = MogoRvWarningData(0, vehBasicsMsg, warningMsg) - MogoPrivateObuNewManager.INSTANCE - .getMogoObuListener() - .onMogoObuRvWarning(cvxHvInfoIndInfo) +// MogoPrivateObuNewManager.INSTANCE +// .getMogoObuListener() +// .onGnssInfo(cvxHvInfoIndInfo) } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/receiver/ObuTestNewObuRsiReceiver.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/receiver/ObuTestNewObuRsiReceiver.kt index f0b78a14f8..abfa91fddd 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/receiver/ObuTestNewObuRsiReceiver.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/receiver/ObuTestNewObuRsiReceiver.kt @@ -41,11 +41,11 @@ class ObuTestNewObuRsiReceiver : BroadcastReceiver() { val rsiWarningList = listOf(rsiWarning) //TODO - val cvxObuRsiInfo = MogoObuRsiWarningData(obuStatus, 1, rsiWarningList) - - MogoPrivateObuNewManager.INSTANCE - .getMogoObuListener() - .onMogoObuRsiWarning(cvxObuRsiInfo) +// val cvxObuRsiInfo = MogoObuRsiWarningData(obuStatus, 1, rsiWarningList) +// +// MogoPrivateObuNewManager.INSTANCE +// .getMogoObuListener() +// .onObuRsiWarning(cvxObuRsiInfo) } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/utils/TrafficDataConvertUtilsNew.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/utils/TrafficDataConvertUtilsNew.kt index 551c4d9c8b..d3bae2a27b 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/utils/TrafficDataConvertUtilsNew.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/utils/TrafficDataConvertUtilsNew.kt @@ -4,6 +4,8 @@ import com.mogo.eagle.core.data.enums.TrafficTypeEnum import com.mogo.eagle.core.data.traffic.TrafficData 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.support.obu.ObuBase +import com.mogo.support.obu.ObuScene import com.mogo.support.obu.model.MogoObuRsiWarningData import com.mogo.support.obu.model.MogoObuRsmWarningData import com.mogo.support.obu.model.MogoObuRvWarningData @@ -20,18 +22,18 @@ object TrafficDataConvertUtilsNew { /** * OBU 远车 转换交通元素数据,是否需要 */ - fun cvxRvInfoIndInfo2TrafficData(info: MogoObuRvWarningData): TrafficData? { - if (info.vehBasicsMsg == null) { + fun cvxRvInfoIndInfo2TrafficData(info: ObuBase.VehicleBasics): TrafficData? { + if (info == null) { CallerLogger.e("$M_OBU$TAG", "cvxRvInfoIndInfo2TrafficData 数据转换异常,请检查参数是否齐全") return null } val trafficData = TrafficData() trafficData.type = TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE - trafficData.uuid = info.vehBasicsMsg.id - trafficData.lat = info.vehBasicsMsg.latitude - trafficData.lon = info.vehBasicsMsg.longitude - trafficData.heading = info.vehBasicsMsg.heading - trafficData.speed = info.vehBasicsMsg.speed + trafficData.uuid = info.id + trafficData.lat = info.latitude + trafficData.lon = info.longitude + trafficData.heading = info.heading + trafficData.speed = info.speed return trafficData } @@ -39,25 +41,25 @@ object TrafficDataConvertUtilsNew { /** * OBU RSU道路事件预警信息 转换交通元素数据 标牌 为何要显示level */ - fun cvxRtiThreatIndInfo2TrafficData(info: MogoObuRsiWarningData): TrafficData? { - if (info.warningMsg == null || info.warningMsg.size < 1 || info.warningMsg[0].position == null) { + fun cvxRtiThreatIndInfo2TrafficData(info: ObuScene.RsiWarningData): TrafficData? { + if (info.warningMsgList == null || info.warningMsgList.size < 1 || info.warningMsgList[0].position == null) { CallerLogger.e("$M_OBU$TAG", "数据转换异常,请检查参数是否齐全") return null } val trafficData = TrafficData() trafficData.type = TrafficTypeEnum.TYPE_TRAFFIC_ID_DAO_LU_SHI_GONG - trafficData.uuid = info.warningMsg[0].signSerialNum.toString() - trafficData.lat = info.warningMsg[0].position.latitude - trafficData.lon = info.warningMsg[0].position.longitude - trafficData.threatLevel = info.warningMsg[0].warningLevel + trafficData.uuid = info.warningMsgList[0].signSerialNum.toString() + trafficData.lat = info.warningMsgList[0].position.position.positionLatLon.latitude + trafficData.lon = info.warningMsgList[0].position.position.positionLatLon.longitude + trafficData.threatLevel = info.warningMsgList[0].warningLevel return trafficData } /** * OBU 预警事件 转换交通元素数据 他车预警 */ - fun cvxV2vThreatIndInfo2TrafficData(info: MogoObuRvWarningData): TrafficData? { - if (info == null || info.vehBasicsMsg == null || info.warningMsg == null) { + fun cvxV2vThreatIndInfo2TrafficData(info: ObuScene.RvWarningData): TrafficData? { + if (info?.vehBasicsMsg == null || info.warningMsg == null) { CallerLogger.e("$M_OBU$TAG", "数据转换异常,请检查参数是否齐全") return null } @@ -68,8 +70,8 @@ object TrafficDataConvertUtilsNew { trafficData.heading = info.vehBasicsMsg.heading trafficData.speed = info.vehBasicsMsg.speed // 判断车辆V2X预警级别,调整车辆颜色 - if (info.warningMsg.warningData != null) { - trafficData.threatLevel = info.warningMsg.warningData[0].warningLevel + if (info.warningMsg.warningDataList != null) { + trafficData.threatLevel = info.warningMsg.warningDataList[0].warningLevel } else { trafficData.threatLevel = 1 } @@ -81,7 +83,7 @@ object TrafficDataConvertUtilsNew { /** * OBU 弱势交通参与者信息 转换交通元素数据 */ - fun cvxPtcThreatIndInfo2TrafficData(info: MogoObuRsmWarningData): TrafficData? { + fun cvxPtcThreatIndInfo2TrafficData(info: ObuScene.RsmWarningData): TrafficData? { if (info.participant == null) { CallerLogger.e("$M_OBU$TAG", "数据转换异常,请检查参数是否齐全") return null @@ -121,8 +123,8 @@ object TrafficDataConvertUtilsNew { } // 判断车辆V2X预警级别,调整车辆颜色 - if (info.warningMsg != null && info.warningMsg.warningData != null) { - trafficData.threatLevel = info.warningMsg.warningData[0].warningLevel + if (info.warningMsg != null && info.warningMsg.warningDataList != null) { + trafficData.threatLevel = info.warningMsg.warningDataList[0].warningLevel } else { trafficData.threatLevel = 1 } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt index 8ae5886370..06eb44312b 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt @@ -136,7 +136,7 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight super.onTrafficLightPlusSource(light, remain, lightSource) if (lightSource == DataSourceType.OBU) { - hasObuLightStatus = true //todo 会存在优先级高的数据没有回调,导致没有数据出现 + hasObuLightStatus = true } CallerTrafficLightListenerManager.showTrafficLight(light, lightSource) diff --git a/core/function-impl/mogo-core-function-devatools/build.gradle b/core/function-impl/mogo-core-function-devatools/build.gradle index f442af5c6f..61321d4b6b 100644 --- a/core/function-impl/mogo-core-function-devatools/build.gradle +++ b/core/function-impl/mogo-core-function-devatools/build.gradle @@ -84,18 +84,17 @@ dependencies { implementation rootProject.ext.dependencies.androidxrecyclerview implementation rootProject.ext.dependencies.flexbox implementation rootProject.ext.dependencies.androidautoSize + implementation rootProject.ext.dependencies.koomnative + implementation rootProject.ext.dependencies.koomxhook if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogo_core_utils implementation rootProject.ext.dependencies.mogo_core_function_call - implementation rootProject.ext.dependencies.mogo_core_data implementation rootProject.ext.dependencies.mogo_core_res }else { - implementation project(':foudations:mogo-aicloud-services-sdk') implementation project(':foudations:mogo-commons') implementation project(':core:mogo-core-utils') implementation project(':core:mogo-core-function-call') - implementation project(':core:mogo-core-data') implementation project(':core:mogo-core-res') } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 6d32280c78..f27e3087b9 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -5,6 +5,8 @@ import android.content.Context import android.view.View import android.view.ViewGroup import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.debug.DebugConfig import com.mogo.eagle.core.data.EnvConfig import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo import com.mogo.eagle.core.data.constants.MogoServicePaths @@ -16,10 +18,11 @@ import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig -import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager import com.zhjt.mogo_core_function_devatools.binding.BindingCarManager.Companion.bindingCarManager +import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigImpl +import com.zhjt.mogo_core_function_devatools.koom.KoomInitTask import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager import com.zhjt.mogo_core_function_devatools.mofang.MoFangManager.Companion.moFangManager import com.zhjt.mogo_core_function_devatools.monitor.MonitorManager @@ -46,6 +49,9 @@ class DevaToolsProvider : IDevaToolsProvider { } override fun initBiz() { + if (DebugConfig.isDebug()) { + KoomInitTask.init(AbsMogoApplication.getApp()) + } ttsManager.initTts(mContext!!) //todo //链路相关 traceManager.init(mContext!!) @@ -148,6 +154,10 @@ class DevaToolsProvider : IDevaToolsProvider { upgradeManager.downLoadPackage(mContext!!, downloadKey, downloadUrl) } + override fun updateUpgradeProgress() { + upgradeManager.updateUpgradeProgress(mContext!!) + } + override fun showStatusBar(ctx: Context, container: ViewGroup) { StatusManager.init(ctx) StatusManager.show(container) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/api/BadCaseApi.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/api/BadCaseApi.kt index 18a9d7d7cd..d87b6b61f5 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/api/BadCaseApi.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/api/BadCaseApi.kt @@ -8,9 +8,9 @@ import retrofit2.http.* internal interface BadCaseApi { @FormUrlEncoded - @POST("/yycp-vehicle-management-service/tool/badcase/add/v2") + @POST("eagle-eye-dns/yycp-vehicle-management-service/tool/badcase/add/v2") suspend fun post(@FieldMap map: Map): Response - @GET("/yycp-vehicle-management-service/tool/badcase/reasons") + @GET("eagle-eye-dns/yycp-vehicle-management-service/tool/badcase/reasons") suspend fun get(@Query("channel", encoded = true) channel: String, @Query("pageNo") pageNo: Int): Response } \ 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/binding/BindingCarManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt index 9646a3959e..316bb35fec 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt @@ -17,6 +17,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr import com.zhjt.mogo_core_function_devatools.upgrade.IPCUpgradeManager.Companion.ipcUpgradeManager +import com.zhjt.mogo_core_function_devatools.upgrade.ObuUpgradeAppNetWorkManager import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeAppNetWorkManager import mogo.telematics.pad.MessagePad @@ -160,4 +161,13 @@ class BindingCarManager : IMoGoAutopilotCarConfigListener { .getAppUpgradeInfo(mContext, mAddress, role.toString() + "") } -} \ No newline at end of file + /** + * 司机屏 处理obu升级即可,乘客屏不需要处理 TODO OBU的角色 + * + */ + fun queryObuUpgrade() { + ObuUpgradeAppNetWorkManager.getInstance().getObuUpgradeInfo(mContext, mAddress, role.toString() + "") + } + +} + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/KoomInitTask.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/koom/KoomInitTask.kt similarity index 94% rename from core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/KoomInitTask.kt rename to core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/koom/KoomInitTask.kt index 4fb06a0f67..6fca530bea 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/KoomInitTask.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/koom/KoomInitTask.kt @@ -1,4 +1,4 @@ -package com.mogo.eagle.core.function.main +package com.zhjt.mogo_core_function_devatools.koom import android.app.Application import android.os.Build diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangManager.kt index 5f53b76eae..23a07755f4 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangManager.kt @@ -8,7 +8,7 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import com.mogo.eagle.core.data.mofang.MfConstants -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.updateMfStatusView +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager.invokeMoFangStatus import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_F import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr @@ -96,7 +96,7 @@ class MoFangManager private constructor() { BluetoothDevice.ACTION_ACL_CONNECTED -> { //蓝牙设备已连接 if (!isMfConnect) { // showBondedDevice(mBluetoothAdapter) - updateMfStatusView(TAG, true) + invokeMoFangStatus(true) isMfConnect = true mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean(MfConstants.BLUETOOTH_STATUS, true) } } @@ -106,7 +106,7 @@ class MoFangManager private constructor() { BluetoothDevice.ACTION_ACL_DISCONNECTED -> { //蓝牙设备已断开 主动更新 CallerLogger.d("$M_F${TAG}","bluetoothMonitorReceiver ACTION_ACL_DISCONNECTED ----- isMfConnect = $isMfConnect ") if (isMfConnect) { - updateMfStatusView(TAG, false) + invokeMoFangStatus(false) isMfConnect = false mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean(MfConstants.BLUETOOTH_STATUS, false) } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/ObuUpgradeAppNetWorkManager.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/ObuUpgradeAppNetWorkManager.java new file mode 100644 index 0000000000..c323d84c9e --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/ObuUpgradeAppNetWorkManager.java @@ -0,0 +1,95 @@ +package com.zhjt.mogo_core_function_devatools.upgrade; + +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BINDING; + +import android.content.Context; + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.commons.constants.HostConst; +import com.mogo.eagle.core.data.bindingcar.UpgradeAppInfo; +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; +import com.mogo.eagle.core.network.MoGoRetrofitFactory; +import com.mogo.eagle.core.network.utils.GsonUtil; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.eagle.core.utilcode.util.AppUtils; + +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.RequestBody; + +/** + * @author lixiaopeng + * @description 获取obu升级信息 + * @since: 3/25/22 + */ +public class ObuUpgradeAppNetWorkManager { + private static volatile ObuUpgradeAppNetWorkManager requestNoticeManager; + private final UpgradeApiService mUpgradeApiService; + private static final String TAG = "ObuUpgrade"; + + private ObuUpgradeAppNetWorkManager() { + mUpgradeApiService = MoGoRetrofitFactory.getInstance(HostConst.getHost()) + .create(UpgradeApiService.class); + } + + public static ObuUpgradeAppNetWorkManager getInstance() { + if (requestNoticeManager == null) { + synchronized (ObuUpgradeAppNetWorkManager.class) { + if (requestNoticeManager == null) { + requestNoticeManager = new ObuUpgradeAppNetWorkManager(); + } + } + } + return requestNoticeManager; + } + + /** + * 获取obu升级信息 + * mac :工控机mac地址 + * screenType : 类型 + */ + public void getObuUpgradeInfo(Context context, String mac, String screenType) { +// String sn = "X20202203105S688HZ"; +// String mac = "48:b0:2d:3a:bc:78"; + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + int versionCode = AppUtils.getAppVersionCode(); + CallerLogger.INSTANCE.d(M_BINDING + TAG, "getObuUpgradeInfo mac = " + mac + "---type = " + screenType + "---sn = " + sn + "---versionCode =" + versionCode); + UpgradeAppRequest request = new UpgradeAppRequest(sn, mac, screenType); + RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request)); + mUpgradeApiService.getUpgradeInfo(requestBody) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + } + + @Override + public void onNext(@NonNull UpgradeAppInfo info) { + if (info != null && info.result != null) { + CallerLogger.INSTANCE.d(M_BINDING + TAG, "getObuUpgradeInfo url = " + info.result.getAppUrl() + "----code = " + info.result.getVersionCode() + "--versionCode =" + versionCode + "--info.result = " + info.result); + if (info.result.getVersionCode() > versionCode) { + CallerHmiManager.INSTANCE.showUpgradeDialog(info.result.getAppUrl().substring(info.result.getAppUrl().lastIndexOf("/")+1), info.result.getAppUrl(), info.result.getInstallTitle(), info.result.getInstallContent(), info.result.getInstallType()); + } + } else { + CallerLogger.INSTANCE.d(M_BINDING + TAG, "getObuUpgradeInfo onNext info == null"); + } + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + } + }); + + } + +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt index a180eb61f9..e880c59532 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt @@ -1,7 +1,12 @@ package com.zhjt.mogo_core_function_devatools.upgrade +import android.app.NotificationManager import android.content.Context +import androidx.core.app.NotificationCompat +import com.elegant.utils.UiThreadHandler +import com.mogo.eagle.core.function.api.devatools.IMogoDevaToolsUpgradeListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsUpgradeListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.updateStatusBarDownloadView import com.mogo.eagle.core.utilcode.breakpoint.Config import com.mogo.eagle.core.utilcode.breakpoint.bean.ThreadBean import com.mogo.eagle.core.utilcode.breakpoint.callback.IDownload @@ -110,4 +115,36 @@ class UpgradeManager : IDownload { } } } + + fun updateUpgradeProgress(context: Context) { + val builder = NotificationCompat.Builder(context) + // builder.setSmallIcon(R.mipmap.icon1001);//todo emArrow 更换图标,去除地图下载图标的依赖关系 + builder.setContentTitle("下载") + builder.setContentText("正在下载") + val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + CallerDevaToolsUpgradeListenerManager.addListener( + TAG, + object : IMogoDevaToolsUpgradeListener { + override fun onStart(url: String?) {} + override fun onPause(url: String?) {} + override fun onProgress(url: String?, length: Int) { + builder.setProgress(100, length, false) + manager.notify(0x3, builder.build()) + //下载进度提示 + builder.setContentText("已下载$length%") + updateStatusBarDownloadView(true, "download", length) + } + + override fun onFinished(url: String?) { + builder.setContentText("已下载" + 100 + "%") + UiThreadHandler.postDelayed({ + manager.cancel(0x3) + updateStatusBarDownloadView(false, "download", 100) + }, 1000) + } + + override fun onError(url: String?, errorMsg: String?) {} + }) + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index 6d4c8edbba..852be9bd7f 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -68,8 +68,7 @@ dependencies { // debugImplementation rootProject.ext.dependencies.debugleakcanary // releaseImplementation rootProject.ext.dependencies.releaseleakcanary - - implementation rootProject.ext.dependencies.mogoobu + implementation project(':libraries:mogo-obu') implementation rootProject.ext.dependencies.arouter kapt rootProject.ext.dependencies.aroutercompiler @@ -80,20 +79,17 @@ dependencies { if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { compileOnly rootProject.ext.dependencies.mogocommons - compileOnly rootProject.ext.dependencies.mogo_core_res + api rootProject.ext.dependencies.mogo_core_res compileOnly rootProject.ext.dependencies.mogo_core_utils - compileOnly rootProject.ext.dependencies.mogo_core_function_map - compileOnly rootProject.ext.dependencies.mogo_core_function_devatools compileOnly rootProject.ext.dependencies.mogo_core_function_datacenter compileOnly rootProject.ext.dependencies.mogo_core_function_call compileOnly project(':libraries:mogo-adas') } else { - api project(':test:crashreport-upgrade') api project(':test:crashreport-apmbyte') compileOnly project(':core:function-impl:mogo-core-function-datacenter') compileOnly project(':foudations:mogo-commons') - compileOnly project(':core:mogo-core-res') + api project(':core:mogo-core-res') compileOnly project(':core:mogo-core-utils') compileOnly project(':core:mogo-core-function-call') compileOnly project(':libraries:mogo-adas') diff --git a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml index 33c14875d8..d63465a300 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml @@ -1,7 +1,24 @@ + + + + + + + + + + + + + + @@ -39,10 +56,11 @@ android:clearTaskOnLaunch="${ACTIVITY_ROOT}" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize" android:enabled="true" + android:hardwareAccelerated="true" android:launchMode="singleTop" android:resizeableActivity="false" android:resumeWhilePausing="true" - android:screenOrientation="landscape" + android:screenOrientation="${SCREEN_ORIENTATION}" android:stateNotNeeded="true" android:theme="@style/Main" android:windowSoftInputMode="adjustPan|stateHidden"> @@ -67,7 +85,6 @@ + + + + + + + diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt index d9bc93a359..406fdd97ee 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt @@ -87,10 +87,6 @@ class MoGoHmiProvider : IMoGoHmiProvider { ) } - override fun updateMfStatus(tag: String, status: Boolean) { - CallerHmiViewControlListenerManager.updateMfStatus(StatusBarView.TAG, tag, status) - } - /** * 不展示顶部弹窗,其它保留 */ 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 d47c3ea182..b86ab7d917 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 @@ -635,6 +635,33 @@ internal class DebugSettingView @JvmOverloads constructor( } } + tbV2NFromCar.isChecked = FunctionBuildConfig.isV2NFromCar + //v2n车端预警 + tbV2NFromCar.setOnCheckedChangeListener { _, isChecked -> + FunctionBuildConfig.isV2NFromCar = isChecked + if (!FunctionBuildConfig.isV2NFromCar) { + tbV2NFromCar.isChecked = false + } + } + + tbDrawAiCloudFusion.isChecked = FunctionBuildConfig.isDrawAiCloudFusion + //云端感知绘制 + tbDrawAiCloudFusion.setOnCheckedChangeListener { _, isChecked -> + FunctionBuildConfig.isDrawAiCloudFusion = isChecked + if (!FunctionBuildConfig.isDrawAiCloudFusion) { + tbDrawAiCloudFusion.isChecked = false + } + } + + tbDrawRomaMode.isChecked = FunctionBuildConfig.isRomaMode + //roma + tbDrawRomaMode.setOnCheckedChangeListener { _, isChecked -> + FunctionBuildConfig.isRomaMode = isChecked + if (!FunctionBuildConfig.isRomaMode) { + tbDrawRomaMode.isChecked = false + } + } + //重启工控机所有节点 btnIpcReboot.onClick { CallerAutoPilotControlManager.sendIpcReboot() 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 0569eda8fe..6327b04bed 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 @@ -175,11 +175,7 @@ internal class SOPSettingView @JvmOverloads constructor( tbObu.isChecked = CallerObuApiManager.isConnected() tbObu.setOnCheckedChangeListener { _, isChecked -> if (!isChecked) { - if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) { - CallerObuApiManager.resetObuIpAddress("192.168.1.199") - } else if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { - CallerObuApiManager.resetObuIpAddress("192.168.8.199") - } + CallerObuApiManager.resetObuIpAddress("192.168.1.199") } else { //断开链接 CallerObuApiManager.disConnectObu() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt index 817dbe4c20..67c43f6f1f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/PncActionsView.kt @@ -77,8 +77,11 @@ class PncActionsView @JvmOverloads constructor( UiThreadHandler.post { var actions: String? = null planningActionMsg.actionMsg?.let { it -> - actions = PncActionsHelper.getAction(it.drivingState.number, it.drivingAction.number) - + try { + actions = PncActionsHelper.getAction(it.drivingState.number, it.drivingAction.number) + } catch (e:Exception){ + e.printStackTrace() + } //如果是存在云端红绿灯数据条件下,设置云端数据 if (PncActionsHelper.isWaitingTrafficlight(it.drivingState.number, it.drivingAction.number) && mTrafficLightResult != null diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TurnLightViewStatus.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TurnLightViewStatus.kt index e21e0514a6..e38d41ccbd 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TurnLightViewStatus.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/vehicle/TurnLightViewStatus.kt @@ -11,8 +11,8 @@ import android.view.animation.Animation import android.widget.ImageView import androidx.constraintlayout.widget.ConstraintLayout import chassis.Chassis +import com.mogo.eagle.core.function.api.map.angle.* import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager -import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.Turning import com.mogo.eagle.core.function.hmi.R import kotlinx.android.synthetic.main.view_turn_light_status.view.* import kotlinx.coroutines.Dispatchers @@ -55,7 +55,7 @@ class TurnLightViewStatus @JvmOverloads constructor( //根据左右进行显示和隐藏,实际要判断每个来的时间和频度 when (directionLight) { Chassis.LightSwitch.LIGHT_LEFT -> { //左转向 - CallerVisualAngleManager.changeVisualAngle(Turning(true)) + CallerVisualAngleManager.changeAngle(Turning(true)) showNormalAnimation() left_select_image.visibility = View.VISIBLE right_select_image.visibility = View.GONE @@ -63,7 +63,7 @@ class TurnLightViewStatus @JvmOverloads constructor( setAnimation(left_select_image) } Chassis.LightSwitch.LIGHT_RIGHT -> { //右转向 - CallerVisualAngleManager.changeVisualAngle(Turning(true)) + CallerVisualAngleManager.changeAngle(Turning(true)) showNormalAnimation() left_select_image.visibility = View.GONE right_select_image.visibility = View.VISIBLE @@ -71,7 +71,7 @@ class TurnLightViewStatus @JvmOverloads constructor( setAnimation(right_select_image) } else -> { //消失 - CallerVisualAngleManager.changeVisualAngle(Turning(false)) + CallerVisualAngleManager.changeAngle(Turning(false)) animationDisappear() } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BlueToothView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BlueToothView.kt index 85649ffa64..3ed347d792 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BlueToothView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/BlueToothView.kt @@ -4,7 +4,13 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.widget.RelativeLayout +import com.mogo.eagle.core.data.mofang.MfConstants +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr +import kotlinx.android.synthetic.main.view_blue_tooth.view.* +import kotlinx.android.synthetic.main.view_status_bar.view.* /** * 魔戒蓝牙控件 @@ -14,10 +20,38 @@ class BlueToothView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : RelativeLayout(context, attrs, defStyleAttr) { +) : RelativeLayout(context, attrs, defStyleAttr),IMoGoDevaToolsListener { + + companion object{ + private const val TAG = "BlueToothView" + } init { LayoutInflater.from(context).inflate(R.layout.view_blue_tooth, this, true) } + override fun onAttachedToWindow() { + super.onAttachedToWindow() + val isBluetoothConnect = + SharedPrefsMgr.getInstance(context).getBoolean(MfConstants.BLUETOOTH_STATUS, false) + if (isBluetoothConnect) { + mofangStatus(true) + } + CallerDevaToolsListenerManager.addListener(TAG, this) + } + + override fun mofangStatus(status: Boolean) { + super.mofangStatus(status) + if (status) { + mofangView.setImageResource(R.drawable.icon_bluetooth_p) + } else { + mofangView.setImageResource(R.drawable.blue_tooth) + } + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerDevaToolsListenerManager.removeListener(TAG) + } + } \ 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/StatusBarView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt index 3aad68006d..1205cba30a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/StatusBarView.kt @@ -7,14 +7,13 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.LinearLayout import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.mofang.MfConstants import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager import com.mogo.eagle.core.function.hmi.R -import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr +import com.mogo.eagle.core.utilcode.util.BarUtils import kotlinx.android.synthetic.main.view_status_bar.view.* import java.util.concurrent.CopyOnWriteArrayList @@ -38,12 +37,12 @@ class StatusBarView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() - viewStatusBarRight.addView(BatteryGroupView(this.context)) - val isBluetoothConnect = - SharedPrefsMgr.getInstance(context).getBoolean(MfConstants.BLUETOOTH_STATUS, false) - if (isBluetoothConnect) { - updateMfStatus("MoFangManager", true) + post { + val params: ViewGroup.LayoutParams = getLayoutParams() + params.height = BarUtils.getStatusBarHeight() + layoutParams = params } + viewStatusBarRight.addView(BatteryGroupView(this.context)) //添加view控制 CallerHmiViewControlListenerManager.addListener(TAG,this) @@ -106,14 +105,6 @@ class StatusBarView @JvmOverloads constructor( } } - override fun updateMfStatus(tag: String, status: Boolean) { - if (status) { - viewMofangStatus.setImageResource(R.drawable.icon_bluetooth_p) - } else { - viewMofangStatus.setImageResource(R.drawable.blue_tooth) - } - } - private fun setTextColor(color: Int) { viewTextClock.setTextColor(color) viewStatusBarTag.setTextColor(color) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt index 9ecca9d6e0..28f464b10f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt @@ -11,7 +11,9 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.main.AppListActivity import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.view_version_name.view.* @@ -44,6 +46,12 @@ class VersionNameView @JvmOverloads constructor( showCurrentPadVersion() showCurrentMapVersion() } + + // 调试入口,应对M1、M2没有安装Launcher的情况 + setOnLongClickListener { + ActivityUtils.startActivity(AppListActivity::class.java) + true + } } /** diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/AppListActivity.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/AppListActivity.kt new file mode 100644 index 0000000000..5a3c439d36 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/AppListActivity.kt @@ -0,0 +1,40 @@ +package com.mogo.eagle.core.function.main + +import android.os.Bundle +import android.view.WindowManager +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.DefaultItemAnimator +import androidx.recyclerview.widget.GridLayoutManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.main.adapter.AppListAdapter +import com.mogo.eagle.core.utilcode.util.ActivityUtils +import com.mogo.eagle.core.utilcode.util.BarUtils +import kotlinx.android.synthetic.main.activity_app_list.* + + +/** + * 系统应用列表,调试使用,暂不对外显示开放,只通过隐藏后门进入 + */ +class AppListActivity : AppCompatActivity(), AppListAdapter.OnItemClickedListener { + override fun onCreate(savedInstanceState: Bundle?) { + BarUtils.hideStatusBarAndSticky(this.window) + window.setFlags( + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + ) + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_app_list) + + val linearLayoutManager = GridLayoutManager(this, 6) //第二个参数为网格的列数 + recyclerViewAppList.layoutManager = linearLayoutManager + + recyclerViewAppList.itemAnimator = DefaultItemAnimator() + val appListAdapter = + AppListAdapter(this) + recyclerViewAppList.adapter = appListAdapter + } + + override fun onItemClicked(appListAdapter: AppListAdapter, position: Int) { + ActivityUtils.startLauncherActivity(appListAdapter.getItem(position).packageName) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt index 01cd77d9ef..7cd3cc458d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt @@ -8,9 +8,7 @@ import android.view.Gravity import android.view.View import android.view.ViewGroup import android.widget.FrameLayout -import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager -import com.alibaba.android.arouter.launcher.ARouter import com.kwai.koom.base.MonitorManager.addMonitorConfig import com.kwai.koom.nativeoom.leakmonitor.LeakListener import com.kwai.koom.nativeoom.leakmonitor.LeakMonitor.start @@ -20,11 +18,9 @@ import com.mogo.commons.analytics.AnalyticsUtils import com.mogo.commons.context.ContextHolderUtil import com.mogo.commons.debug.DebugConfig import com.mogo.commons.module.status.MogoStatusManager -import com.mogo.commons.mvp.BaseFragment import com.mogo.commons.mvp.MvpActivity import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.config.HdMapBuildConfig -import com.mogo.eagle.core.data.constants.MoGoFragmentPaths import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager @@ -38,12 +34,9 @@ import com.mogo.eagle.core.function.main.modules.MogoModulesManager import com.mogo.eagle.core.function.main.windowview.FloatingViewHandler import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.permissions.PermissionsDialogUtils -import com.mogo.eagle.core.utilcode.mogo.toast.ResourcesHelper -import com.mogo.eagle.core.utilcode.util.BarUtils import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.eagle.core.utilcode.util.ProcessUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler @@ -104,12 +97,12 @@ open class MainActivity : MvpActivity(), MainView, decorView.clipToPadding = false var statusBarView = decorView.findViewWithTag("status_bar") if (statusBarView == null) { - statusBarView = StatusBarView(this) + statusBarView = statusBar statusBarView.setTag("status_bar") } val statusBarLP = FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, - BarUtils.getStatusBarHeight() + ViewGroup.LayoutParams.WRAP_CONTENT, ) statusBarLP.topMargin = 0 statusBarLP.gravity = Gravity.TOP @@ -117,11 +110,17 @@ open class MainActivity : MvpActivity(), MainView, } /** - * 修改statusBar 重写实现,需要继承 StatusBarView,xml中基础系统控件不要修改其id,拿来即用 + * 修改statusBar重新赋值 * @return StatusBarView */ - protected val statusBarView: StatusBarView - get() = StatusBarView(this) + protected var statusBar: View?=null + get() { + return if (field == null) { + StatusBarView(this) + }else{ + field + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -353,30 +352,4 @@ open class MainActivity : MvpActivity(), MainView, } } - /** - * 由于应用是单页面的,所以采用Fragment将各模块的UI进行分割解耦合 - * - * @param newFragment 功能UI - * @param tagName UI绑定的Tag - * @param containerId 要加入的资源ID - */ - private fun addFragment(newFragment: Fragment, tagName: String, containerId: Int) { - var fragment = supportFragmentManager.findFragmentByTag(tagName) - if (fragment == null) { - fragment = newFragment - } - if (fragment == null) { - e( - SceneConstant.M_HMI + TAG, - "add fragment fail cause fragment == null, container is " + ResourcesHelper.getResNameById( - applicationContext, containerId - ) - ) - return - } - supportFragmentManager.beginTransaction() - .replace(containerId, fragment, tagName) - .commitAllowingStateLoss() - } - } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java index 9408f27d40..a80465d6a3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java @@ -13,7 +13,6 @@ import android.os.Handler; import android.os.Process; import android.text.TextUtils; import android.view.KeyEvent; -import android.widget.FrameLayout; import androidx.annotation.Nullable; @@ -32,6 +31,7 @@ import com.mogo.eagle.core.function.hmi.R; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; +import com.mogo.eagle.core.utilcode.util.ActivityUtils; import com.mogo.eagle.core.utilcode.util.MultiDisplayUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -46,8 +46,6 @@ import java.util.List; import java.util.Timer; import java.util.TimerTask; -import me.jessyan.autosize.utils.AutoSizeUtils; - /** * 针对作为Launcher的情况,做个性化操作 * @@ -78,6 +76,11 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis private long pressEDownTime = 0; private long pressEUpTime = 0; + private int clickTime = 300; //单击 + private int clickTimeInterval = 330; + private int longPressTime = 670; + private int longPressTimeInterval = 700; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -89,6 +92,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis @Override protected void onResume() { super.onResume(); + ActivityUtils.setDefaultL(this); } @Override @@ -251,7 +255,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis if (event.getAction() == KeyEvent.ACTION_DOWN) { pressADownTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent A down pressADownTime = " + pressADownTime + "---" + (pressADownTime - startPressTime) + "----isCombinationKey = " + isCombinationKey + "--pressBDownTime = " + pressBDownTime); - if ((pressADownTime - startPressTime) > 360 && (pressADownTime - startPressTime) < 1300 && pressBDownTime > 0) { + if ((pressADownTime - startPressTime) > clickTimeInterval && (pressADownTime - startPressTime) < longPressTime && pressBDownTime > 0) { if (isShowToast) { ToastUtils.showShort("方块 A 按AB组合 +1 "); } @@ -260,7 +264,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis } if (isCombinationKey != 3 && isCombinationKey != 1) { - if ((pressADownTime - startPressTime) > 1320) { + if ((pressADownTime - startPressTime) > longPressTimeInterval) { if (isShowToast) { ToastUtils.showShort("方块 长按A -2 "); } @@ -271,7 +275,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis } else if (event.getAction() == KeyEvent.ACTION_UP) { pressAUpTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent A up pressAUpTime = " + pressAUpTime + "---" + (pressAUpTime - startPressTime) + "--pressBDownTime = " + pressBDownTime); - if ((pressAUpTime - startPressTime) < 350 && isCombinationKey != 3) { + if ((pressAUpTime - startPressTime) < clickTime && isCombinationKey != 3) { isCombinationKey = 1; if (isShowToast) { ToastUtils.showShort("方块 单击A -1 "); @@ -292,7 +296,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis if (event.getAction() == KeyEvent.ACTION_DOWN) { pressBDownTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent B down pressBDownTime = " + pressBDownTime + "--差-" + (pressBDownTime - startPressTime) + "---isCombinationKey = " + isCombinationKey + "--pressADownTime = " + pressADownTime); - if ((pressBDownTime - startPressTime) > 360 && (pressBDownTime - startPressTime) < 1300 && pressADownTime > 0) { + if ((pressBDownTime - startPressTime) > clickTimeInterval && (pressBDownTime - startPressTime) < longPressTime && pressADownTime > 0) { if (isShowToast) { ToastUtils.showShort("方块 B 按AB组合 +1 "); } @@ -300,7 +304,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis isCombinationKey = 3; } if (isCombinationKey != 3 && isCombinationKey != 1) { - if ((pressBDownTime - startPressTime) > 1320) { + if ((pressBDownTime - startPressTime) > longPressTimeInterval) { if (isShowToast) { ToastUtils.showShort("方块 长按B 无操作 "); } @@ -310,7 +314,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis } else if (event.getAction() == KeyEvent.ACTION_UP) { pressBUpTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent B up pressBUpTime = " + pressBUpTime + "--差-" + (pressBUpTime - startPressTime) + "--pressADownTime = " + pressADownTime); - if ((pressBUpTime - startPressTime) < 350 && isCombinationKey != 3) { + if ((pressBUpTime - startPressTime) < clickTime && isCombinationKey != 3) { if (isShowToast) { ToastUtils.showShort("方块 单击B 0 "); } @@ -332,7 +336,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis if (event.getAction() == KeyEvent.ACTION_DOWN) { pressCDownTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按C 无操作 time dif = " + (pressCDownTime - startPressTime)); - if ((pressCDownTime - startPressTime) > 1320) { + if ((pressCDownTime - startPressTime) > longPressTimeInterval) { if (isShowToast) { ToastUtils.showShort("方块 长按C 无操作 "); } @@ -341,7 +345,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis pressCUpTime = System.currentTimeMillis(); isPressEnd = false; CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 单击C ← 向左变道 time dif = " + (pressCUpTime - startPressTime)); - if ((pressCUpTime - startPressTime) < 350) { + if ((pressCUpTime - startPressTime) < clickTime) { if (isShowToast) { ToastUtils.showShort("方块 单击C ← 向左变道 "); } @@ -353,7 +357,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis if (event.getAction() == KeyEvent.ACTION_DOWN) { pressDDownTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按D 无操作 time dif = " + (pressDDownTime - startPressTime)); - if ((pressDDownTime - startPressTime) > 1320) { + if ((pressDDownTime - startPressTime) > longPressTimeInterval) { if (isShowToast) { ToastUtils.showShort("方块 长按D 无操作 "); } @@ -362,7 +366,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis pressDUpTime = System.currentTimeMillis(); isPressEnd = false; CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 单击D → 向右变道 time dif = " + (pressDUpTime - startPressTime)); - if ((pressDUpTime - startPressTime) < 350) { + if ((pressDUpTime - startPressTime) < clickTime) { if (isShowToast) { ToastUtils.showShort("方块 单击D → 向右变道 "); } @@ -374,7 +378,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis if (event.getAction() == KeyEvent.ACTION_DOWN) { pressEDownTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按E 鸣笛 time dif = " + (pressEDownTime - startPressTime)); - if ((pressEDownTime - startPressTime) > 1320) { + if ((pressEDownTime - startPressTime) > longPressTimeInterval) { if (isShowToast) { ToastUtils.showShort("方块 长按E 鸣笛 "); } @@ -394,7 +398,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis pressEUpTime = System.currentTimeMillis(); isPressEnd = false; CallerLogger.INSTANCE.d(M_F + "MoFangManager", "方块 单击E 开启自动驾驶 time dif = " + (pressEUpTime - startPressTime)); - if ((pressEUpTime - startPressTime) < 350) { + if ((pressEUpTime - startPressTime) < clickTime) { if (isShowToast) { ToastUtils.showShort("方块 单击E 开启自动驾驶 "); } 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 684940db25..4ef06c5609 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 @@ -3,35 +3,23 @@ package com.mogo.eagle.core.function.main; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI; import android.annotation.SuppressLint; -import android.app.NotificationManager; import android.content.Context; import android.os.Process; -import androidx.annotation.Nullable; -import androidx.core.app.NotificationCompat; - import com.bytedance.boost_multidex.BoostMultiDex; -import com.elegant.utils.UiThreadHandler; import com.mogo.cloud.socket.SocketBuildConfig; import com.mogo.commons.AbsMogoApplication; -import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.module.MogoModule; import com.mogo.commons.module.MogoModulePaths; import com.mogo.eagle.core.data.config.FunctionBuildConfig; -import com.mogo.eagle.core.data.constants.MoGoConfig; import com.mogo.eagle.core.data.constants.MogoServicePaths; import com.mogo.eagle.core.function.api.chat.biz.ChatConsts; -import com.mogo.eagle.core.function.api.devatools.IMogoDevaToolsUpgradeListener; -import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager; import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; -import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsUpgradeListenerManager; -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager; import com.mogo.eagle.core.function.msgbox.db.MsgBoxDb; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.ProcessUtils; import com.mogo.eagle.core.utilcode.util.SPUtils; @@ -41,7 +29,7 @@ import java.text.SimpleDateFormat; import java.util.Date; /** - * 默认初始化一些基础服务配置 todo 分离 overView业务 和 msgBox去各自模块中 --- 扶风 + * 默认初始化一些基础服务配置 todo 分离 msgBox去自己的模块中 --- 扶风 */ public abstract class MainMoGoApplication extends AbsMogoApplication { @@ -55,23 +43,16 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { return; } start = System.currentTimeMillis(); - connectAmiIp(); // Crash 日志收集 initCrashConfig(); initLogConfig(); initTipToast(); initModules(); - //查询是否有版本的更新 - queryAppUpgrade(); if (ProcessUtils.isMainProcess(this)) { - initOverviewDb(); - if (DebugConfig.isDebug()) { - initKoom(); - } clearMessageBoxTable(); CallerMsgBoxManager.INSTANCE.queryAllMessages(this); } - upgradeProgressListener(); + CallerDevaToolsManager.INSTANCE.updateUpgradeProgress(); } @Override @@ -80,15 +61,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { return true; } - private void queryAppUpgrade() { - UiThreadHandler.postDelayed(new Runnable() { - @Override - public void run() { - CallerDevaToolsManager.INSTANCE.queryAppUpgrade(); - } - },9000); - } - @SuppressLint("SimpleDateFormat") private void clearMessageBoxTable() { new Thread(() -> { @@ -121,56 +93,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { }).start(); } - private void upgradeProgressListener() { - final NotificationCompat.Builder builder = new NotificationCompat.Builder(this); -// builder.setSmallIcon(R.mipmap.icon1001);//todo emArrow 更换图标,去除地图下载图标的依赖关系 - builder.setContentTitle("下载"); - builder.setContentText("正在下载"); - final NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - - CallerDevaToolsUpgradeListenerManager.INSTANCE.addListener(TAG, new IMogoDevaToolsUpgradeListener() { - @Override - public void onStart(@Nullable String url) { - - } - - @Override - public void onPause(@Nullable String url) { - - } - - @Override - public void onProgress(@Nullable String url, int length) { - builder.setProgress(100, length,false); - manager.notify(0x3, builder.build()); - //下载进度提示 - builder.setContentText("已下载" + length + "%"); - CallerHmiManager.INSTANCE.updateStatusBarDownloadView(true, "download", length); - } - - @Override - public void onFinished(@Nullable String url) { - builder.setContentText("已下载" + 100 + "%"); - UiThreadHandler.postDelayed(new Runnable() { - @Override - public void run() { - manager.cancel(0x3); - CallerHmiManager.INSTANCE.updateStatusBarDownloadView(false, "download", 100); - } - }, 1000); - } - - @Override - public void onError(@Nullable String url, @Nullable String errorMsg) { - - } - }); - } - - private void initKoom() { - KoomInitTask.INSTANCE.init(this); - } - /** * 初始化异常采集配置 */ @@ -193,18 +115,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { CallerDevaToolsManager.INSTANCE.init(); } - private void initOverviewDb() { - CallerFuncBizManager.getBizProvider().initOverViewDb(this); - } - - /** - * 连接ami - */ - private void connectAmiIp() { - String ipAddress = SharedPrefsMgr.getInstance(AbsMogoApplication.getApp().getBaseContext()).getString(MoGoConfig.OBU_IP, "192.168.1.199"); -// AmiClientManager.getInstance().setObuIp(ipAddress); - } - private void initModules() { CallerLogger.INSTANCE.d(M_HMI + TAG, "initModules"); // OBU 模块 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/PassengerLauncherActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/PassengerLauncherActivity.java index 653ab832cc..fe16ad97a7 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/PassengerLauncherActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/PassengerLauncherActivity.java @@ -45,7 +45,7 @@ import java.util.Timer; import java.util.TimerTask; /** - * 针对作为Launcher的情况,做个性化操作 + * 针对作为Launcher的情况,做个性化操作 TODO 测试用的,可删除 * * @author tongchenfei */ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/VideoAdAtc.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/VideoAdAtc.kt index 599e8603f9..907a96144d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/VideoAdAtc.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/VideoAdAtc.kt @@ -7,7 +7,7 @@ import com.mogo.eagle.core.utilcode.util.BarUtils import com.mogo.eagle.core.widget.TextureVideoView /** - * 视频广告 + * 视频广告 TODO 测试用的,可删除 */ class VideoAdAtc : AppCompatActivity() { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/adapter/AppListAdapter.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/adapter/AppListAdapter.java new file mode 100644 index 0000000000..43db1fc7e3 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/adapter/AppListAdapter.java @@ -0,0 +1,92 @@ +package com.mogo.eagle.core.function.main.adapter; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.eagle.core.function.hmi.R; +import com.mogo.eagle.core.utilcode.util.AppUtils; + +import java.util.ArrayList; +import java.util.List; + + +public class AppListAdapter extends RecyclerView.Adapter { + private OnItemClickedListener mOnItemClickedListener; + + public interface OnItemClickedListener { + void onItemClicked(AppListAdapter appListAdapter, int position); + } + + public static class AppViewHolder extends RecyclerView.ViewHolder { + public ImageView iconIv; + public TextView nameTv; + + public AppViewHolder(View itemView) { + super(itemView); + iconIv = (ImageView) itemView.findViewById(R.id.list_item_app_icon_iv); + nameTv = (TextView) itemView.findViewById(R.id.list_item_app_name_tv); + } + } + + private ArrayList showApps = new ArrayList<>(); + + public AppListAdapter(OnItemClickedListener onItemClickedListener) { + // 设置被允许展示的APP + showApps.add("com.android.settings"); + + mOnItemClickedListener = onItemClickedListener; + mApps = new ArrayList<>(); + for (AppUtils.AppInfo appInfo : AppUtils.getAppsInfo()) { + if (!appInfo.isSystem()) { + mApps.add(appInfo); + } else { + if (showApps.contains(appInfo.getPackageName())) { + mApps.add(appInfo); + } + } + } + } + + private List mApps; + + public AppUtils.AppInfo getItem(int position) { + return mApps.get(position); + } + + @Override + public int getItemCount() { + return mApps.size(); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_app_list, parent, false); + return new AppViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + AppViewHolder itemViewHolder = (AppViewHolder) holder; + itemViewHolder.iconIv.setImageDrawable(mApps.get(position).getIcon()); + itemViewHolder.nameTv.setText(mApps.get(position).getName()); + itemViewHolder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mOnItemClickedListener != null) { + mOnItemClickedListener.onItemClicked(AppListAdapter.this, position); + } + } + }); + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/activity_app_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/activity_app_list.xml new file mode 100644 index 0000000000..7919759222 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/activity_app_list.xml @@ -0,0 +1,18 @@ + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_app_list.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_app_list.xml new file mode 100644 index 0000000000..05b6631dc0 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_app_list.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_blue_tooth.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_blue_tooth.xml index e5e6fcb799..e85165ffca 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_blue_tooth.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_blue_tooth.xml @@ -5,10 +5,11 @@ android:layout_height="@dimen/dp_54"> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index 68ffc3415d..3aad4d8c8f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -242,6 +242,42 @@ android:textOn="关闭感知优化模式" android:textSize="@dimen/dp_24" /> + + + + + + + android:layout_height="wrap_content"> + - + package="com.mogo.eagle.core.function.map"> + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt index e1c4c357e7..eefc61d621 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt @@ -2,10 +2,12 @@ package com.mogo.eagle.core.function import android.content.Context import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider import com.mogo.eagle.core.function.business.MapPointCloudSubscriber import com.mogo.eagle.core.function.business.SpeedLimitDataManager +import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.aiCloudIdentifyDataManager import com.mogo.eagle.core.function.business.identify.MapIdentifySubscriber import com.mogo.eagle.core.function.business.routeoverlay.MogoRouteOverlayManager @@ -20,6 +22,7 @@ class MapBizProvider :IMoGoFunctionServerProvider{ MogoRouteOverlayManager.getInstance().init() MapPointCloudSubscriber.instance SpeedLimitDataManager.getInstance().start() + aiCloudIdentifyDataManager.init(AbsMogoApplication.getApp()) } override fun onDestroy() { diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/MoGoVisualAngleChangeProvider.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/MoGoVisualAngleChangeProvider.kt new file mode 100644 index 0000000000..52216f9c14 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/angle/MoGoVisualAngleChangeProvider.kt @@ -0,0 +1,306 @@ +package com.mogo.eagle.core.function.angle + +import android.content.* +import android.os.* +import android.util.* +import androidx.lifecycle.* +import androidx.lifecycle.Lifecycle.Event +import androidx.lifecycle.Lifecycle.Event.ON_DESTROY +import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.eagle.core.data.config.* +import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.data.map.* +import com.mogo.eagle.core.data.map.MapRoadInfo.StopLine +import com.mogo.eagle.core.function.api.map.angle.* +import com.mogo.eagle.core.function.api.map.angle.Scene +import com.mogo.eagle.core.function.call.autopilot.* +import com.mogo.eagle.core.function.call.map.* +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.OnRoadListener +import com.mogo.eagle.core.utilcode.kotlin.* +import com.mogo.eagle.core.utilcode.mogo.* +import com.mogo.eagle.core.utilcode.mogo.logger.* +import com.zhidaoauto.map.sdk.open.tools.* +import kotlinx.coroutines.* +import kotlinx.coroutines.android.* +import java.util.* +import java.util.concurrent.atomic.* + +@Route(path = MogoServicePaths.PATH_VISUAL_ANGLE) +class MoGoVisualAngleChangeProvider: IMoGoVisualAngleChangeProvider { + + override val functionName: String + get() = "VisualAngleChange" + + companion object { + const val TAG = "VisualAngleChange" + } + + private val triggerLocation = AtomicReference() + + private val distanceOfCarToStopLine = AtomicReference(0.0) + + private val travelled by lazy { AtomicReference(0.0) } + + /** + * 业务实体,不对外暴露 + * @param target: 目标场景 + * @param isDisplay: 是否正在展示 + * @param triggerTime: 触发时间 + */ + private data class Record(val target: Scene, var isDisplay: Boolean = false, var triggerTime: Long): Comparable { + override fun compareTo(other: Record): Int { + //如果时间一样,优先级越高,越靠近堆顶 + return other.target.priority - target.priority + } + } + + private val queue by lazy { + PriorityQueue() + } + + private val listener = object : OnRoadListener { + private val roadId = AtomicReference() + private val triggerRoadId = AtomicReference() + + override fun onRoadIdInfo(roadId: String) { + this.roadId.set(roadId) + Log.d(TAG, "-- onRoadIdInfo --: prev: ${this.triggerRoadId.get()} -> curr: $roadId") + val loc = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + var triggerClose = false + val distance = distanceOfCarToStopLine.get() + 5 + if (hasCrossRoad && distance > 0) { + val prev = triggerLocation.get() + if (prev != null && loc != null) { + travelled.set(MapTools.distance(loc.longitude, loc.latitude, prev.longitude, prev.latitude) + travelled.get()) + triggerLocation.set(loc) + } + val oldRoadId = triggerRoadId.get() + Log.d(TAG, "-- onRoadIdInfo --: travelled --: ${travelled.get()}") + if ((travelled.get() > distance) && oldRoadId != null && oldRoadId != roadId) { + distanceOfCarToStopLine.set(0.0) + hasCrossRoad = false + triggerRoadId.set(null) + travelled.set(0.0) + triggerLocation.set(null) + Log.d(TAG, "-- onRoadIdInfo --: trigger close --") + triggerClose = true + } + } + if (triggerClose) { + changeAngle(CrossRoad(false)) + } + } + + + override fun onStopLineInfo(info: StopLine) { + Log.d(TAG, "-- onStopLineInfo --: ${info.distanceOfCarToStopLine}") + if (!hasCrossRoad && info.distanceOfCarToStopLine <= 30.0) { + hasCrossRoad = true + triggerRoadId.set(this.roadId.get()) + distanceOfCarToStopLine.set(info.distanceOfCarToStopLine) + triggerLocation.set(CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02()) + changeAngle(CrossRoad(true)) + } + } + } + + override fun init(context: Context?) { + if (Thread.currentThread() != Looper.getMainLooper().thread) { + scope.launch { + initListen(context) + } + } else { + initListen(context) + } + } + + private fun initListen(ctx: Context?) { + ctx ?: return + ctx.lifeCycleOwner.lifecycle.addObserver(object : LifecycleEventObserver { + override fun onStateChanged(source: LifecycleOwner, event: Event) { + if (event == ON_DESTROY) { + CallerMapRoadListenerManager.unRegisterRoadListener("VisualAngleChange") + } + } + }) + CallerMapRoadListenerManager.registerRoadListener("VisualAngleChange", listener) + } + + @Volatile + private var hasCrossRoad = false + + + private var scope: CoroutineScope = acquireScope() + @Synchronized + get() { + if (field.isActive) { + return field + } + val scope = acquireScope() + field = scope + return field + } + + private var defaultDelayJob: Job? = null + + private fun acquireScope(): CoroutineScope { + return CoroutineScope(Handler(Looper.getMainLooper()).asCoroutineDispatcher("change-visual-angle") + SupervisorJob()) + } + + + override fun onDestroy() { + CallerMapRoadListenerManager.unRegisterRoadListener("VisualAngleChange") + } + + @Volatile + private var mLevel:Boolean = false + + override fun updateLongSightLevel(level:Boolean){ + mLevel = level + } + + override fun changeAngle(scene: Scene) { + val appIdentityMode = FunctionBuildConfig.appIdentityMode + if (AppIdentityModeUtils.isBus(appIdentityMode) && AppIdentityModeUtils.isPassenger(appIdentityMode)) { + return + } + if(mLevel){ + return + } + val triggerTime = SystemClock.elapsedRealtime() + scope.launch { + Log.d(TAG, "--- 1 ---") + val displayed = getDisplayed() + if (displayed == null) { + Log.d(TAG, "--- 2 ---") + if (scene is Turning) { + if (!scene.open) { + changeAngle(Default()) + return@launch + } + } + if (scene is CrossRoad) { + if (!scene.open) { + changeAngle(Default()) + return@launch + } + } + doRealVisualAngleChange(triggerTime, scene, null) + } else { + val prev = displayed.target + Log.d(TAG, "--- 3 --- old: $prev -> cur: $scene") + val prevTriggerTime = displayed.triggerTime + if (scene !is Default && prev.priority > scene.priority && (prev is RoadEvent || prev is TooClose)) { + val displayDuration = triggerTime - prevTriggerTime + Log.d(TAG, "--- 4 ---:场景[$prev], 已展示时长: duration: $displayDuration") + if (displayDuration < prev.displayThreshold) { + Log.d(TAG, "--- 5 --- 场景[$prev]:仍在保护展示时长内,直接return") + return@launch + } else { + Log.d(TAG, "--- 6 --- 场景[$prev]:已过保护展示时长,从展示的队列中移除,显示默认视角") + queue -= displayed + changeAngle(Default()) + return@launch + } + } + if (prev is Turning && scene is Turning) { + val isOpen = scene.open + if (!isOpen) { + Log.d(TAG, "--- 7 --- 场景[$scene], 收到关闭通知") + queue -= displayed + changeAngle(Default()) + return@launch + } + } + if (prev is CrossRoad && scene is CrossRoad) { + val isOpen = scene.open + if (!isOpen) { + Log.d(TAG, "--- 8 --- old: $prev -> cur: $scene") + queue -= displayed + changeAngle(Default()) + return@launch + } + } + if (prev.priority == scene.priority) { + Log.d(TAG, "--- 9 --- 场景[$prev]正在展示,尚未收到关闭,优先级一致,直接return") + return@launch + } + if (prev.priority > scene.priority && prev.displayThreshold < 0) { + Log.d(TAG, "--- 10 --- 场景[$prev]正在展示,尚未收到关闭,场景,依然展示当前场景,直接return") + return@launch + } + doRealVisualAngleChange(triggerTime, scene, displayed) + } + } + } + + private fun CoroutineScope.doRealVisualAngleChange(triggerTime: Long, target: Scene, displayed: Record? = null) { + if (target is Default) { + Log.d(TAG, "--- doRealVisualAngleChange --- 1 ---") + displayed?.also { + queue -= it + } + defaultDelayJob?.safeCancel() + launch { + val delay = target.unit.toMillis(target.delay) + Log.d(TAG, "--- doRealVisualAngleChange --- 2 ---") + delay(delay) + Log.d(TAG, "--- doRealVisualAngleChange --- 3 ---") + doChangeAngle(Record(target, triggerTime = triggerTime)) + }.also { itx -> + itx.invokeOnCompletion { + if (it is CancellationException) { + Log.d(TAG, "--- doRealVisualAngleChange --- 4 ---") + } + } + defaultDelayJob = itx + } + } else { + Log.d(TAG, "--- doRealVisualAngleChange --- 5 ---") + defaultDelayJob?.safeCancel() + if (displayed == null || displayed.target.priority <= target.priority) { + Log.d(TAG, "--- doRealVisualAngleChange --- 6 ---") + displayed?.also { + queue -= it + } + if (target is Turning) { + if (!target.open) { + Log.d(TAG, "--- doRealVisualAngleChange --- 7 ---") + changeAngle(Default()) + return + } + } + if (target is CrossRoad) { + if (!target.open) { + Log.d(TAG, "--- doRealVisualAngleChange --- 8 ---") + changeAngle(Default()) + return + } + } + Log.d(TAG, "--- doRealVisualAngleChange --- 10 ---") + doChangeAngle(Record(target, triggerTime = triggerTime)) + } + } + } + + @OptIn(InternalCoroutinesApi::class) + private fun doChangeAngle(record: Record) { + val angle = record.target.angle + CallerMapUIServiceManager.getMapUIController()?.also { + Log.d(TAG, "--- doChangeAngle ---: ${record.target}") + if (record.target !is Default) { + record.isDisplay = true + kotlinx.coroutines.internal.synchronized(queue) { + queue += record + } + } + it.changeMapVisualAngle(angle, null) + } + } + + /** + * 是否有正在展示的 + */ + @Synchronized + private fun getDisplayed() = queue.firstOrNull() +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt new file mode 100644 index 0000000000..0393e027bb --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudIdentifyDataManager.kt @@ -0,0 +1,91 @@ +package com.mogo.eagle.core.function.business.ai + +import android.content.Context +import com.mogo.aicloud.services.socket.IMogoOnMessageListener +import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.function.business.ai.net.AiCloudIdentifyNetWorkModel +import com.mogo.eagle.core.function.business.identify.MapIdentifySubscriber +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP +import com.mogo.map.listener.IMogoMapListener +import com.mogo.map.uicontroller.VisualAngleMode +import mogo.yycp.api.proto.SocketDownData + +class AiCloudIdentifyDataManager : IMogoMapListener { + + companion object { + private const val TAG = "AiCloudIdentifyData" + + var START_METRE = 200 + var END_METRE = 2000 + + @JvmStatic + val aiCloudIdentifyDataManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + AiCloudIdentifyDataManager() + } + } + + private val aiCloudIdentifyNetWorkModel = AiCloudIdentifyNetWorkModel() + private var showAiCloud = false + + fun init(mContext: Context) { + MogoAiCloudSocketManager.getInstance(mContext) + .registerOnMessageListener( + 0x040003, //低频数据 + object : IMogoOnMessageListener { + override fun target(): Class { + return SocketDownData.SocketDownDataProto::class.java + } + + override fun onMsgReceived(obj: SocketDownData.SocketDownDataProto?) { + if (!FunctionBuildConfig.isDrawAiCloudFusion) { + MapIdentifySubscriber.instance.clearAiCloudRoma() + return + } + obj?.let { + obj.data?.let { + if (showAiCloud) { + if (it.allListList == null || it.allListList.size == 0) { + MapIdentifySubscriber.instance.clearAiCloudRoma() + return + } + MapIdentifySubscriber.instance.renderAiCloudResult(it.allListList) + } + } + } + } + }) + requestRangeOfIdentify() + } + + fun requestRangeOfIdentify() { + aiCloudIdentifyNetWorkModel.requestIdentifyRange({ + CallerLogger.d( + M_MAP + TAG, + "requestIdentifyRange ok startRange:$START_METRE, endRange:$END_METRE" + ) + }, { + CallerLogger.d( + M_MAP + TAG, + "requestIdentifyRange error : $it , startRange:$START_METRE, endRange:$END_METRE" + ) + }) + } + + override fun onMapVisualAngleChanged(visualAngleMode: VisualAngleMode) { + super.onMapVisualAngleChanged(visualAngleMode) + when { + visualAngleMode.isRoma -> { + showAiCloud = true + FunctionBuildConfig.isDrawIdentifyData = false + } + else -> { + showAiCloud = false + FunctionBuildConfig.isDrawIdentifyData = true + MapIdentifySubscriber.instance.clearAiCloudRoma() + } + } + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudRangeBroadcastReceiver.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudRangeBroadcastReceiver.kt new file mode 100644 index 0000000000..a45ec2a068 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/AiCloudRangeBroadcastReceiver.kt @@ -0,0 +1,30 @@ +package com.mogo.eagle.core.function.business.ai + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.END_METRE +import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.START_METRE +import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.aiCloudIdentifyDataManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP + +class AiCloudRangeBroadcastReceiver : BroadcastReceiver() { + + companion object { + private const val TAG = "AiCloudRangeBroadcastReceiver" + private const val START_RANGE = "startRange" + private const val END_RANGE = "endRange" + + // adb shell am broadcast -a com.map.aiCloud.notification --ei startRange 140 --ei endRange 2000 + } + + override fun onReceive(context: Context, intent: Intent) { + val startRange = intent.getIntExtra(START_RANGE, START_METRE) + val endRange = intent.getIntExtra(END_RANGE, END_METRE) + START_METRE = startRange + END_METRE = endRange + CallerLogger.d("$M_MAP$TAG", "startRange:$startRange, endRange:$endRange") + aiCloudIdentifyDataManager.requestRangeOfIdentify() + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/AiCloudIdentifyNetWorkModel.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/AiCloudIdentifyNetWorkModel.kt new file mode 100644 index 0000000000..8ad4ad3521 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/AiCloudIdentifyNetWorkModel.kt @@ -0,0 +1,63 @@ +package com.mogo.eagle.core.function.business.ai.net + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.debug.DebugConfig +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.END_METRE +import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.START_METRE +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.apiCall +import com.mogo.eagle.core.network.request +import com.zhjt.service_biz.FuncConfig + +class AiCloudIdentifyNetWorkModel { + + companion object { + val aiCloudIdentifyNetWorkModel by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + AiCloudIdentifyNetWorkModel() + } + } + + private fun getHost(): String { + var host = "http://dzt-city.zhidaozhixing.com" + when (DebugConfig.getNetMode()) { + DebugConfig.NET_MODE_DEV, + DebugConfig.NET_MODE_QA -> host = "http://dzt-qa-city.zhidaozhixing.com" + } + return host + } + + private fun getNetWorkApi(baseUrl: String = getHost()): IAiCloudIdentifyApiService { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) + .create(IAiCloudIdentifyApiService::class.java) + } + + fun requestIdentifyRange( + onSuccess: (() -> Unit), + onError: ((String) -> Unit) + ) { + request> { + val map = mutableMapOf() + start { + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["status"] = true + map["startMetre"] = START_METRE + map["endMetre"] = END_METRE + map["type"] = 1 + } + loader { + apiCall { + getNetWorkApi().identifyRange(map) + } + } + onSuccess { + onSuccess.invoke() + } + onError { + it.message?.let { errorMsg -> + onError.invoke(errorMsg) + } + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/IAiCloudIdentifyApiService.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/IAiCloudIdentifyApiService.kt new file mode 100644 index 0000000000..3ddaac5e43 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/IAiCloudIdentifyApiService.kt @@ -0,0 +1,13 @@ +package com.mogo.eagle.core.function.business.ai.net + +import com.mogo.eagle.core.data.BaseResponse +import retrofit2.http.Body +import retrofit2.http.Headers +import retrofit2.http.POST + +interface IAiCloudIdentifyApiService { + + @Headers("Content-type:application/json;charset=UTF-8") + @POST("yycp-c-v2x-service/dataFusion/remoteDrivingSet") + suspend fun identifyRange(@Body map: MutableMap): BaseResponse +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/Identify.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/Identify.kt index e3ba3c913b..24c70b58b3 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/Identify.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/Identify.kt @@ -3,16 +3,35 @@ package com.mogo.eagle.core.function.business.identify import com.mogo.eagle.core.data.traffic.TrafficData import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.TrackedObject +import mogo.yycp.api.proto.SocketDownData interface Identify { - fun renderAdasRecognizedResult(resultList: List?) + fun renderAdasRecognizedResult(resultList: List?) { - fun renderPlanningWarningObj(planningObjects: List?) + } + + fun renderAiCloudResult(resultList: List) { + + } + + fun renderPlanningWarningObj(planningObjects: List?) { + + } fun renderOBUWarningObj(exist: Boolean, obuTrafficData: TrafficData) { } - fun clearOldMarker() + fun clearOldMarker() { + + } + + fun clearAiMarker() { + + } + + fun getIdentifyObj(uuid: String): TrackedObject? { + return null + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyAiCloudDataDrawer.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyAiCloudDataDrawer.kt new file mode 100644 index 0000000000..a0a741db4a --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyAiCloudDataDrawer.kt @@ -0,0 +1,102 @@ +package com.mogo.eagle.core.function.business.identify + +import android.annotation.SuppressLint +import androidx.collection.ArraySet +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.w +import com.mogo.map.MogoMarkerManager +import mogo.yycp.api.proto.SocketDownData +import java.util.concurrent.ConcurrentHashMap + +class IdentifyAiCloudDataDrawer : Identify { + + companion object { + private const val TAG = "IdentifyDataDrawer" + } + + /** + * 上一帧数据的缓存 + */ + private val mMarkersCaches = ConcurrentHashMap() + + /** + * 记录每次实际绘制的交通元素UUID + */ + @SuppressLint("NewApi") + private val trafficDataUuidList = ArraySet() + + /** + * 过滤后的数据集合 + */ + @SuppressLint("NewApi") + private val mFilterTrafficData = HashMap() + + @SuppressLint("NewApi") + override fun renderAiCloudResult(resultList: List) { + if (resultList.isEmpty()) { + clearOldMarker() + w(TAG, "感知数据为空无需渲染……") + return + } + if (!MogoStatusManager.getInstance().isVrMode) { + clearOldMarker() + w(TAG, "渲染 adas 识别的数据 当前不是VR模式") + return + } + + //清除缓存 + for (data in resultList) { + if (trafficDataUuidList.size > 0 && trafficDataUuidList.contains("" + data.uuid)) { + trafficDataUuidList.remove("" + data.uuid) + } + } + + //清除缓存,删除marker + val it: MutableIterator<*> = trafficDataUuidList.iterator() + while (it.hasNext()) { + val key = it.next() as String + it.remove() + mMarkersCaches.remove(key) + MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) + .removeMarker(key.hashCode().toString()) + } + + val filterList = filterTrafficData(resultList) + if (filterList.size > 0) { + // 绘制新数据 + MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) + .updateBatchAiMarkerPosition(filterList) + } + } + + /** + * 数据过滤器 + * + * @return 过滤后的数据集合 + */ + @SuppressLint("NewApi") + private fun filterTrafficData(trafficData: List): HashMap { + mFilterTrafficData.clear() + trafficDataUuidList.clear() + for (data in trafficData) { + val uuid = "" + data.uuid + mMarkersCaches[uuid] = data + trafficDataUuidList.add(uuid) + mFilterTrafficData[uuid] = data + } + return mFilterTrafficData + } + + @SuppressLint("NewApi") + override fun clearAiMarker() { + trafficDataUuidList.clear() + mMarkersCaches.forEach { (uuid, _) -> + mMarkersCaches.remove(uuid) + MogoMarkerManager.getInstance(AbsMogoApplication.getApp()) + .removeMarker(uuid.hashCode().toString()) + } + mFilterTrafficData.clear() + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt index 9eee2c09c1..f633dc7908 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/IdentifyFactory.kt @@ -9,6 +9,7 @@ import com.mogo.eagle.core.function.call.obu.CallerObuWarningListenerManager import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.TrackedObject +import mogo.yycp.api.proto.SocketDownData object IdentifyFactory : Identify, IMoGoObuStatusListener { @@ -22,7 +23,12 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener { internal val beautifyDataDrawer = IdentifyBeautifyDataDrawer() } + object AiIdentify { + internal val aiCloudDataDrawer = IdentifyAiCloudDataDrawer() + } + private var identify: Identify? = null + private var aiCloudIdentify: Identify? = null init { identify = if (FunctionBuildConfig.isBeautyMode) { @@ -30,14 +36,17 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener { } else { DriverIdentify.originDataDrawer } + aiCloudIdentify = AiIdentify.aiCloudDataDrawer CallerObuWarningListenerManager.addListener(TAG, this) } private const val MSG_DATA_TRACK = 0 - private const val MSG_DATA_WARNING = 1 - private const val MSG_DATA_OBU_WARNING_UPDATE = 2 - private const val MSG_DATA_OBU_WARNING_REMOVE = 3 - private const val MSG_DATA_CLEAR = 4 + private const val MSG_DATA_AI_TRACK = 1 + private const val MSG_DATA_WARNING = 2 + private const val MSG_DATA_OBU_WARNING_UPDATE = 3 + private const val MSG_DATA_OBU_WARNING_REMOVE = 4 + private const val MSG_DATA_CLEAR = 5 + private const val MSG_DATA_AI_CLEAR = 6 // 维护一个线程定时轮询数据进行地图绘制 private val mDrawerHandler: Handler = @@ -63,6 +72,11 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener { identify!!.renderAdasRecognizedResult(msg.obj as List?) } } + MSG_DATA_AI_TRACK -> { + if (msg.obj is List<*>) { + aiCloudIdentify!!.renderAiCloudResult(msg.obj as List) + } + } MSG_DATA_WARNING -> { if (msg.obj is List<*>) { identify!!.renderPlanningWarningObj(msg.obj as List?) @@ -81,6 +95,9 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener { MSG_DATA_CLEAR -> { identify!!.clearOldMarker() } + MSG_DATA_AI_CLEAR -> { + aiCloudIdentify!!.clearAiMarker() + } } } } @@ -92,6 +109,13 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener { mDrawerHandler.sendMessage(message) } + override fun renderAiCloudResult(resultList: List) { + val message = Message.obtain() + message.what = MSG_DATA_AI_TRACK + message.obj = resultList + mDrawerHandler.sendMessage(message) + } + override fun renderPlanningWarningObj(planningObjects: List?) { val message = Message.obtain() message.what = MSG_DATA_WARNING @@ -105,6 +129,16 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener { mDrawerHandler.sendMessage(message) } + override fun clearAiMarker() { + val message = Message.obtain() + message.what = MSG_DATA_AI_CLEAR + mDrawerHandler.sendMessage(message) + } + + override fun getIdentifyObj(uuid: String): TrackedObject? { + return identify?.getIdentifyObj(uuid) + } + override fun updateTrackerWarningInfo(trafficData: TrafficData) { super.updateTrackerWarningInfo(trafficData) val message = Message.obtain() diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt index d9a344ec2e..0cd59447a9 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/MapIdentifySubscriber.kt @@ -1,12 +1,17 @@ package com.mogo.eagle.core.function.business.identify +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_IDENTIFY import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener import com.mogo.eagle.core.function.api.base.IMoGoSubscriber +import com.mogo.eagle.core.function.api.map.marker.IMoGoIdentifyListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager import com.mogo.eagle.core.utilcode.util.ThreadUtils import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.TrackedObject +import mogo.yycp.api.proto.SocketDownData /** * 订阅感知数据的订阅者 @@ -14,7 +19,8 @@ import mogo.telematics.pad.MessagePad.TrackedObject * * @author donghongyu */ -class MapIdentifySubscriber private constructor() : IMoGoSubscriber, +@Route(path = PATH_IDENTIFY) +class MapIdentifySubscriber private constructor() : IMoGoIdentifyListener, IMoGoSubscriber, IMoGoAutopilotIdentifyListener { private val TAG = "MapIdentifySubscriber" @@ -36,7 +42,6 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, override fun onDestroy() { CallerAutopilotIdentifyListenerManager.removeListener(TAG) - } override fun onAutopilotIdentifyDataUpdate(trafficData: List?) { @@ -53,6 +58,26 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, } } + fun renderAiCloudResult(cloudData: List) { + try { + if (FunctionBuildConfig.isDrawAiCloudFusion) { + ThreadUtils.getSinglePool().execute { +// aiCloudDataDrawer.renderAiCloudResult(cloudData) + IdentifyFactory.renderAiCloudResult(cloudData) + } + } else { + clearAiCloudRoma() + } + } catch (e: Exception) { + e.printStackTrace() + } + } + + fun clearAiCloudRoma() { +// aiCloudDataDrawer.clearAiMarker() + IdentifyFactory.clearAiMarker() + } + override fun onAutopilotIdentifyPlanningObj(planningObjects: List?) { try { if (FunctionBuildConfig.isDrawIdentifyData && FunctionBuildConfig.debugTrackerProvider == 0) { @@ -67,7 +92,12 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber, } } - override fun onAutopilotWarnMessage(warn: MessagePad.Warn?) { + override fun getIdentifyObj(uuid: String): TrackedObject? { + return IdentifyFactory.getIdentifyObj(uuid) + } + + override fun init(context: Context?) { } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackObj.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackObj.java index e18dc702fb..512ef7bc19 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackObj.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackObj.java @@ -55,8 +55,8 @@ public class TrackObj { } private void correct() { -// calAverageSpeedAndType(); -// calLoc(); + calAverageSpeedAndType(); + calLoc(); // calHeading(); } @@ -107,18 +107,18 @@ public class TrackObj { private void calHeading() { //更正数据,速度小于LIMIT_SPEED使用上一帧数据 - if (relativeStatic()) { - if (roadAngle != 0.0) { - CenterLine centerLine = CallerMapUIServiceManager.INSTANCE.getMapUIController().getCenterLineInfo(lon, lat, -1); - if (centerLine != null && centerLine.getAngle() != 0) { - cacheData = cacheData.toBuilder().setHeading(centerLine.getAngle()).build(); - } else { - cacheData = cacheData.toBuilder().setHeading(circleQueue.getLastFrame().getHeading()).build(); - } - } else { - cacheData = cacheData.toBuilder().setHeading(circleQueue.getLastFrame().getHeading()).build(); - } - } +// if (relativeStatic()) { +// if (roadAngle != 0.0) { +// CenterLine centerLine = CallerHDMapManager.INSTANCE.getCenterLineInfo(lon, lat, -1); +// if (centerLine != null && centerLine.getAngle() != 0) { +// cacheData = cacheData.toBuilder().setHeading(centerLine.getAngle()).build(); +// } else { +// cacheData = cacheData.toBuilder().setHeading(circleQueue.getLastFrame().getHeading()).build(); +// } +// } else { +// cacheData = cacheData.toBuilder().setHeading(circleQueue.getLastFrame().getHeading()).build(); +// } +// } } public double getRecentlyTime() { diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceColorHelper.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceColorHelper.kt index 68abd5926b..bc96ab3770 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceColorHelper.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceColorHelper.kt @@ -9,9 +9,8 @@ object TrackerSourceColorHelper { @SuppressLint("NewApi") fun filterData(data: TrackedObject): Boolean { - if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type - || data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_501.type || data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_502.type - ) { + if (!FunctionBuildConfig.isDrawUnknownIdentifyData && (data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type + || data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_501.type || data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_502.type)) { return true } var trackIPCFilter = true diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/MogoMapService.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/MogoMapService.java index 472caaf9dd..651b2a8a74 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/MogoMapService.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/MogoMapService.java @@ -41,7 +41,7 @@ public class MogoMapService implements IMogoMapService { } @Override - public IMogoOverlayManager getOverlayManager(Context context) { + public IMogoOverlayManager getOverlayManager() { return MogoOverlayManager.getInstance(); } @@ -52,6 +52,5 @@ public class MogoMapService implements IMogoMapService { @Override public void init(Context context) { - CallerVisualAngleManager.INSTANCE.init(context); } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/drawer/BaseDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/drawer/BaseDrawer.java index 09cc8e39b5..b91a16170e 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/drawer/BaseDrawer.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/drawer/BaseDrawer.java @@ -5,7 +5,7 @@ import android.content.Context; import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.function.impl.marker.AdasRecognizedType; -import com.mogo.eagle.core.function.view.R; +import com.mogo.eagle.core.function.map.R; /** * @author congtaowang diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapCameraInfoView.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapCameraInfoView.java index 4160a685dd..1a74ba53a8 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapCameraInfoView.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapCameraInfoView.java @@ -9,7 +9,7 @@ import android.widget.ImageView; import androidx.annotation.Nullable; import com.mogo.eagle.core.data.map.entity.MarkerShowEntity; -import com.mogo.eagle.core.function.view.R; +import com.mogo.eagle.core.function.map.R; import com.mogo.map.marker.MogoMarkerOptions; /** diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapMarkerBaseView.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapMarkerBaseView.java index cb1cdbbebe..527d352ed4 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapMarkerBaseView.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapMarkerBaseView.java @@ -12,7 +12,7 @@ import android.widget.LinearLayout; import androidx.annotation.Nullable; import com.mogo.eagle.core.data.map.entity.MarkerShowEntity; -import com.mogo.eagle.core.function.view.R; +import com.mogo.eagle.core.function.map.R; import com.mogo.eagle.core.utilcode.mogo.glide.GlideImageLoader; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.eagle.core.utilcode.util.ViewUtils; diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapMarkerView.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapMarkerView.java index 2fc0e70c84..47bd5de1cf 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapMarkerView.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/MapMarkerView.java @@ -13,7 +13,7 @@ import com.mogo.commons.module.status.MogoStatusManager; import com.mogo.eagle.core.data.map.PoiWrapper; import com.mogo.eagle.core.data.map.entity.MarkerExploreWay; import com.mogo.eagle.core.data.map.entity.MarkerShowEntity; -import com.mogo.eagle.core.function.view.R; +import com.mogo.eagle.core.function.map.R; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.eagle.core.data.config.CloudPoiManager; diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/OnlineCarMarkerView.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/OnlineCarMarkerView.java index 99040e3585..e2faf4387b 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/OnlineCarMarkerView.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/impl/marker/view/OnlineCarMarkerView.java @@ -5,7 +5,7 @@ import android.graphics.BitmapFactory; import android.view.View; import com.mogo.commons.AbsMogoApplication; -import com.mogo.eagle.core.function.view.R; +import com.mogo.eagle.core.function.map.R; import com.mogo.map.marker.IMogoMarker; import java.lang.ref.SoftReference; diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/CarOverlay.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/CarOverlay.java index 6fc83d627d..5dfd37b6d0 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/CarOverlay.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/CarOverlay.java @@ -14,7 +14,7 @@ import com.amap.api.maps.model.Marker; import com.amap.api.maps.model.MarkerOptions; import com.amap.api.maps.model.Polyline; import com.autonavi.amap.mapcore.IPoint; -import com.mogo.eagle.core.function.view.R; +import com.mogo.eagle.core.function.map.R; import java.util.concurrent.ScheduledExecutorService; diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/MakerWithCount.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/MakerWithCount.kt index ee5bbdb3ca..98061eaeb9 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/MakerWithCount.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/MakerWithCount.kt @@ -4,7 +4,7 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout -import com.mogo.eagle.core.function.view.R +import com.mogo.eagle.core.function.map.R import kotlinx.android.synthetic.main.view_maker_with_count.view.* class MakerWithCount @JvmOverloads constructor( 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 fc1ea65107..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 @@ -6,7 +6,7 @@ import android.view.LayoutInflater import android.widget.ImageView import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout -import com.mogo.eagle.core.function.view.R +import com.mogo.eagle.core.function.map.R class V2XMarkerView @JvmOverloads constructor( context: Context, diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/view/SmallMapView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/view/SmallMapView.kt index 60f7bb459d..a452a17994 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/view/SmallMapView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/view/SmallMapView.kt @@ -22,7 +22,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager -import com.mogo.eagle.core.function.view.R +import com.mogo.eagle.core.function.map.R import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.MapAssetStyleUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt index afd2a45187..b32b7b3793 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt @@ -8,6 +8,7 @@ import android.util.AttributeSet import android.util.Log import android.view.LayoutInflater import android.view.MotionEvent +import android.view.View import android.widget.RelativeLayout import android.widget.TextView import ch.hsr.geohash.GeoHash @@ -16,7 +17,6 @@ import com.amap.api.maps.CameraUpdate import com.amap.api.maps.CameraUpdateFactory import com.amap.api.maps.TextureMapView import com.amap.api.maps.model.* -import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.map.Infrastructure import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.data.v2x.V2XEvent @@ -28,6 +28,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02Lis import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager import com.mogo.eagle.core.function.call.biz.CallerFuncBizListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showVideoDialog +import com.mogo.eagle.core.function.map.R import com.mogo.eagle.core.function.smp.MakerWithCount import com.mogo.eagle.core.function.smp.MarkerDrawerManager import com.mogo.eagle.core.function.smp.MarkerDrawerManager.callback @@ -37,7 +38,6 @@ import com.mogo.eagle.core.function.smp.MarkerDrawerManager.planningPoints import com.mogo.eagle.core.function.smp.MarkerDrawerManager.startLoopCalCarLocation import com.mogo.eagle.core.function.smp.MarkerDrawerManager.updateRoutePoints import com.mogo.eagle.core.function.smp.V2XMarkerView -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isTaxi import com.mogo.eagle.core.utilcode.mogo.MapAssetStyleUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import me.jessyan.autosize.utils.AutoSizeUtils @@ -52,7 +52,20 @@ class OverMapView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : RelativeLayout(context, attrs, defStyleAttr), IMoGoChassisLocationGCJ02Listener { +) : RelativeLayout(context, attrs, defStyleAttr), IMoGoChassisLocationGCJ02Listener, + IMoGoPlanningRottingListener { + + // =============自定义属性相关============= + private var mapStylePath: String? = null + private var mapStyleExtraPath: String? = null + private var carDrawable: Int = -1 + private var compassDrawable: Int = -1 + private var startPointDrawable: Int = -1 + private var endPointDrawable: Int = -1 + private var arrivedDrawable: Int = -1 + private var unArrivedDrawable: Int = -1 + private var resetDrawable: Int = -1 + private var mMapView: TextureMapView? = null private var mAMap: AMap? = null private val zoomLevel = 15 @@ -93,6 +106,20 @@ class OverMapView @JvmOverloads constructor( init { try { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.OverMapView) + mapStylePath = typedArray.getString(R.styleable.OverMapView_mapStylePath) + mapStyleExtraPath = typedArray.getString(R.styleable.OverMapView_mapStyleExtraPath) + carDrawable = typedArray.getResourceId(R.styleable.OverMapView_carDrawable, -1) + compassDrawable = typedArray.getResourceId(R.styleable.OverMapView_compassDrawable, -1) + startPointDrawable = + typedArray.getResourceId(R.styleable.OverMapView_startPointDrawable, -1) + endPointDrawable = + typedArray.getResourceId(R.styleable.OverMapView_endPointDrawable, -1) + arrivedDrawable = typedArray.getResourceId(R.styleable.OverMapView_arrivedDrawable, -1) + unArrivedDrawable = + typedArray.getResourceId(R.styleable.OverMapView_unArrivedDrawable, -1) + resetDrawable = typedArray.getResourceId(R.styleable.OverMapView_resetDrawable, -1) + typedArray.recycle() initView(context) } catch (e: Exception) { e.printStackTrace() @@ -128,22 +155,19 @@ class OverMapView @JvmOverloads constructor( } // =================必须通知高德地图生命周期的变化================= + fun hideResetView() { + overLayerView?.visibility = View.GONE + } + private fun initView(context: Context) { mContext = context val smpView = LayoutInflater.from(context).inflate(R.layout.module_overview_map_view, this) mMapView = smpView.findViewById(R.id.aMapView) overLayerView = findViewById(R.id.overLayer) - if (isTaxi(FunctionBuildConfig.appIdentityMode)) { - overLayerView?.background = resources.getDrawable(R.drawable.amap_reset) - arrivedBitmap = BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_arrow_arrived) - unArrivedBitmap = - BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_arrow_un_arrive) - } else { - overLayerView?.background = resources.getDrawable(R.drawable.amap_reset_bus) - arrivedBitmap = BitmapDescriptorFactory.fromResource(R.drawable.arrow_arrived_img) - unArrivedBitmap = BitmapDescriptorFactory.fromResource(R.drawable.amap_bus_smooth_route) - } - CallerPlanningRottingListenerManager.addListener(TAG, moGoAutopilotPlanningListener) + overLayerView?.background = resources.getDrawable(if (resetDrawable != -1) resetDrawable else R.drawable.amap_reset) + arrivedBitmap = BitmapDescriptorFactory.fromResource(if (arrivedDrawable != -1) arrivedDrawable else R.drawable.taxi_map_arrow_arrived) + unArrivedBitmap = BitmapDescriptorFactory.fromResource(if (unArrivedDrawable != -1) unArrivedDrawable else R.drawable.taxi_map_arrow_un_arrive) + CallerPlanningRottingListenerManager.addListener(TAG, this) initAMapView(context) // 注册定位监听 CallerChassisLocationGCJ02ListenerManager.addListener(TAG, this) @@ -156,19 +180,12 @@ class OverMapView @JvmOverloads constructor( mCameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel.toFloat()) mAMap = mMapView!!.map mCustomMapStyleOptions = CustomMapStyleOptions() - if (isTaxi(FunctionBuildConfig.appIdentityMode)) { + + if (!mapStylePath.isNullOrEmpty() && !mapStyleExtraPath.isNullOrEmpty()) { mCustomMapStyleOptions!!.styleData = - MapAssetStyleUtils.getAssetsStyle(getContext(), "over_view_style.data") + MapAssetStyleUtils.getAssetsStyle(getContext(), mapStylePath) mCustomMapStyleOptions!!.styleExtraData = - MapAssetStyleUtils.getAssetsExtraStyle(getContext(), "over_view_style_extra.data") - } else { - mCustomMapStyleOptions!!.styleData = - MapAssetStyleUtils.getAssetsStyle(getContext(), "over_view_style_bus.data") - mCustomMapStyleOptions!!.styleExtraData = - MapAssetStyleUtils.getAssetsExtraStyle( - getContext(), - "over_view_style_extra_bus.data" - ) + MapAssetStyleUtils.getAssetsExtraStyle(getContext(), mapStyleExtraPath) } mAMap?.setOnMapLoadedListener { Log.d(TAG, "---onMapLoaded---") @@ -226,53 +243,26 @@ class OverMapView @JvmOverloads constructor( * 自定义导航View和路况状态 */ private fun customOptions() { - if (isTaxi(FunctionBuildConfig.appIdentityMode)) { - mCarMarker = mAMap!!.addMarker( - MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.map_car_icon)) - .anchor(0.5f, 0.5f) - ) - mCompassMarker = mAMap!!.addMarker( - MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.amap_custom_corner)) - .anchor(0.5f, 0.5f) - ) - } else { - mCarMarker = mAMap!!.addMarker( - MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.map_bus_icon)) - .anchor(0.5f, 0.5f) - ) - mCompassMarker = mAMap!!.addMarker( - MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.amap_bus_corner)) - .anchor(0.5f, 0.5f) - ) - } + mCarMarker = mAMap!!.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(if (carDrawable != -1) carDrawable else R.drawable.map_car_icon)) + .anchor(0.5f, 0.5f) + ) + mCompassMarker = mAMap!!.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(if (compassDrawable != -1) compassDrawable else R.drawable.amap_custom_corner)) + .anchor(0.5f, 0.5f) + ) mStartMarker = mAMap!!.addMarker( MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.module_small_map_view_dir_start)) + .icon(BitmapDescriptorFactory.fromResource(if (startPointDrawable != -1) startPointDrawable else R.drawable.module_small_map_view_dir_start)) ) mEndMarker = mAMap!!.addMarker( MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.module_small_map_view_dir_end)) + .icon(BitmapDescriptorFactory.fromResource(if (endPointDrawable != -1) endPointDrawable else R.drawable.module_small_map_view_dir_end)) ) } - private val moGoAutopilotPlanningListener: IMoGoPlanningRottingListener = - object : IMoGoPlanningRottingListener { - /** - * 根据全路径获取起始点和经停点进行导航路线绘制 - * 自动驾驶启动后获得数据,获取全路径的具体时间要进行路测 - * 室内某个bag包自动驾驶启动8s后返回 - */ - override fun onAutopilotRotting(globalPathResp: MessagePad.GlobalPathResp?) { - globalPathResp?.let { - handlePlanningData(it.wayPointsList) - } - } - } - fun handlePlanningData(locationList: List?) { if (locationList.isNullOrEmpty()) return val list: List = locationList @@ -557,10 +547,14 @@ class OverMapView @JvmOverloads constructor( for (i in coordinates.indices) { if (i <= locIndex) { // 已走过的置灰 - textureList.add(arrivedBitmap) + arrivedBitmap?.let { + textureList.add(it) + } } else { // 未走过的纹理 - textureList.add(unArrivedBitmap) + unArrivedBitmap?.let { + textureList.add(it) + } } texIndexList.add(i) } @@ -593,4 +587,15 @@ class OverMapView @JvmOverloads constructor( } } + + /** + * 根据全路径获取起始点和经停点进行导航路线绘制 + * 自动驾驶启动后获得数据,获取全路径的具体时间要进行路测 + * 室内某个bag包自动驾驶启动8s后返回 + */ + override fun onAutopilotRotting(globalPathResp: MessagePad.GlobalPathResp?) { + globalPathResp?.let { + handlePlanningData(it.wayPointsList) + } + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml b/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml new file mode 100644 index 0000000000..8fd1ef1348 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/res/values/attrs.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-startup/build.gradle b/core/function-impl/mogo-core-function-startup/build.gradle index 8dbe709e37..5c5e15f374 100644 --- a/core/function-impl/mogo-core-function-startup/build.gradle +++ b/core/function-impl/mogo-core-function-startup/build.gradle @@ -40,32 +40,20 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation rootProject.ext.dependencies.androidxccorektx - implementation rootProject.ext.dependencies.androidxappcompat implementation rootProject.ext.dependencies.arouter - implementation project(path: ':foudations:mogo-commons') kapt rootProject.ext.dependencies.aroutercompiler + implementation rootProject.ext.dependencies.android_start_up - implementation rootProject.ext.dependencies.mogocustommap implementation rootProject.ext.dependencies.thread_opt + if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { - implementation rootProject.ext.dependencies.mogo_core_res - implementation rootProject.ext.dependencies.mogo_core_data - implementation rootProject.ext.dependencies.mogo_core_utils - implementation rootProject.ext.dependencies.mogo_core_function_api implementation rootProject.ext.dependencies.mogo_core_function_call implementation rootProject.ext.dependencies.crashreport - implementation rootProject.ext.dependencies.mogomap - implementation rootProject.ext.dependencies.mogomapapi } else { - implementation project(':core:mogo-core-res') - implementation project(':core:mogo-core-data') - implementation project(':core:mogo-core-utils') - implementation project(':core:mogo-core-function-api') implementation project(':core:mogo-core-function-call') implementation project(":test:crashreport") - implementation project(':libraries:mogo-map') - implementation project(":libraries:mogo-map-api") } + implementation project(':foudations:mogo-commons') } apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() diff --git a/core/function-impl/mogo-core-function-startup/build/generated/source/buildConfig/debug/com/mogo/eagle/core/function/startup/BuildConfig.java b/core/function-impl/mogo-core-function-startup/build/generated/source/buildConfig/debug/com/mogo/eagle/core/function/startup/BuildConfig.java deleted file mode 100644 index b59bae600a..0000000000 --- a/core/function-impl/mogo-core-function-startup/build/generated/source/buildConfig/debug/com/mogo/eagle/core/function/startup/BuildConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Automatically generated file. DO NOT MODIFY - */ -package com.mogo.eagle.core.function.startup; - -public final class BuildConfig { - public static final boolean DEBUG = Boolean.parseBoolean("true"); - public static final String LIBRARY_PACKAGE_NAME = "com.mogo.eagle.core.function.startup"; - /** - * @deprecated APPLICATION_ID is misleading in libraries. For the library package name use LIBRARY_PACKAGE_NAME - */ - @Deprecated - public static final String APPLICATION_ID = "com.mogo.eagle.core.function.startup"; - public static final String BUILD_TYPE = "debug"; - public static final String FLAVOR = ""; - public static final int VERSION_CODE = 1; - public static final String VERSION_NAME = ""; -} diff --git a/core/function-impl/mogo-core-function-startup/build/generated/source/kapt/debug/com/alibaba/android/arouter/routes/ARouter$$Group$$start_up.java b/core/function-impl/mogo-core-function-startup/build/generated/source/kapt/debug/com/alibaba/android/arouter/routes/ARouter$$Group$$start_up.java deleted file mode 100644 index cd6fddf51f..0000000000 --- a/core/function-impl/mogo-core-function-startup/build/generated/source/kapt/debug/com/alibaba/android/arouter/routes/ARouter$$Group$$start_up.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.alibaba.android.arouter.routes; - -import com.alibaba.android.arouter.facade.enums.RouteType; -import com.alibaba.android.arouter.facade.model.RouteMeta; -import com.alibaba.android.arouter.facade.template.IRouteGroup; -import com.mogo.eagle.core.function.startup.MogoStartUpProvider; -import java.lang.Override; -import java.lang.String; -import java.util.Map; - -/** - * DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */ -public class ARouter$$Group$$start_up implements IRouteGroup { - @Override - public void loadInto(Map atlas) { - atlas.put("/start_up/api", RouteMeta.build(RouteType.PROVIDER, MogoStartUpProvider.class, "/start_up/api", "start_up", null, -1, -2147483648)); - } -} diff --git a/core/function-impl/mogo-core-function-startup/build/generated/source/kapt/debug/com/alibaba/android/arouter/routes/ARouter$$Providers$$mogocorefunctionstartup.java b/core/function-impl/mogo-core-function-startup/build/generated/source/kapt/debug/com/alibaba/android/arouter/routes/ARouter$$Providers$$mogocorefunctionstartup.java deleted file mode 100644 index d329a88112..0000000000 --- a/core/function-impl/mogo-core-function-startup/build/generated/source/kapt/debug/com/alibaba/android/arouter/routes/ARouter$$Providers$$mogocorefunctionstartup.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.alibaba.android.arouter.routes; - -import com.alibaba.android.arouter.facade.enums.RouteType; -import com.alibaba.android.arouter.facade.model.RouteMeta; -import com.alibaba.android.arouter.facade.template.IProviderGroup; -import com.mogo.eagle.core.function.startup.MogoStartUpProvider; -import java.lang.Override; -import java.lang.String; -import java.util.Map; - -/** - * DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */ -public class ARouter$$Providers$$mogocorefunctionstartup implements IProviderGroup { - @Override - public void loadInto(Map providers) { - providers.put("com.mogo.eagle.core.function.api.startup.IStartUpProvider", RouteMeta.build(RouteType.PROVIDER, MogoStartUpProvider.class, "/start_up/api", "start_up", null, -1, -2147483648)); - } -} diff --git a/core/function-impl/mogo-core-function-startup/build/generated/source/kapt/debug/com/alibaba/android/arouter/routes/ARouter$$Root$$mogocorefunctionstartup.java b/core/function-impl/mogo-core-function-startup/build/generated/source/kapt/debug/com/alibaba/android/arouter/routes/ARouter$$Root$$mogocorefunctionstartup.java deleted file mode 100644 index 8f02facf8d..0000000000 --- a/core/function-impl/mogo-core-function-startup/build/generated/source/kapt/debug/com/alibaba/android/arouter/routes/ARouter$$Root$$mogocorefunctionstartup.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.alibaba.android.arouter.routes; - -import com.alibaba.android.arouter.facade.template.IRouteGroup; -import com.alibaba.android.arouter.facade.template.IRouteRoot; -import java.lang.Class; -import java.lang.Override; -import java.lang.String; -import java.util.Map; - -/** - * DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */ -public class ARouter$$Root$$mogocorefunctionstartup implements IRouteRoot { - @Override - public void loadInto(Map> routes) { - routes.put("start_up", ARouter$$Group$$start_up.class); - } -} diff --git a/core/function-impl/mogo-core-function-startup/src/main/java/com/mogo/eagle/core/function/startup/stageone/HttpDnsStartUp.kt b/core/function-impl/mogo-core-function-startup/src/main/java/com/mogo/eagle/core/function/startup/stageone/HttpDnsStartUp.kt index dacf41d373..cf2c47b420 100644 --- a/core/function-impl/mogo-core-function-startup/src/main/java/com/mogo/eagle/core/function/startup/stageone/HttpDnsStartUp.kt +++ b/core/function-impl/mogo-core-function-startup/src/main/java/com/mogo/eagle/core/function/startup/stageone/HttpDnsStartUp.kt @@ -111,10 +111,12 @@ class HttpDnsStartUp : AndroidStartup() { clientConfig.isUseOriginSocket = true // 设置是否输出网络日志 clientConfig.isShowNetDebugLog = false +// clientConfig.passportUrl //todo yakun +// clientConfig.socketBaseUrl +// clientConfig.socketTechUrl // 设置是否是直播推流的主播 clientConfig.isAnchor = true when (DebugConfig.getCarMachineType()) { - DebugConfig.CAR_MACHINE_TYPE_BYD -> clientConfig.thirdPartyAppKey = "bydauto" DebugConfig.CAR_MACHINE_TYPE_LENOVO -> clientConfig.thirdPartyAppKey = "pfieouqg" else -> clientConfig.thirdPartyAppKey = "wbvpzgar" } @@ -133,9 +135,7 @@ class HttpDnsStartUp : AndroidStartup() { } else { clientConfig.thirdPartyDeviceId = Utils.getDevicesId() } - // 设置循环检测间隔时间(每隔2小时loop一次httpDnsConfig) - clientConfig.loopCheckDelay = (60 * 60 * 2 * 1000).toLong() - //设置长链接的secretKey //todo 通过SHA1和包名找中台服务生成,后续包名分渠道,需要做对应操作 + //设置长链接的secretKey 通过SHA1和包名找中台服务生成,后续包名分渠道,需要做对应操作 clientConfig.secretKey = "YMj2VFDFxJ3Q4gNoZceJ" clientConfig.iHttpDnsCurrentLocation = object : IHttpDnsCurrentLocation { diff --git a/core/function-impl/mogo-core-function-v2x/build.gradle b/core/function-impl/mogo-core-function-v2x/build.gradle index 299bfe9cbf..0548690b35 100644 --- a/core/function-impl/mogo-core-function-v2x/build.gradle +++ b/core/function-impl/mogo-core-function-v2x/build.gradle @@ -62,7 +62,6 @@ dependencies { implementation rootProject.ext.dependencies.localbroadcastmanager implementation rootProject.ext.dependencies.arouter implementation rootProject.ext.dependencies.rxandroid - implementation rootProject.ext.dependencies.flexbox kapt rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.protobuf_java implementation rootProject.ext.dependencies.protobuf_java_util @@ -71,19 +70,14 @@ dependencies { 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') implementation project(':core:mogo-core-utils') 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/events/V2XEventManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt index 9b173d34cd..920a297268 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,5 +1,6 @@ package com.mogo.eagle.core.function.v2x.events +import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.os.Handler @@ -16,6 +17,7 @@ import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_C 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.DataSourceType +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.enums.EventTypeHelper import com.mogo.eagle.core.data.enums.TrafficTypeEnum @@ -26,15 +28,17 @@ 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.autopilot.IMoGoAutopilotIdentifyListener import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener +import com.mogo.eagle.core.function.api.map.angle.* 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.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.map.CallerMapIdentifyManager 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.v2x.events.alarm.V2XAlarmServer import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi @@ -43,12 +47,11 @@ import com.mogo.eagle.core.function.v2x.events.consts.V2XConst.BROADCAST_SCENE_H 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.utils.toRoadMarker +import com.mogo.eagle.core.function.v2x.events.utils.toV2XRoadEventEntity 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.V2XWarningTarget +import com.mogo.eagle.core.function.v2x.internal.data.* 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 @@ -71,9 +74,10 @@ import kotlinx.coroutines.cancel import kotlinx.coroutines.launch import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean +import mogo.telematics.pad.MessagePad - -object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IMoGoTokenCallback, IV2XCallback { +object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IMoGoTokenCallback, IV2XCallback, + IMoGoAutopilotIdentifyListener { private const val TAG = "V2XEventManager" @@ -115,11 +119,13 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IMoGoTokenCallback, private fun registerListener() { V2XManager.addCallback(this) CallerChassisLocationGCJ02ListenerManager.addListener(TAG, this) + CallerAutopilotIdentifyListenerManager.addListener(TAG, this) } private fun unRegisterListener() { V2XManager.removeCallback(this) CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + CallerAutopilotIdentifyListenerManager.removeListener(TAG) mogoMarkersHandler.unregisterMarkerClickListener(CARD_TYPE_ROAD_CONDITION) } @@ -196,11 +202,9 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IMoGoTokenCallback, handleWarningTargetEvent(event.data) } is V2XEvent.RoadAI -> { - /* - TODO zhongchao 先注掉,编译通过 if(FunctionBuildConfig.isV2NFromCar){ return - }*/ + } handleRoadMarkerEvent(event.data.toRoadMarker()) } @@ -208,7 +212,47 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IMoGoTokenCallback, handleRoadMarkerEvent(event.data.toRoadMarker()) } else -> { - Logger.d(TAG, "other event: $event") + Logger.e(TAG, "onAck other event: $event") + } + } + } + + @SuppressLint("NewApi") + override fun onAutopilotIdentifyPlanningObj(planningObjects: List?) { + super.onAutopilotIdentifyPlanningObj(planningObjects) + if(!FunctionBuildConfig.isV2NFromCar){ + return + } + planningObjects?.let { + if (it.isNotEmpty()) { + val first = it.stream() + .filter { planningObj: MessagePad.PlanningObject -> planningObj.type >= 1000 } + .findFirst() + if (first.isPresent) { + val poiType = when (first.get().type) { +// 1004 -> { //V2N_RSM,静止事件,包括异常停车、异常静止障碍物 +// } + 1005 -> { //V2N_RSI,施工事件,包括锥桶或者挡板围城的施工场景,是个多边形包围区域 + EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType + } + 1007 -> { //三角牌 + EventTypeEnumNew.FOURS_ACCIDENT_04.poiType + } + else -> { + return + } + } + CallerLogger.d("$M_V2X$TAG", "poiType : $poiType , 触发道路事件") + val trackedObj = + CallerMapIdentifyManager.getIdentifyObj(first.get().uuid.toString()) + trackedObj?.let { t -> + CallerLogger.d("$M_V2X$TAG", "polygon size : ${(t.polygonList.size)}") + val v2XMessageEntity = V2XMessageEntity() + v2XMessageEntity.type = V2XMessageEntity.V2XTypeEnum.ALERT_ROAD_WARNING + v2XMessageEntity.content = t.toRoadMarker(poiType).toV2XRoadEventEntity() + V2XScenarioManager.getInstance().handlerMessage(v2XMessageEntity) + } + } } } } @@ -328,13 +372,13 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IMoGoTokenCallback, val change = changeVisualAngle override fun onShow() { if (change) { - CallerVisualAngleManager.changeVisualAngle(TooClose) + CallerVisualAngleManager.changeAngle(TooClose) } } override fun onDismiss() { if (change) { - CallerVisualAngleManager.changeVisualAngle(Default()) + CallerVisualAngleManager.changeAngle(Default()) } } } 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 43acb5bd68..0156f41948 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 @@ -37,7 +37,7 @@ public class V2XAlarmServer { CopyOnWriteArrayList v2XRoadEventEntityList, MogoLocation currentLocation) { try { - Logger.d(TAG, "getDriveFrontAlarmEvent --- 1 ---" + currentLocation ); + //Logger.d(TAG, "getDriveFrontAlarmEvent --- 1 ---" + currentLocation ); if (!showedEvents.isEmpty()) { Iterator iterator = showedEvents.iterator(); while (iterator.hasNext()) { @@ -54,18 +54,18 @@ public class V2XAlarmServer { } } } - Logger.d(TAG, "getDriveFrontAlarmEvent --- 2 ---" + currentLocation); + //Logger.d(TAG, "getDriveFrontAlarmEvent --- 2 ---" + currentLocation); if (currentLocation != null && v2XRoadEventEntityList != null) { // 因为集合是按照距离排序后的所以这里检索出来第一个就发出警告 for (V2XRoadEventEntity v2XRoadEventEntity : v2XRoadEventEntityList) { // 0、道路事件必须有朝向,角度>=0; - Logger.d(TAG, "entity:" + v2XRoadEventEntity.getLocation()); + //Logger.d(TAG, "entity:" + v2XRoadEventEntity.getLocation()); if (v2XRoadEventEntity.getLocation().getAngle() >= 0) { // 计算车辆距离指定气泡的距离 MarkerLocation eventLocation = v2XRoadEventEntity.getLocation(); // 1、判断是否到达了触发距离,20 ~ 500, double distance = v2XRoadEventEntity.getDistance(); - Logger.d(TAG, "distance:" + distance); + //Logger.d(TAG, "distance:" + distance); if (distance <= 500) { if (EventTypeEnumNew.GHOST_PROBE.getPoiType().equals(v2XRoadEventEntity.getPoiType())) { if (distance > 25) { @@ -76,7 +76,7 @@ public class V2XAlarmServer { double carBearing = currentLocation.getHeading(); double eventBearing = eventLocation.getAngle(); double diffAngle = DrivingDirectionUtils.getAngleDiff(carBearing, eventBearing); - Logger.d(TAG, "car_bearing:" + carBearing + ",eventBearing:" + eventBearing + ",diffAngle:" + diffAngle); + //Logger.d(TAG, "car_bearing:" + carBearing + ",eventBearing:" + eventBearing + ",diffAngle:" + diffAngle); if (diffAngle <= 20) { // 3、计算当前车辆行驶方向与事件位置之间夹角《20度,保证道路事件在车辆前方 double eventAngle = DrivingDirectionUtils.getDegreeOfCar2Poi( @@ -87,12 +87,12 @@ public class V2XAlarmServer { (int) currentLocation.getHeading() ); - Logger.d(TAG, "eventAngle:" + eventAngle); + //Logger.d(TAG, "eventAngle:" + eventAngle); if (0 <= eventAngle && eventAngle <= 20) { if (showedEvents.contains(v2XRoadEventEntity)) { return null; } - Logger.d(TAG, "showed---"); + //Logger.d(TAG, "showed---"); showedEvents.add(v2XRoadEventEntity); return v2XRoadEventEntity; } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoPersonWarnPolylineManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoPersonWarnPolylineManager.java index a5b5aa7c52..3f73403da5 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoPersonWarnPolylineManager.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoPersonWarnPolylineManager.java @@ -55,7 +55,7 @@ public class MoGoPersonWarnPolylineManager implements IMoGoPersonWarnPolylineMan options.add(locations.get(i)); } // 绘制线的对象 - IMogoOverlayManager overlay = CallerMapUIServiceManager.INSTANCE.getOverlayManager(AbsMogoApplication.getApp()); + IMogoOverlayManager overlay = CallerMapUIServiceManager.INSTANCE.getOverlayManager(); if (overlay != null) { mMogoPolyline = overlay.addPolyline(options); mMogoPolyline.setTransparency(0.5f); diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoStopPolylineManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoStopPolylineManager.java index cf2525ce76..287be0c2c7 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoStopPolylineManager.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoStopPolylineManager.java @@ -54,7 +54,7 @@ public class MoGoStopPolylineManager implements IMoGoStopPolylineManager { options.add(locations.get(i)); } // 绘制线的对象 - IMogoOverlayManager overlay = CallerMapUIServiceManager.INSTANCE.getOverlayManager(AbsMogoApplication.getApp()); + IMogoOverlayManager overlay = CallerMapUIServiceManager.INSTANCE.getOverlayManager(); if (overlay != null) { mMogoPolyline = overlay.addPolyline(options); } 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 7b0d9d278e..327a28d209 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 @@ -90,18 +90,18 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager { // 清除上次的道路事件, 这里注意,道路事件的触发和这里是异步操作会触发异常 mV2XRoadEventEntityArrayList.clear(); // 获取探路以及新鲜事儿 - List exploreWayList = markerCardResult.getExploreWay(); + List exploreWayList = markerCardResult.getExploreWay(); if (exploreWayList != null) { - for (V2XMarkerExploreWay markerExploreWay : exploreWayList) { + for (MarkerExploreWay markerExploreWay : exploreWayList) { if (EventTypeEnumNew.isRoadEvent(markerExploreWay.getPoiType())) { - V2XMarkerLocation markerLocation = markerExploreWay.getLocation(); + MarkerLocation markerLocation = markerExploreWay.getLocation(); // 记录道路事件 V2XRoadEventEntity v2XRoadEventEntity = new V2XRoadEventEntity(); - v2XRoadEventEntity.setLocation(EntityUtilsKt.toMarkerLocation(markerLocation)); + v2XRoadEventEntity.setLocation(markerLocation); // 探路目前只有上报拥堵 String poi = markerExploreWay.getPoiType(); v2XRoadEventEntity.setPoiType(poi); - v2XRoadEventEntity.setNoveltyInfo(EntityUtilsKt.toMarkExploreWay(markerExploreWay, markerCardResult.getExtras())); + v2XRoadEventEntity.setNoveltyInfo(markerExploreWay); v2XRoadEventEntity.setExpireTime(20000); mV2XRoadEventEntityArrayList.add(v2XRoadEventEntity); } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoWarnPolylineManager.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoWarnPolylineManager.java index dc27540743..a5ed5eda32 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoWarnPolylineManager.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/manager/impl/MoGoWarnPolylineManager.java @@ -62,7 +62,7 @@ public class MoGoWarnPolylineManager implements IMoGoWarnPolylineManager { } // 绘制线的对象 - IMogoOverlayManager overlay = CallerMapUIServiceManager.INSTANCE.getOverlayManager(AbsMogoApplication.getApp()); + IMogoOverlayManager overlay = CallerMapUIServiceManager.INSTANCE.getOverlayManager(); if (overlay != null) { mMogoPolyline = overlay.addPolyline(options); } 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 2568063852..c088868c50 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 @@ -7,7 +7,6 @@ import android.os.Looper import android.view.animation.DecelerateInterpolator import androidx.core.util.Pair import com.mogo.cloud.commons.utils.* -import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.map.MogoLatLng import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity import com.mogo.eagle.core.function.call.autopilot.* @@ -39,9 +38,7 @@ class AiRoadMarker { private val marker by lazy { AtomicReference() } private val overlayManager by lazy { - CallerMapUIServiceManager.getOverlayManager( - AbsMogoApplication.getApp() - ) + CallerMapUIServiceManager.getOverlayManager() } private val START_COLOR = Color.parseColor("#002ABAD9") 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 e93bae7523..2a1ee214bd 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,80 +1,56 @@ package com.mogo.eagle.core.function.v2x.events.scenario.scene.road -import android.graphics.* +import android.graphics.Color import com.mogo.eagle.core.data.enums.EventTypeEnumNew -import com.mogo.eagle.core.data.map.* +import com.mogo.eagle.core.data.map.MogoLatLng +import com.mogo.eagle.core.data.map.MogoLocation 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.events.bridge.BridgeApi.context import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi.v2xMarker import com.mogo.eagle.core.function.v2x.events.remove.MarkerWrapper -import com.mogo.map.* -import com.mogo.map.marker.* -import com.mogo.map.overlay.* -import java.util.concurrent.atomic.* -import kotlin.Pair -import kotlin.collections.ArrayList +import com.mogo.map.marker.IMogoMarker +import com.mogo.map.overlay.IMogoPolyline +import com.mogo.map.overlay.MogoPolylineOptions +import java.util.concurrent.atomic.AtomicReference class V2XAiRoadEventMarker { private val current = AtomicReference?>>() - private val v2xLocation = AtomicReference() - - private val overlayManager by lazy { MogoOverlayManager.getInstance() } + private val overlayManager by lazy { CallerMapUIServiceManager.getOverlayManager() } fun drawMarkers(entity: V2XRoadEventEntity, wrapper: MarkerWrapper) { - val extra = entity.noveltyInfo.extras["polygon"] + val polygon = entity.noveltyInfo.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 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 - } - polygons.add(androidx.core.util.Pair.create(second, first)) - } - if (polygons.size > 0) { - val l2 = entity.noveltyInfo?.location ?: return - v2xLocation.set(MogoLocation().also { - it.longitude = l2.lon; it.latitude = l2.lat; it.heading = l2.angle - }) + if (polygon != null && polygon.isNotEmpty() && entity.poiType != EventTypeEnumNew.TYPE_SOCKET_ROAD_JINGZHI.poiType) { + 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() - 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 (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) - } - } + for (p in polygon) { + points.add(MogoLatLng(p.first, p.second)) + } + 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) + line?.let { + current.set(Pair(line, wrapper.markers)) + line.isVisible = true + wrapper.addLine(line) } } } 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 a743246918..b97689f35b 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,9 +1,7 @@ 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; @@ -15,7 +13,6 @@ import com.mogo.eagle.core.function.v2x.events.remove.MarkerRemoveManager; 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.map.marker.IMogoMarker; - import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -34,10 +31,21 @@ public class V2XRoadEventMarker implements IV2XMarker { if (marker != null) { if (entity != 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())) { + if (isAiRoadEvent(entity.getPoiType())) { + MarkerExploreWay noveltyInfo = entity.getNoveltyInfo(); + Log.d("RWJ", "V2XRoadEventMarker -> noveltyInfo:" + noveltyInfo); + if (noveltyInfo != null) { + Pair gpsLocation = noveltyInfo.getGpsLocation(); + List> polygons = noveltyInfo.getPolygon(); + if (gpsLocation != null && polygons != null) { + MarkerLocation location = noveltyInfo.getLocation(); + 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); + } + } + } else { IMogoMarker iMarker = marker.drawableAlarmPOI(BridgeApi.INSTANCE.context(), entity, null); if (iMarker != null) { Log.d("RWJ", "V2XRoadEventMarker:" + entity.getPoiType() + "--- add Marker"); @@ -48,48 +56,6 @@ public class V2XRoadEventMarker implements IV2XMarker { } else { Log.d("RWJ", "V2XRoadEventMarker:" + entity.getPoiType() + "--- return empty marker"); } - } else { - MarkerExploreWay noveltyInfo = entity.getNoveltyInfo(); - Log.d("RWJ", "V2XRoadEventMarker -> noveltyInfo:" + noveltyInfo); - if (noveltyInfo != null && noveltyInfo.extras != null) { - List> polygons = new ArrayList<>(); - Pair gpsLocation = null; - if (noveltyInfo.extras.containsKey("polygon")) { - Object extra = noveltyInfo.extras.get("polygon"); - if (extra instanceof List) { - List l = (List) extra; - if (l.size() > 0) { - for (int i = 0; i < l.size(); i++) { - Object o = l.get(i); - if (!(o instanceof Pair)) { - continue; - } - Pair p = (Pair) o; - Object first = p.first; - Object second = p.second; - if (first == null || second == null) { - continue; - } - if (!(first instanceof Double) || !(second instanceof Double)) { - continue; - } - polygons.add(Pair.create((Double) first, (Double) second)); - } - } - } - } - - 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(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); - } - } } } } @@ -98,6 +64,13 @@ public class V2XRoadEventMarker implements IV2XMarker { } } + private boolean isAiRoadEvent(String poiType) { + return Objects.equals(poiType, EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType()) + && Objects.equals(poiType, EventTypeEnumNew.FOURS_ACCIDENT_04.getPoiType()) + && Objects.equals(poiType, EventTypeEnumNew.TYPE_SOCKET_ROAD_JINGZHI.getPoiType()) + && Objects.equals(poiType, EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.getPoiType()); + } + private boolean isDrawRoadLine(String poiType) { return EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType().equals(poiType); } 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 1c4d34d86a..c604e02cc3 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 @@ -11,6 +11,8 @@ 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.api.map.angle.Default; +import com.mogo.eagle.core.function.api.map.angle.RoadEvent; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager; import com.mogo.eagle.core.function.call.hmi.CallerHmiManager; import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager; @@ -151,7 +153,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp @Override public void onShow() { if (isNeedChangeAngle()) { - CallerVisualAngleManager.INSTANCE.changeVisualAngle(CallerVisualAngleManager.Scene.RoadEvent.INSTANCE); + CallerVisualAngleManager.INSTANCE.changeAngle(RoadEvent.INSTANCE); } V2XMessageEntity entity = getV2XMessageEntity(); if (entity != null) { @@ -177,7 +179,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp public void onDismiss() { CallerHmiManager.INSTANCE.dismissWarning(WarningDirectionEnum.ALERT_WARNING_TOP); if (isNeedChangeAngle()) { - CallerVisualAngleManager.INSTANCE.changeVisualAngle(new CallerVisualAngleManager.Scene.Default(3, TimeUnit.SECONDS)); + CallerVisualAngleManager.INSTANCE.changeAngle(new Default(3, TimeUnit.SECONDS)); } release(); } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/warning/V2XFrontWarningScenario.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/warning/V2XFrontWarningScenario.java index f2c9d7e1e6..5ee305f4b3 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/warning/V2XFrontWarningScenario.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/warning/V2XFrontWarningScenario.java @@ -10,6 +10,7 @@ import android.util.Log; import androidx.annotation.Nullable; +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.V2XMessageEntity; @@ -64,8 +65,9 @@ public class V2XFrontWarningScenario extends AbsV2XScenario implements IMoGoChas CallerLogger.INSTANCE.d(M_V2X + TAG, "----- show --- 1 --:\n" + (mMarkerEntity == null ? "null" : mMarkerEntity.toString())); if (mMarkerEntity != null) { CallerLogger.INSTANCE.d(M_V2X + TAG, "----- show --- 2 --:\n" + mMarkerEntity); - int v2xType = getV2XTypeForFrontWarning(mMarkerEntity); - if (v2xType != 0) { + String v2xType = getV2XTypeForFrontWarning(mMarkerEntity); + V2XMessageEntity entity = getV2XMessageEntity(); + if (!v2xType.equals("0")) { if (getAlertContentForFrontWarning(mMarkerEntity).toString() == null || getAlertContentForFrontWarning(mMarkerEntity).toString().isEmpty() || mMarkerEntity.getTts() == null || mMarkerEntity.getTts().isEmpty()) { @@ -87,19 +89,19 @@ public class V2XFrontWarningScenario extends AbsV2XScenario implements IMoGoChas } } - private int getV2XTypeForFrontWarning(V2XWarningTarget entity) { + private String getV2XTypeForFrontWarning(V2XWarningTarget entity) { switch (entity.getType()) { case 1: case 11: entity.setTts("注意行人"); - return 0X2B0201; + return EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_PERSON.getPoiType(); case 2: entity.setTts("注意自行车"); case 4: entity.setTts("注意摩托车"); - return 0X2B0202; + return EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.getPoiType(); } - return 0; + return "0"; } private CharSequence getAlertContentForFrontWarning(V2XWarningTarget entity) { diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/utils/EntityUtils.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/utils/EntityUtils.kt index 65ebd78c9d..0b8602e86e 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/utils/EntityUtils.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/utils/EntityUtils.kt @@ -4,7 +4,6 @@ import androidx.core.util.Pair import com.mogo.eagle.core.data.enums.EventTypeEnumNew.Companion.isRoadEvent 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.MarkerUserInfo import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.AiRoadMarker import com.mogo.eagle.core.function.v2x.internal.data.* @@ -13,85 +12,24 @@ import mogo.telematics.pad.MessagePad import roadwork.Road -fun V2XMarkerLocation?.toMarkerLocation(): MarkerLocation? = - if (this == null) null else MarkerLocation().also { - it.lon = this.lon - it.lat = this.lat - it.address = this.address - it.angle = this.angle - } - -fun MarkerExploreWayItem?.toMarkerExploreWayItem(): com.mogo.eagle.core.data.map.entity.MarkerExploreWayItem? = - if (this == null) null else com.mogo.eagle.core.data.map.entity.MarkerExploreWayItem().also { - it.illegalCount = this.illegalCount - it.content = this.content - it.url = this.url - it.thumbnail = this.thumbnail - } - -fun V2XMarkerUserInfo?.toMarkerUserInfo(): MarkerUserInfo? = - if (this == null) null else MarkerUserInfo().also { - it.safeLabelType = this.safeLabelType - it.safeLabel = this.safeLabel - it.lastActiveweekAvgscore = this.lastActiveweekAvgscore - it.gender = this.gender - it.userHead = this.userHead - it.userName = this.userName - it.setAge(this.age) - } - -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 -> + l1.exploreWay = ArrayList().also { l2 -> + l2.add(MarkerExploreWay().also { l3 -> l3.poiType = this.roadwork?.poiType?.toString() - l3.generateTime = this.roadwork?.detectTime ?: 0L - l3.location = V2XMarkerLocation().also { l4 -> + l3.setGenerateTime(this.roadwork?.detectTime ?: 0L) + l3.location = MarkerLocation().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 + l3.gpsLocation = Pair(this.roadwork?.center?.point?.lon ?: 0.0, this.roadwork?.center?.point?.lat ?: 0.0) + l3.polygon = this.roadwork?.polygonList?.takeIf { it.isNotEmpty() }?.map { Pair(it.lon, it.lat) } }) } AiRoadMarker.aiMakers[id]?.receive() @@ -99,52 +37,41 @@ fun Road.RW_PB.toRoadMarker(): V2XMarkerCardResult = 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 -> + l1.exploreWay = ArrayList().also { l2 -> + l2.add(MarkerExploreWay().also { l3 -> l3.poiType = this.poiType - l3.generateTime = this.detectTime ?: 0L - l3.location = V2XMarkerLocation().also { l4 -> + l3.setGenerateTime(this.detectTime ?: 0L) + l3.location = MarkerLocation().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 + l3.gpsLocation = Pair(this.center?.lon ?: 0.0, this.center?.lat ?: 0.0) + l3.polygon = this.polygon?.takeIf { it.isNotEmpty() }?.map { Pair(it.lon, it.lat) } }) } - 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 -> + l1.exploreWay = ArrayList().also { l2 -> + l2.add(MarkerExploreWay().also { l3 -> l3.poiType = poiType - l3.generateTime = 0L - l3.location = V2XMarkerLocation().also { l4 -> + l3.setGenerateTime(0L) + l3.location = MarkerLocation().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 + + l3.gpsLocation = Pair(this.longitude, this.latitude) + l3.polygon = this.polygonList?.takeIf { it.isNotEmpty() }?.map { Pair(it.longitude, it.latitude) } }) } AiRoadMarker.aiMakers[id]?.receive() @@ -152,14 +79,14 @@ fun MessagePad.TrackedObject.toRoadMarker(poiType: String): V2XMarkerCardResult fun V2XMarkerCardResult.toV2XRoadEventEntity(): V2XRoadEventEntity = V2XRoadEventEntity().also { l1 -> - val exploreWayList: List? = this.exploreWay + 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.location = markerLocation l1.poiType = markerExploreWay.poiType - l1.noveltyInfo = markerExploreWay.toMarkExploreWay(this.extras) + l1.noveltyInfo = markerExploreWay 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 index d40195909f..1245d6244f 100755 --- 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 @@ -209,7 +209,7 @@ object V2XManager { if (!started.get()) { return } - V2XLogger.d(TAG, "--- onLocationChanged --[longitude: $longitude, latitude: $latitude]") + //V2XLogger.d(TAG, "--- onLocationChanged --[longitude: $longitude, latitude: $latitude]") realLongitude.set(longitude) realLatitude.set(latitude) val oldLon = lastLongitude.get() 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 index db6a6b5754..a486687d10 100644 --- 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 @@ -1,6 +1,8 @@ package com.mogo.eagle.core.function.v2x.internal.data import androidx.annotation.Keep +import com.mogo.eagle.core.data.map.entity.MarkerExploreWay +import com.mogo.eagle.core.data.map.entity.MarkerLocation import java.io.Serializable @Keep @@ -41,20 +43,15 @@ class V2XMarkerCardResult: V2XBaseData(), Serializable { /** * 探路数据集合 */ - var exploreWay: 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)" + return "MarkerCardResult(dataType=$dataType, carChat=$carChat, shareMusic=$shareMusic, noveltyInfo=$noveltyInfo, onlineCar=$onlineCar, exploreWay=$exploreWay, messageTime=$messageTime)" } } @@ -369,7 +366,7 @@ class V2XMarkerExploreWay: Serializable { /** * 位置信息 */ - var location: V2XMarkerLocation? = null + var location: MarkerLocation? = null /** * 车辆方位 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 index 2b57db3ab8..517e16e76b 100644 --- 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 @@ -4,6 +4,7 @@ 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.commons.constants.HostConst 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 @@ -26,7 +27,7 @@ internal class V2XRefreshModel { callback: IV2XRefreshCallback? ): Disposable? { val config = V2XManager.getConfig() - val retrofit = RetrofitFactory.getInstance(config.baseUrl) ?: return null + val retrofit = RetrofitFactory.getInstance(HostConst.getEagleHost()) ?: return null return retrofit .create(V2XApiService::class.java) .querySnapshotSync(buildParams(longitude, latitude, config)) 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 index a8f3266337..1b9bc293db 100644 --- 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 @@ -9,6 +9,6 @@ import retrofit2.http.POST internal interface V2XApiService { @FormUrlEncoded - @POST("/yycp-launcherSnapshot/launcherSnapshot/querySnapshotSync") + @POST("eagle-eye-dns/yycp-launcherSnapshot/launcherSnapshot/querySnapshotSync") fun querySnapshotSync(@FieldMap parameters: Map): Maybe } \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index e85849509a..ff6a6b3135 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -48,6 +48,14 @@ object FunctionBuildConfig { @JvmField var detouringSpeed = 3 + /** + * 是否从车端融合过来的v2n事件 + * 默认关闭,开启后接收车端融合预警,关闭云端长链V2N + */ + @Volatile + @JvmField + var isV2NFromCar = false + /** * 是否是感知优化模式 * 默认开启 @@ -59,6 +67,20 @@ object FunctionBuildConfig { @JvmField var isBeautyMode = true + /** + * 是否绘制云端感知物 + */ + @Volatile + @JvmField + var isDrawAiCloudFusion = true + + /** + * 是否开启roma + */ + @Volatile + @JvmField + var isRomaMode = false + /** * 是否开启感知物替换颜色功能 * 默认关闭 diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java index ec77fa799c..f319c9556a 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java @@ -92,4 +92,11 @@ public class MogoServicePaths { @Keep public static final String PATH_DATA_CENTER_MODULE = "/data_center/api"; + + + @Keep + public static final String PATH_IDENTIFY = "/map/identify"; + + @Keep + public static final String PATH_VISUAL_ANGLE = "/map/angle_change"; } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/MarkerExploreWay.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/MarkerExploreWay.java index 8516d97fcf..12287a8b76 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/MarkerExploreWay.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/MarkerExploreWay.java @@ -4,6 +4,8 @@ package com.mogo.eagle.core.data.map.entity; import android.text.TextUtils; +import androidx.core.util.Pair; + import java.io.Serializable; import java.util.List; import java.util.Map; @@ -35,7 +37,10 @@ public class MarkerExploreWay implements Serializable { // 1 需要用户判断是否拥堵 进行UGC问答 private int infoCheckNode; - public Map extras = null; + + private Pair gpsLocation; + + private List> polygon; public String getAddr() { if (TextUtils.isEmpty(addr)) { @@ -170,6 +175,22 @@ public class MarkerExploreWay implements Serializable { this.uploadType = uploadType; } + public Pair getGpsLocation() { + return gpsLocation; + } + + public void setGpsLocation(Pair gpsLocation) { + this.gpsLocation = gpsLocation; + } + + public List> getPolygon() { + return polygon; + } + + public void setPolygon(List> polygon) { + this.polygon = polygon; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/core/mogo-core-function-api/build.gradle b/core/mogo-core-function-api/build.gradle index bb7c323f18..8672b4a8da 100644 --- a/core/mogo-core-function-api/build.gradle +++ b/core/mogo-core-function-api/build.gradle @@ -47,7 +47,7 @@ dependencies { kapt rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.coroutinescore implementation rootProject.ext.dependencies.coroutinesandroid - implementation rootProject.ext.dependencies.mogoobu + implementation project(':libraries:mogo-obu') if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogo_core_data diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/biz/IMoGoFuncBizProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/biz/IMoGoFuncBizProvider.kt index 774812ef84..360416ca62 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/biz/IMoGoFuncBizProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/biz/IMoGoFuncBizProvider.kt @@ -56,6 +56,4 @@ interface IMoGoFuncBizProvider : IMoGoFunctionServerProvider { fun fetchInfStructures() fun getAllV2XEvents() - - fun initOverViewDb(context: Context) } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index bd6fc6f58b..f53dce752d 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -109,6 +109,11 @@ interface IDevaToolsProvider : IProvider { */ fun downLoadPackage(downloadKey: String, downloadUrl: String) + /** + * 更新下载进度 + */ + fun updateUpgradeProgress() + /** * 展示状态栏 */ diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt index 0bcdf721fe..da403dc073 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IMoGoDevaToolsListener.kt @@ -51,4 +51,8 @@ interface IMoGoDevaToolsListener { } + fun mofangStatus(status:Boolean){ + + } + } \ No newline at end of file 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 2bdf8d3bce..2dcdc304b8 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 @@ -36,9 +36,4 @@ interface IViewControlListener { */ fun updateStatusBarDownloadView(insert: Boolean, tag: String, progress: Int){} - /** - * 更新魔方的连接状态 - */ - fun updateMfStatus(tag: String, status: Boolean){} - } 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 6f00c8a330..537b33fe1d 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 @@ -136,9 +136,5 @@ interface IMoGoHmiProvider :IProvider{ */ fun updateStatusBarDownloadView(insert: Boolean, tag: String, progress: Int) - /** - * 更新魔方的连接状态 - */ - fun updateMfStatus(tag: String, status: Boolean) } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/IMogoMapService.java b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/IMogoMapService.java index 6b173f6006..8c14762e36 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/IMogoMapService.java +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/IMogoMapService.java @@ -40,10 +40,9 @@ public interface IMogoMapService extends IProvider { /** * 覆盖物操作 * - * @param context * @return */ - IMogoOverlayManager getOverlayManager(Context context); + IMogoOverlayManager getOverlayManager(); /** * 获取高德定位服务 diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/IMoGoVisualAngleChangeProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/IMoGoVisualAngleChangeProvider.kt new file mode 100644 index 0000000000..a4c1ec1712 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/IMoGoVisualAngleChangeProvider.kt @@ -0,0 +1,10 @@ +package com.mogo.eagle.core.function.api.map.angle + +import com.mogo.eagle.core.function.api.base.* + +interface IMoGoVisualAngleChangeProvider: IMoGoFunctionServerProvider { + + fun updateLongSightLevel(level: Boolean) + + fun changeAngle(scene: Scene) +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/Scenes.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/Scenes.kt new file mode 100644 index 0000000000..296f992b05 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/angle/Scenes.kt @@ -0,0 +1,104 @@ +package com.mogo.eagle.core.function.api.map.angle + +import com.mogo.map.uicontroller.* +import java.util.concurrent.* +import java.util.concurrent.TimeUnit.SECONDS + +private interface IAttach { + val angle: VisualAngleMode + val priority: Int + val displayThreshold: Long //最大展示时长 > 0; 表示最长展示多长时间, -1 表示,一直展示,直到触发默认视角, 0: 默认视角专用值, + } + + +sealed class Scene: IAttach + + +/** + * 默认视图 + * @param delay: 表示多少稍后,默认值为2 + * @param unit: 时间单位,默认为秒 + */ +class Default(val delay: Long = 2, val unit: TimeUnit = SECONDS): Scene() { + + override val angle: VisualAngleMode = VisualAngleMode.MODE_MEDIUM_SIGHT + + override val priority: Int = 1 + + override val displayThreshold: Long + get() = 0 + + override fun toString(): String { + return "Default(delay=$delay, unit=$unit, angle=$angle, priority=$priority)" + } +} + + +/** + * 变道-接收到转向灯信息号 + */ +class Turning(var open: Boolean = false): Scene() { + + override val angle: VisualAngleMode = VisualAngleMode.MAP_STYLE_VR_ANGLE_TOP + + override val priority: Int = 3 + + override val displayThreshold: Long + get() = -1 + + override fun toString(): String { + return "Turning(open: ${open}, priority=$priority, displayThreshold: $displayThreshold, priority=$priority)" + } +} + + +/** + * 后方车辆离自车过近 + */ +object TooClose: Scene() { + + override val angle: VisualAngleMode = VisualAngleMode.MAP_STYLE_VR_ANGLE_300 + + override val priority: Int = 2 + + override val displayThreshold: Long + get() = SECONDS.toMillis(8) + + override fun toString(): String { + return "TooClose(priority=$priority, displayThreshold: $displayThreshold, priority=$priority)" + } +} + + +/** + * 道路事件 + */ +object RoadEvent: Scene() { + + override val angle: VisualAngleMode = VisualAngleMode.MODE_LONG_SIGHT + + override val priority: Int = 5 + + override val displayThreshold: Long + get() = SECONDS.toMillis(8) + + override fun toString(): String { + return "RoadEvent(priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority})" + } +} + + +/** + * 十字路口 + */ +class CrossRoad(var open: Boolean = false): Scene() { + override val angle: VisualAngleMode = VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS + override val priority: Int = 4 + override val displayThreshold: Long + get() = -1 + + override fun toString(): String { + return "CrossRoad(open: ${open}, priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority})" + } +} + diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/marker/IMoGoIdentifyListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/marker/IMoGoIdentifyListener.kt new file mode 100644 index 0000000000..ad40f975f0 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/marker/IMoGoIdentifyListener.kt @@ -0,0 +1,10 @@ +package com.mogo.eagle.core.function.api.map.marker + +import com.alibaba.android.arouter.facade.template.IProvider +import mogo.telematics.pad.MessagePad + +interface IMoGoIdentifyListener :IProvider{ + + fun getIdentifyObj(uuid: String): MessagePad.TrackedObject? + +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuLocationWGS84Listener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuLocationWGS84Listener.kt index c98d8f8982..16c5fd57b3 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuLocationWGS84Listener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuLocationWGS84Listener.kt @@ -11,7 +11,7 @@ interface IMoGoObuLocationWGS84Listener { /** * HV车辆基础信息 - * + s * @param data 数据 * @since 1.0.0 */ diff --git a/core/mogo-core-function-call/build.gradle b/core/mogo-core-function-call/build.gradle index 51aef62a5c..13a6502f25 100644 --- a/core/mogo-core-function-call/build.gradle +++ b/core/mogo-core-function-call/build.gradle @@ -50,20 +50,17 @@ dependencies { // MoGo 数据埋点工具 implementation rootProject.ext.dependencies.analytics compileOnly rootProject.ext.dependencies.mogocustommap - - implementation rootProject.ext.dependencies.mogoobu - + implementation project(':libraries:mogo-obu') if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogo_core_data implementation rootProject.ext.dependencies.mogo_core_utils implementation rootProject.ext.dependencies.mogocommons } else { + implementation project(':core:mogo-core-utils') + implementation project(':foudations:mogo-commons') implementation project(':libraries:mogo-adas') api project(':libraries:mogo-map-api') - implementation project(':foudations:mogo-commons') - implementation project(':core:mogo-core-data') - implementation project(':core:mogo-core-utils') api project(':core:mogo-core-function-api') } } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt index 0324e472b6..e5dbf6ed43 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsListenerManager.kt @@ -55,4 +55,11 @@ object CallerDevaToolsListenerManager : CallerBase() { } } + fun invokeMoFangStatus(status:Boolean){ + M_LISTENERS.forEach { + val listener = it.value + listener.mofangStatus(status) + } + } + } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index 753a80650d..345daf5c4c 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -147,6 +147,13 @@ object CallerDevaToolsManager { devaToolsProviderApi?.downLoadPackage(downloadKey, downloadUrl) } + /** + * 更新下载进度 + */ + fun updateUpgradeProgress() { + devaToolsProviderApi?.updateUpgradeProgress() + } + /** * 展示状态栏 */ 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 91262ceb64..8339a0c006 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 @@ -212,11 +212,4 @@ object CallerHmiManager { hmiProviderApi?.updateStatusBarDownloadView(insert, tag, progress) } - /** - * 更新魔方的链接状态 - */ - fun updateMfStatusView(tag: String, status: Boolean) { - hmiProviderApi?.updateMfStatus(tag, status) - } - } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiViewControlListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiViewControlListenerManager.kt index e8111fc515..566b6e209e 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiViewControlListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiViewControlListenerManager.kt @@ -45,8 +45,4 @@ object CallerHmiViewControlListenerManager : CallerBase() M_LISTENERS[tag]?.updateStatusBarDownloadView(insert, tag, progress) } - fun updateMfStatus(tag: String, viewTag: String, status: Boolean) { - M_LISTENERS[tag]?.updateMfStatus(viewTag, status) - } - } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapIdentifyManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapIdentifyManager.kt new file mode 100644 index 0000000000..d980170cbc --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapIdentifyManager.kt @@ -0,0 +1,19 @@ +package com.mogo.eagle.core.function.call.map + +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.eagle.core.data.constants.MogoServicePaths.PATH_IDENTIFY +import com.mogo.eagle.core.function.api.map.marker.IMoGoIdentifyListener +import com.mogo.eagle.core.function.call.base.CallerBase +import mogo.telematics.pad.MessagePad + +object CallerMapIdentifyManager : CallerBase() { + + private val identifyApi: IMoGoIdentifyListener + get() = ARouter.getInstance().build(PATH_IDENTIFY) + .navigation() as IMoGoIdentifyListener + + fun getIdentifyObj(uuid: String): MessagePad.TrackedObject? { + return identifyApi.getIdentifyObj(uuid) + } + +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapUIServiceManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapUIServiceManager.kt index 7e015c3ec4..cb8288ae15 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapUIServiceManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapUIServiceManager.kt @@ -30,8 +30,8 @@ object CallerMapUIServiceManager { return serviceProvider?.markerService } - fun getOverlayManager(context: Context): IMogoOverlayManager?{ - return serviceProvider?.getOverlayManager(context) + fun getOverlayManager(): IMogoOverlayManager?{ + return serviceProvider?.overlayManager } fun getGDLocationServer(context: Context):IMogoGDLocationClient?{ 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 fa933ad83a..4387d4a198 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 @@ -1,388 +1,24 @@ package com.mogo.eagle.core.function.call.map -import android.content.Context -import android.os.Handler -import android.os.Looper -import android.os.SystemClock -import android.util.* -import androidx.lifecycle.Lifecycle.Event -import androidx.lifecycle.Lifecycle.Event.ON_DESTROY -import androidx.lifecycle.LifecycleEventObserver -import androidx.lifecycle.LifecycleOwner -import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.map.* -import com.mogo.eagle.core.data.map.MapRoadInfo.StopLine -import com.mogo.eagle.core.function.call.autopilot.* -import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.OnRoadListener -import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.* -import com.mogo.eagle.core.utilcode.kotlin.lifeCycleOwner -import com.mogo.eagle.core.utilcode.kotlin.safeCancel -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA -import com.mogo.map.uicontroller.VisualAngleMode -import com.zhidaoauto.map.sdk.open.tools.MapTools -import kotlinx.coroutines.* -import kotlinx.coroutines.android.asCoroutineDispatcher -import kotlinx.coroutines.internal.synchronized -import java.util.* -import java.util.concurrent.TimeUnit -import java.util.concurrent.TimeUnit.SECONDS -import java.util.concurrent.atomic.* -import kotlin.math.* +import com.alibaba.android.arouter.launcher.* +import com.mogo.eagle.core.data.constants.* +import com.mogo.eagle.core.function.api.map.angle.* + /** * 高精地图视角管理类 */ object CallerVisualAngleManager { - private const val TAG = "VisualAngle" - - @Volatile - private var hasCrossRoad = false - - - private var scope: CoroutineScope = acquireScope() - @Synchronized - get() { - if (field.isActive) { - return field - } - val scope = acquireScope() - field = scope - return field - } - - private var defaultDelayJob: Job? = null - - private fun acquireScope(): CoroutineScope { - return CoroutineScope(Handler(Looper.getMainLooper()).asCoroutineDispatcher("change-visual-angle") + SupervisorJob()) + private val provider by lazy { ARouter.getInstance().build(MogoServicePaths.PATH_VISUAL_ANGLE) + .navigation() as? IMoGoVisualAngleChangeProvider } - private interface IAttach { - val angle: VisualAngleMode - val priority: Int - val displayThreshold: Long //最大展示时长 > 0; 表示最长展示多长时间, -1 表示,一直展示,直到触发默认视角, 0: 默认视角专用值, + fun changeAngle(scene: Scene) { + provider?.changeAngle(scene) } - private val triggerLocation = AtomicReference() - - private val distanceOfCarToStopLine = AtomicReference(0.0) - - private val travelled by lazy { AtomicReference(0.0) } - - private val listener = object : OnRoadListener { - private val roadId = AtomicReference() - private val triggerRoadId = AtomicReference() - - override fun onRoadIdInfo(roadId: String) { - this.roadId.set(roadId) - Log.d(TAG, "-- onRoadIdInfo --: prev: ${this.triggerRoadId.get()} -> curr: $roadId") - val loc = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() - var triggerClose = false - val distance = distanceOfCarToStopLine.get() + 5 - if (hasCrossRoad && distance > 0) { - val prev = triggerLocation.get() - if (prev != null && loc != null) { - travelled.set(MapTools.distance(loc.longitude, loc.latitude, prev.longitude, prev.latitude) + travelled.get()) - triggerLocation.set(loc) - } - val oldRoadId = triggerRoadId.get() - Log.d(TAG, "-- onRoadIdInfo --: travelled --: ${travelled.get()}") - if ((travelled.get() > distance) && oldRoadId != null && oldRoadId != roadId) { - distanceOfCarToStopLine.set(0.0) - hasCrossRoad = false - triggerRoadId.set(null) - travelled.set(0.0) - triggerLocation.set(null) - Log.d(TAG, "-- onRoadIdInfo --: trigger close --") - triggerClose = true - } - } - if (triggerClose) { - changeVisualAngle(CrossRoad(false)) - } - } - - - override fun onStopLineInfo(info: StopLine) { - Log.d(TAG, "-- onStopLineInfo --: ${info.distanceOfCarToStopLine}") - if (!hasCrossRoad && info.distanceOfCarToStopLine <= 30.0) { - hasCrossRoad = true - triggerRoadId.set(this.roadId.get()) - distanceOfCarToStopLine.set(info.distanceOfCarToStopLine) - triggerLocation.set(CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02()) - changeVisualAngle(CrossRoad(true)) - } - } + fun updateLongSightLevel(level: Boolean) { + provider?.updateLongSightLevel(level) } - - fun init(ctx: Context) { - if (Thread.currentThread() != Looper.getMainLooper().thread) { - scope.launch { - initListen(ctx) - } - } else { - initListen(ctx) - } - } - - private fun initListen(ctx: Context) { - ctx.lifeCycleOwner.lifecycle.addObserver(object : LifecycleEventObserver { - override fun onStateChanged(source: LifecycleOwner, event: Event) { - if (event == ON_DESTROY) { - CallerMapRoadListenerManager.unRegisterRoadListener("VisualAngleChange") - } - } - }) - CallerMapRoadListenerManager.registerRoadListener("VisualAngleChange", listener) - } - - sealed class Scene private constructor(): IAttach { - - /** - * 默认视图 - * @param delay: 表示多少稍后,默认值为2 - * @param unit: 时间单位,默认为秒 - */ - class Default(val delay: Long = 2, val unit: TimeUnit = SECONDS): Scene() { - - override val angle: VisualAngleMode = VisualAngleMode.MODE_MEDIUM_SIGHT - - override val priority: Int = 1 - - override val displayThreshold: Long - get() = 0 - - override fun toString(): String { - return "Default(delay=$delay, unit=$unit, angle=$angle, priority=$priority)" - } - } - - /** - * 变道-接收到转向灯信息号 - */ - class Turning(var open: Boolean = false): Scene() { - - override val angle: VisualAngleMode = VisualAngleMode.MAP_STYLE_VR_ANGLE_TOP - - override val priority: Int = 3 - - override val displayThreshold: Long - get() = -1 - - override fun toString(): String { - return "Turning(open: ${open}, priority=$priority, displayThreshold: $displayThreshold, priority=$priority)" - } - } - - /** - * 后方车辆离自车过近 - */ - object TooClose: Scene() { - - override val angle: VisualAngleMode = VisualAngleMode.MAP_STYLE_VR_ANGLE_300 - - override val priority: Int = 2 - - override val displayThreshold: Long - get() = SECONDS.toMillis(8) - - override fun toString(): String { - return "TooClose(priority=$priority, displayThreshold: $displayThreshold, priority=$priority)" - } - } - - /** - * 道路事件 - */ - object RoadEvent: Scene() { - - override val angle: VisualAngleMode = VisualAngleMode.MODE_LONG_SIGHT - - override val priority: Int = 5 - - override val displayThreshold: Long - get() = SECONDS.toMillis(8) - - override fun toString(): String { - return "RoadEvent(priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority})" - } - } - - - /** - * 十字路口 - */ - class CrossRoad(var open: Boolean = false): Scene() { - override val angle: VisualAngleMode = VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS - override val priority: Int = 4 - override val displayThreshold: Long - get() = -1 - - override fun toString(): String { - return "CrossRoad(open: ${open}, priority=${priority}, displayThreshold: ${displayThreshold}, priority=${priority})" - } - } - } - - - /** - * 业务实体,不对外暴露 - * @param target: 目标场景 - * @param isDisplay: 是否正在展示 - * @param triggerTime: 触发时间 - */ - private data class Record(val target: Scene, var isDisplay: Boolean = false, var triggerTime: Long): Comparable { - override fun compareTo(other: Record): Int { - //如果时间一样,优先级越高,越靠近堆顶 - return other.target.priority - target.priority - } - } - - private val queue by lazy { - PriorityQueue() - } - - fun changeVisualAngle(current: Scene) { - val appIdentityMode = FunctionBuildConfig.appIdentityMode - if (AppIdentityModeUtils.isBus(appIdentityMode) && AppIdentityModeUtils.isPassenger(appIdentityMode)) { - return - } - val triggerTime = SystemClock.elapsedRealtime() - scope.launch { - Log.d("${M_DEVA}${TAG}", "--- 1 ---") - val displayed = getDisplayed() - if (displayed == null) { - Log.d("${M_DEVA}${TAG}", "--- 2 ---") - if (current is Turning) { - if (!current.open) { - changeVisualAngle(Default()) - return@launch - } - } - if (current is CrossRoad) { - if (!current.open) { - changeVisualAngle(Default()) - return@launch - } - } - doRealVisualAngleChange(triggerTime, current, null) - } else { - val prev = displayed.target - Log.d("${M_DEVA}${TAG}", "--- 3 --- old: $prev -> cur: $current") - val prevTriggerTime = displayed.triggerTime - if (current !is Default && prev.priority > current.priority && (prev is RoadEvent || prev is TooClose)) { - val displayDuration = triggerTime - prevTriggerTime - Log.d("${M_DEVA}${TAG}", "--- 4 ---:场景[$prev], 已展示时长: duration: $displayDuration") - if (displayDuration < prev.displayThreshold) { - Log.d("${M_DEVA}${TAG}", "--- 5 --- 场景[$prev]:仍在保护展示时长内,直接return") - return@launch - } else { - Log.d("${M_DEVA}${TAG}", "--- 6 --- 场景[$prev]:已过保护展示时长,从展示的队列中移除,显示默认视角") - queue -= displayed - changeVisualAngle(Default()) - return@launch - } - } - if (prev is Turning && current is Turning) { - val isOpen = current.open - if (!isOpen) { - Log.d("${M_DEVA}${TAG}", "--- 7 --- 场景[$current], 收到关闭通知") - queue -= displayed - changeVisualAngle(Default()) - return@launch - } - } - if (prev is CrossRoad && current is CrossRoad) { - val isOpen = current.open - if (!isOpen) { - Log.d("${M_DEVA}${TAG}", "--- 8 --- old: $prev -> cur: $current") - queue -= displayed - changeVisualAngle(Default()) - 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}", "--- 10 --- 场景[$prev]正在展示,尚未收到关闭,场景,依然展示当前场景,直接return") - return@launch - } - doRealVisualAngleChange(triggerTime, current, displayed) - } - } - } - - private fun CoroutineScope.doRealVisualAngleChange(triggerTime: Long, target: Scene, displayed: Record? = null) { - if (target is Default) { - Log.d("${M_DEVA}${TAG}", "--- doRealVisualAngleChange --- 1 ---") - displayed?.also { - queue -= it - } - defaultDelayJob?.safeCancel() - launch { - val delay = target.unit.toMillis(target.delay) - Log.d("${M_DEVA}${TAG}", "--- doRealVisualAngleChange --- 2 ---") - delay(delay) - Log.d("${M_DEVA}${TAG}", "--- doRealVisualAngleChange --- 3 ---") - doChangeAngle(Record(target, triggerTime = triggerTime)) - }.also { itx -> - itx.invokeOnCompletion { - if (it is CancellationException) { - Log.d("${M_DEVA}${TAG}", "--- doRealVisualAngleChange --- 4 ---") - } - } - defaultDelayJob = itx - } - } else { - Log.d("${M_DEVA}${TAG}", "--- doRealVisualAngleChange --- 5 ---") - defaultDelayJob?.safeCancel() - if (displayed == null || displayed.target.priority <= target.priority) { - Log.d("${M_DEVA}${TAG}", "--- doRealVisualAngleChange --- 6 ---") - displayed?.also { - queue -= it - } - if (target is Turning) { - if (!target.open) { - Log.d("${M_DEVA}${TAG}", "--- doRealVisualAngleChange --- 7 ---") - changeVisualAngle(Default()) - return - } - } - if (target is CrossRoad) { - if (!target.open) { - Log.d("${M_DEVA}${TAG}", "--- doRealVisualAngleChange --- 8 ---") - changeVisualAngle(Default()) - return - } - } - Log.d("${M_DEVA}${TAG}", "--- doRealVisualAngleChange --- 10 ---") - doChangeAngle(Record(target, triggerTime = triggerTime)) - } - } - } - - @OptIn(InternalCoroutinesApi::class) - private fun doChangeAngle(record: Record) { - val angle = record.target.angle - CallerMapUIServiceManager.getMapUIController()?.also { - Log.d("${M_DEVA}${TAG}", "--- doChangeAngle ---: ${record.target}") - if (record.target !is Default) { - record.isDisplay = true - synchronized(queue) { - queue += record - } - } - it.changeMapVisualAngle(angle, null) - } - } - - /** - * 是否有正在展示的 - */ - @Synchronized - private fun getDisplayed() = queue.firstOrNull() - } \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/DevicesUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/DevicesUtils.java index f4c8511ef4..a427435544 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/DevicesUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/DevicesUtils.java @@ -15,26 +15,26 @@ import java.lang.reflect.Method; public class DevicesUtils { private static final String PROPERTIES = "android.os.SystemProperties"; - private static final String GSM_SERIAL = "gsm.serial"; + private static final String GSM_SERIAL = "persist.device.sn"; private static final String GET = "get"; - public static String getSn(){ + public static String getSn() { return getSystemProperties(GSM_SERIAL); } - public static String getSystemProperties(String name ) { + public static String getSystemProperties(String name) { String value = ""; try { - Class< ? > c = Class.forName( PROPERTIES ); - Method get = c.getMethod( GET, String.class ); - value = (String) get.invoke( c, name ); - } catch ( ClassNotFoundException var3 ) { + Class c = Class.forName(PROPERTIES); + Method get = c.getMethod(GET, String.class); + value = (String) get.invoke(c, name); + } catch (ClassNotFoundException var3) { var3.printStackTrace(); - } catch ( NoSuchMethodException var4 ) { + } catch (NoSuchMethodException var4) { var4.printStackTrace(); - } catch ( InvocationTargetException var5 ) { + } catch (InvocationTargetException var5) { var5.printStackTrace(); - } catch ( IllegalAccessException var6 ) { + } catch (IllegalAccessException var6) { var6.printStackTrace(); } return value; diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/TelephoneUtil.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/TelephoneUtil.java index 246934e6bd..56b3e5f101 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/TelephoneUtil.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/TelephoneUtil.java @@ -8,7 +8,6 @@ import android.os.Build; import android.telephony.TelephonyManager; import android.text.TextUtils; - import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import java.lang.reflect.Field; @@ -154,6 +153,10 @@ public class TelephoneUtil { if (TextUtils.isEmpty(serial)) { serial = (String) get.invoke(c, "ro.serialno"); } + if (TextUtils.isEmpty(serial)) { + serial = (String) get.invoke(c, "persist.device.sn"); + } + } catch (Exception e) { e.printStackTrace(); } diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ActivityUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ActivityUtils.java index 6796a153a6..f49fd31192 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ActivityUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ActivityUtils.java @@ -5,20 +5,18 @@ import android.content.ComponentName; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; +import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.View; -import java.lang.ref.WeakReference; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; - import androidx.annotation.AnimRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -26,6 +24,13 @@ import androidx.core.app.ActivityOptionsCompat; import androidx.core.util.Pair; import androidx.fragment.app.Fragment; +import java.lang.ref.WeakReference; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + /** *
  *     author: Blankj
@@ -2136,4 +2141,65 @@ public final class ActivityUtils {
             return Utils.getApp();
         }
     }
+
+    public static void setDefaultL(Context context) {
+        if (AppUtils.isDefaultHome(context)) {
+            return;
+        }
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.addCategory("android.intent.category.HOME");
+        intent.addCategory("android.intent.category.DEFAULT");
+        try {
+            intent.setComponent(new ComponentName("android", "com.android.internal.app.ResolverActivity"));
+            startActivity(intent);
+        } catch (Exception e) {//还不行,就只能应用程序设置了
+            intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);
+            startActivity(intent);
+        }
+    }
+
+    /**
+     * @param context
+     * @param componentName
+     */
+    public static void setDefaultLauncherApp(Context context, ComponentName componentName) {
+        PackageManager packageManager = context.getPackageManager();
+        Class refPackageManager = packageManager.getClass();
+        Method[] methods = refPackageManager.getDeclaredMethods();
+        Method mReplacePreferredActivity = null;
+        Method mGetHomeActivities = null;
+        for (Method method : methods) {
+            if (method.getName().equals("replacePreferredActivity")) {
+                mReplacePreferredActivity = method;
+            }
+            if (method.getName().equals("getHomeActivities")) {
+                mGetHomeActivities = method;
+            }
+        }
+        mReplacePreferredActivity.setAccessible(true);
+        mGetHomeActivities.setAccessible(true);
+
+        IntentFilter HOME_FILTER = new IntentFilter(Intent.ACTION_MAIN);
+        HOME_FILTER.addCategory(Intent.CATEGORY_HOME);
+        HOME_FILTER.addCategory(Intent.CATEGORY_DEFAULT);
+        final List allComponents = new ArrayList<>();
+        final List homeActivities = new ArrayList<>();
+        try {
+            mGetHomeActivities.invoke(packageManager, homeActivities);
+            for (ResolveInfo info : homeActivities) {
+                final ActivityInfo appInfo = info.activityInfo;
+                ComponentName activityName = new ComponentName(appInfo.packageName, appInfo.name);
+                allComponents.add(activityName);
+            }
+            mReplacePreferredActivity.invoke(
+                    packageManager,
+                    HOME_FILTER,
+                    IntentFilter.MATCH_CATEGORY_EMPTY,
+                    allComponents.toArray(new ComponentName[0]),
+                    componentName);
+        } catch (IllegalAccessException | InvocationTargetException e) {
+            e.printStackTrace();
+        }
+    }
+
 }
diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/AppUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/AppUtils.java
index 003aabf9b0..4ac13c5cc4 100644
--- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/AppUtils.java
+++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/AppUtils.java
@@ -10,6 +10,7 @@ import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.content.pm.Signature;
 import android.content.pm.SigningInfo;
 import android.graphics.drawable.Drawable;
@@ -18,15 +19,15 @@ import android.os.Build;
 import android.os.Bundle;
 import android.text.TextUtils;
 
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
 import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 
  *     author: Blankj
@@ -1017,4 +1018,18 @@ public final class AppUtils {
                     "\n}";
         }
     }
+
+    /**
+     * 判断自己是否为默认桌面
+     */
+    public static boolean isDefaultHome(Context context) {
+        Intent intent = new Intent(Intent.ACTION_MAIN);//Intent.ACTION_VIEW
+        intent.addCategory("android.intent.category.HOME");
+        intent.addCategory("android.intent.category.DEFAULT");
+        PackageManager pm = context.getPackageManager();
+        ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
+        boolean isDefault = context.getPackageName().equals(info.activityInfo.packageName);
+        return isDefault;
+    }
+
 }
diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/DeviceUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/DeviceUtils.java
index fbab2ccd1e..8cf0c47008 100644
--- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/DeviceUtils.java
+++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/DeviceUtils.java
@@ -17,11 +17,16 @@ import android.os.Build;
 import android.provider.Settings;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
+import android.util.Log;
 
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RequiresPermission;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.lang.reflect.Method;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
 import java.net.SocketException;
@@ -547,17 +552,85 @@ public final class DeviceUtils {
 
 
     /**
-     * 中科创达 EB5获取SN好的方法:
-     * getprop persist.device.sn
-     * ZTS46S10009S
+     * 获取设备SN的方法
      *
-     * @return 当前EB5设备SN
+     * @return 通过读取 getprop 的方式
      */
-    public static String getEB5DevicesSN() {
-        ShellUtils.CommandResult result = UtilsBridge.execCmd("getprop persist.device.sn", false);
-        if (result.result == 0) {
-            LogUtils.d("", result.toString());
+    public static String getSerialNumber() {
+        String serial = "";
+        try {
+            Class c = Class.forName("android.os.SystemProperties");
+            Method get = c.getMethod("get", String.class);
+            // 获取序列号,大多数机器在不root情况下获取不到
+            serial = (String) get.invoke(c, "ro.serialno");
+            if (TextUtils.isEmpty(serial)) {
+                serial = (String) get.invoke(c, "ro.boot.serialno");
+            }
+            if (TextUtils.isEmpty(serial)) {
+                // 分体机 SN
+                serial = (String) get.invoke(c, "gsm.serial");
+            }
+            if (TextUtils.isEmpty(serial)) {
+                // 中科创达 EB5获取SN
+                serial = (String) get.invoke(c, "persist.device.sn");
+            }
+            if (TextUtils.isEmpty(serial)) {
+                // 联想PAD 获取SN
+                serial = (String) get.invoke(c, "ro.odm.lenovo.gsn");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
         }
-        return "02:00:00:00:00:00";
+        return serial;
+    }
+
+
+    /**
+     * 获取 	机器型号
+     *
+     * @return 机器型号
+     */
+    public static String getProductModel() {
+        String productModel = "null";
+        try {
+            Class c = Class.forName("android.os.SystemProperties");
+            Method get = c.getMethod("get", String.class);
+            // 获取序列号,大多数机器在不root情况下获取不到
+            productModel = (String) get.invoke(c, "ro.product.model");
+            if (TextUtils.isEmpty(productModel)) {
+                productModel = (String) get.invoke(c, "ro.product.odm.model");
+            }
+            if (TextUtils.isEmpty(productModel)) {
+                productModel = (String) get.invoke(c, "ro.product.vendor.model");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return productModel;
+    }
+
+    private static String getSerialnoNumbers() {
+        final String serialnoStr = "[ro.boot.serialno]";
+        try {
+            Process p = Runtime.getRuntime().exec("getprop");
+            p.waitFor();
+            BufferedReader stdInput = new BufferedReader(new InputStreamReader(
+                    p.getInputStream()));
+            String temp = "";
+            while ((temp = stdInput.readLine()) != null) {
+                Log.i("getSerialnoNumbers", temp);
+                if (temp.contains(serialnoStr)) {
+                    temp.replaceAll(" ", "");
+                    int index = temp.indexOf(serialnoStr);
+                    temp = temp.substring(index + 20);
+                    temp = temp.substring(1, temp.length() - 1);
+                    Log.d("getSerialnoNumbers", temp);
+                    return temp;
+                }
+            }
+        } catch (IOException | InterruptedException e) {
+            e.printStackTrace();
+        }
+        return serialnoStr;
     }
 }
diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/MultiDisplayUtils.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/MultiDisplayUtils.kt
index 1a5451dc10..c24acc4a62 100644
--- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/MultiDisplayUtils.kt
+++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/MultiDisplayUtils.kt
@@ -27,14 +27,14 @@ object MultiDisplayUtils {
     fun getMultiDisplay(context: Context): Array {
         // 多次创建副屏 则副屏的id都是增加的,所以不一定是1,这里还是获取一下
         val displayManager =
-                context.getSystemService(AppCompatActivity.DISPLAY_SERVICE) as DisplayManager
+            context.getSystemService(AppCompatActivity.DISPLAY_SERVICE) as DisplayManager
         return displayManager.displays
     }
 
     /**
      * 在指定ID的屏幕打开Activity,当前应用的,当前进程
      * @param context
-     * @param launchDisplayId 指定屏幕ID
+     * @param activity 要在第二个屏幕启动的页面
      */
     fun startActWithSecond(context: Context, activity: Class<*>) {
         val launchDisplayId: Int
@@ -60,6 +60,7 @@ object MultiDisplayUtils {
      * 在指定ID的屏幕打开Activity,当前应用的,当前进程
      * @param context
      * @param launchDisplayId 指定屏幕ID
+     * @param activity 要在副屏幕启动的页面
      */
     fun startActWithProcess(context: Context, launchDisplayId: Int, activity: Class<*>) {
         // 要加上Intent.FLAG_ACTIVITY_NEW_TASK
diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/SystemPropertiesUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/SystemPropertiesUtils.java
new file mode 100644
index 0000000000..04e0563543
--- /dev/null
+++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/SystemPropertiesUtils.java
@@ -0,0 +1,35 @@
+package com.mogo.eagle.core.utilcode.util;
+
+import java.lang.reflect.Method;
+
+/**
+ * Android API从21后开始,不再直接支持通过SystemProperties.get/set方式来获取/设置系统属性。
+ * 通过反射方式来进行系统属性操作,代码如下:
+ */
+public final class SystemPropertiesUtils {
+    private static final String CLASS_NAME = "android.os.SystemProperties";
+
+    public static String getProperty(String key, String defaultValue) {
+        String value = defaultValue;
+
+        try {
+            Class c = Class.forName(CLASS_NAME);
+            Method get = c.getMethod("get", String.class, String.class);
+            value = (String) (get.invoke(c, key, defaultValue));
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            return value;
+        }
+    }
+
+    public static void setProperty(String key, String value) {
+        try {
+            Class c = Class.forName(CLASS_NAME);
+            Method set = c.getMethod("set", String.class, String.class);
+            set.invoke(c, key, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java
index f48819b07f..f1d78dfc1d 100644
--- a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java
+++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java
@@ -43,9 +43,7 @@ public abstract class AbsMogoApplication extends Application {
         AppStateManager.INSTANCE.init(this);
         initRxJavaErrorHandler();
         FinalizeCrashFixer.fix();
-//        if (!shouldInit()) {
         AutoSize.checkAndInit(this);
-//        }
 
         ScreenHelper.setScreenConfig(this);
         Utils.init(this);
@@ -71,8 +69,7 @@ public abstract class AbsMogoApplication extends Application {
                 return null;
             }
             try {
-                View contentView = generateToastView(context, message, tipDrawable);
-                return contentView;
+                return generateToastView(context, message, tipDrawable);
             } catch (Exception e) {
                 e.printStackTrace();
             }
diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/module/MogoServices.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/module/MogoServices.java
index 5926f0af9d..014c9101f4 100644
--- a/foudations/mogo-commons/src/main/java/com/mogo/commons/module/MogoServices.java
+++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/module/MogoServices.java
@@ -8,7 +8,6 @@ import android.content.IntentFilter;
 import android.net.ConnectivityManager;
 import android.text.TextUtils;
 
-import com.mogo.commons.debug.DebugConfig;
 import com.mogo.commons.module.intent.IMogoIntentListener;
 import com.mogo.commons.module.intent.IntentHandlerFactory;
 import com.mogo.commons.module.intent.IntentManager;
@@ -18,7 +17,6 @@ import com.mogo.commons.voice.AIAssist;
 import com.mogo.eagle.core.data.config.CloudPoiManager;
 import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
 import com.mogo.eagle.core.utilcode.util.NetworkUtils;
-import com.mogo.realtime.api.MoGoAiCloudRealTime;
 
 import java.util.List;
 
@@ -57,10 +55,6 @@ public class MogoServices implements IMogoIntentListener {
         Intent intent = new Intent("com.freedom.ser.ACTION");
         intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
         mContext.sendBroadcast(intent);
-
-//        if (DebugConfig.isNeedUploadCoordinatesDurationInTime()) {
-//            MoGoAiCloudRealTime.startRealTime(mContext, DebugConfig.getSocketAppId());
-//        }
     }
 
     private void registerMogoReceiver(Context context) {
@@ -105,9 +99,6 @@ public class MogoServices implements IMogoIntentListener {
 
     public void destroy() {
         CallerLogger.INSTANCE.d(M_OLD_OTHER + TAG, "MogoServices do nothings.");
-//        if (DebugConfig.isNeedUploadCoordinatesDurationInTime()) {
-//            MoGoAiCloudRealTime.stopRealTime();
-//        }
     }
 
 }
diff --git a/gradle.properties b/gradle.properties
index 922318a892..9c88990a89 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -10,7 +10,7 @@
 org.gradle.daemon=true
 org.gradle.configureondemand=true
 org.gradle.parallel=true
-org.gradle.jvmargs=-Xmx2048m
+org.gradle.jvmargs=-Xmx3048m
 #开启gradle缓存
 org.gradle.caching=true
 android.enableBuildCache=true
@@ -66,26 +66,26 @@ SERVICE_BIZ_VERSION=1.2.4
 LOGLIB_VERSION=1.5.10
 ######## MogoAiCloudSDK Version ########
 # 网络请求LOGLIB_VERSION
-MOGO_NETWORK_VERSION=1.4.3.32-beta3
+MOGO_NETWORK_VERSION=1.4.4.1
 # 鉴权
-MOGO_PASSPORT_VERSION=1.4.3.32-beta3
+MOGO_PASSPORT_VERSION=1.4.4.1
 # 常链接
-MOGO_SOCKET_VERSION=1.4.3.32-beta3
+MOGO_SOCKET_VERSION=1.4.4.1
 # 数据采集
-MOGO_REALTIME_VERSION=1.4.3.32-beta3
+MOGO_REALTIME_VERSION=1.4.4.1
 # 探路,道路事件发布,获取
-MOGO_TANLU_VERSION=1.4.3.32-beta3
+MOGO_TANLU_VERSION=1.4.4.1
 # 直播推流
-MOGO_LIVE_VERSION=1.4.3.32-beta3
+MOGO_LIVE_VERSION=1.4.4.1
 # 直播拉流
-MOGO_TRAFFICLIVE_VERSION=1.4.3.32-beta3
+MOGO_TRAFFICLIVE_VERSION=1.4.4.1
 # 定位服务
-MOGO_LOCATION_VERSION=1.4.3.32-beta3
+MOGO_LOCATION_VERSION=1.4.4.1
 # 远程通讯模块
-MOGO_TELEMATIC_VERSION=1.4.3.32-beta2
+MOGO_TELEMATIC_VERSION=1.4.4.1
 ######## MogoAiCloudSDK Version ########
 # 自研地图
-MAP_SDK_VERSION=2.9.0.8_gamap_02
+MAP_SDK_VERSION=2.10.0.2_test_01
 MAP_SDK_OPERATION_VERSION=1.1.4.1
 # websocket
 WEBSOCKET_VERSION=1.1.7
@@ -119,10 +119,8 @@ MOGO_MODULE_V2X_VERSION=2.1.16.10
 MOGO_MODULE_OBU_MOGO_VERSION=2.1.16.10
 # bugly
 CRASHREPORT_VERSION=2.1.16.10
-CRASHREPORT_BUGLY_VERSION=2.1.16.10
 CRASHREPORT_NOOP_VERSION=2.1.16.10
 CRASHREPORT_APMBYTE_VERSION=2.1.16.10
-CRASHREPORT_UPGRADE_VERSION=2.1.16.10
 ## tts
 TTS_BASE_VERSION=2.1.16.10
 TTS_DI_VERSION=2.1.16.10
@@ -132,12 +130,6 @@ TTS_NOOP_VERSION=2.1.16.10
 # 自研地图
 MAP_CUSTOM_VERSION=2.1.16.10
 
-# 车聊聊
-MOGO_MODULE_CHAT_VERSION=2.1.16.10
-MOGO_MODULE_CARCHATTING_VERSION=2.1.16.10
-# 车聊聊接口
-MOGO_MODULE_CARCHATTINGPROVIDER_VERSION=2.1.16.10
-
 # OCH
 MOGO_OCH_VERSION=2.1.16.10-test
 MOGO_OCH_BUS_VERSION=2.0.66
diff --git a/keystore/EB5/car_launcher.jks b/keystore/EB5/car_launcher.jks
new file mode 100644
index 0000000000..69ee89a826
Binary files /dev/null and b/keystore/EB5/car_launcher.jks differ
diff --git a/keystore/EB5/key b/keystore/EB5/key
new file mode 100644
index 0000000000..b3087d0a28
--- /dev/null
+++ b/keystore/EB5/key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCceAWSrA1dOBze
+qmXsyKYAbjZIDG1yB7EgEb5Qhjqr4rVdAJrfcUbW8iAigMfNTXvbJiQ7ioBsJrNL
+E3UjpJJoIkkE3AFJPnwKzxoFyHT2mwN7YDCdkHTSQoDha60qhzQ2GVHq9ypILQmy
+BLGHXhKsmMGqdz1oALnq/eVtWL7Y6NoW+aNgCZw3qDSm3+23trRKBJ4Homn8zyxU
+lvLPNtZN+Qo7jY80o7qrTPUzcasncZs7pYdUrQxT/BTh20XVHiNPu+k8m6Tt+c5U
+JhNQ7FNWB79pov9KoH219+ogDQmmwbSeIUAvie0RkIk6q1qRgPFS6C+FpFdTz1/B
+kHHF7sgnAgEDAoIBAGhQA7cdXj4laJRxmUiFxABJeYVdnkwFIMAL1DWu0cfseOir
+EepLhI9MFWxV2ojeUpIZbX0HAEgZzNy3o20YYZrBhgM9VjDUUrHfZq6Fo08SAlJA
+IGkK+IwsVeudHhxaIs67i/H6HDAeBnaty6+UDHMQgRxPfkVV0UdT7kjl1JCaMTTc
+hXxr+oGsH5d5EHCPBfEU4v8BqOBSEgkUFJ1Y6Y5AQqbSe2nSZ6bKZpE8YY27Ipvq
+BrZEN0j7SKcHKuJDm81DGfLrh3vOmW6U0ZWy7o9qv7INYXNDvtKUMQigXYYANKUp
+KvveUSgKJ+ixfFP8Ye92j8mp+d/+16i4Wa7Wu5sCgYEAyCd3wu4wsRAu/8q1abL1
+4/V8M95+dlfhJBl3H9VwUbsH+CP2VRQ9KYkaYdPwOb8hz1h8gqr74ASbEvz+ixMH
+zI6zel07VDCew+6OUZOBiOxGc8p7SpZuCeDsL+GEZxkOMQ7PXUpDI/p8nx84eEJU
+ZrHc2kv1VcpdAXLhtrpiicUCgYEAyCA3GDc282T3BXj061vqR2rpFaqhdlRy7S2B
+tA3BJj2Qrh1bgQGq9agC+YWm3xO3F/lJ+phK2WHoFOpR+m6w7Q0jx/L/BYOlJD+4
+h1zeZJKhLBQToodM1ZktcLGYFkSzNJeUImt5T1sErj5op9Ex97nZfYswCrl0GtGa
+NIVKJPsCgYEAhW+lLJ7LILV0qocjm8yj7U5SzT7++Y/rbWZPao5K4SdapW1O42LT
+cQYRlo1K0SoWijr9rHH9QAMSDKipsgyv3bR3pujSOCBp1/Re4Q0BBfLZoob83GRJ
+W+tIH+utmhC0ILSKPjGCF/xTFL96+tbi7yE95t1OOTGTVkyWedGXBoMCgYEAhWrP
+ZXokokNPWPtN8j1G2kdGDnHA+Y2h83OrzV6AxCkLHr49AKvHTnAB+65vP2J6D/uG
+pxAx5kFFY0bhUZ8gngjChUyqA60YwtUlr5M+7bcWHWK3wa+IjmYeSyEQDth3eGUN
+bEemNOdYdCmbGot2pSaQ/lzKsdD4EeEReFjcGKcCgYA+JeOt5WFENpv4LT+7P+j1
+k3xvOZ9sJGuXRXk9HXzsJvRCnc5oScwqku6i5HjzG8gyNVZg1sQGbVbWWmcNtaS8
+I3XalYAHYQyb8SGxlQP4ctKAN4j2Hbk1OHAMW84dfAQYQwFcBdaJTtMXQlbbX5Rh
+x90wE4qFuIapx6IKOmDxRw==
+-----END PRIVATE KEY-----
diff --git a/keystore/EB5/p12 b/keystore/EB5/p12
new file mode 100644
index 0000000000..3c762e5e42
Binary files /dev/null and b/keystore/EB5/p12 differ
diff --git a/libraries/mogo-adas-data/README.md b/libraries/mogo-adas-data/README.md
index 72fc06ed07..62edd6feb9 100644
--- a/libraries/mogo-adas-data/README.md
+++ b/libraries/mogo-adas-data/README.md
@@ -1,5 +1,5 @@
 # 工控机PB文件 用于生成Java Bean
-
+# ***鹰眼自用PB文件放在单独文件夹(personal)目的是为了区分工控机PB还是自用PB***
 ## 1. studio中*.proto文件中如果出现“Cannot resolve symbol 'xxxx'”提示
 **不影响正常编译,只影响美观以及无法在proto文件中跳转**
 ~~~
@@ -15,7 +15,6 @@
 ~~~
 
 # 工控机透传OBU V2I PB转换
-***鹰眼自用PB文件放在单独文件夹(personal)目的是为了区分工控机PB还是自用PB***
 |工控机原始PB文件|转换后鹰眼所用PB|
 |:-|:-|
 |obu_warning_event.proto|personal/obu_penetrate.proto、personal/obu_scene.proto|
diff --git a/libraries/mogo-adas-data/src/main/proto/SocketDownDataProto3.proto b/libraries/mogo-adas-data/src/main/proto/SocketDownDataProto3.proto
new file mode 100644
index 0000000000..b101f6234c
--- /dev/null
+++ b/libraries/mogo-adas-data/src/main/proto/SocketDownDataProto3.proto
@@ -0,0 +1,78 @@
+syntax = "proto3";
+package mogo.yycp.service;
+option java_package = "mogo.yycp.api.proto";
+option java_outer_classname = "SocketDownData";
+/*
+message xxx {
+  // 字段规则:required -> 字段只能也必须出现 1 次
+  // 字段规则:optional -> 字段可出现 0 次或1次
+  // 字段规则:repeated -> 字段可出现任意多次(包括 0)
+  // 类型:int32、int64、sint32、sint64、string、32-bit ....
+  // 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字)
+  字段规则 类型 名称 = 字段编号;
+}
+*/
+//返回车机主实体
+message SocketDownDataProto {
+    uint64 seq = 1;
+    uint32 msgType = 2;
+    string sn = 3;
+    LauncherSnapshotProto data = 4;
+    uint64 utcTime = 5;
+    uint64 upUtcTime = 6;
+    string cityCode = 7;
+}
+
+//LauncherSnapshot数据响应VO
+message LauncherSnapshotProto {
+    //总数据集合 RoadDataVo
+    repeated CloudRoadDataProto allList = 1;
+    //前方50米数据集合 RoadDataVo
+    repeated CloudRoadDataProto nearList = 2;
+    //摄像头 RoadDataVo
+    CloudRoadDataProto camera = 3;
+    string msgId = 4;
+    uint64 time = 5;
+    //过期时间
+    uint64 expire = 6;
+}
+//RoadDataVo
+message CloudRoadDataProto {
+    /**物体类型 1-人 2-自行车 3-小轿车 4-摩托车 5-红绿灯 6-bus 8-truck 9-路边摄像头*/
+    uint32 type = 1;
+    /**数据来源 1,"自车数据"  2,"ADAS数据"  3,"路测设备识别数据" */
+    uint32 fromType = 2;
+    /**
+     * 车机上行pgs坐标给lat,lon两个成员变量
+     *
+     * 在下发车机时计算高德经纬度
+     * 1.将gps(lat,lon)给wgslat,wgalon
+     * 2.高德算法算出高德经纬度,给lat,lon
+     */
+    double lat = 3; //gps->gd
+    double lon = 4; //gps->gd
+    double wgslat = 5; //原gps
+    double wgslon = 6; //原gps
+    //车机sn
+    string sn = 7;
+    //车辆UUID
+    string uuid = 8;
+    /** 车牌号 */
+    string cardId = 9;
+    /**速度*/
+    double speed = 10;
+    /**方向*/
+    double heading = 11;
+    /** 系统时间 */
+    uint64 systemTime = 12;
+    /** 星历时间 */
+    uint64 satelliteTime = 13;
+    /**红绿灯状态 1红 2绿 3黄*/
+    uint32 lightStatus = 14;
+    /**红绿灯剩余时间 读秒*/
+    uint32 lightLeftTime = 15;
+    /**视频流直播地址*/
+    string rtmpUrl = 16;
+    /**距离*/
+    double distance = 17;
+}
diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto
index f96fe6fa96..4fbde4e724 100644
--- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto
+++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto
@@ -90,6 +90,15 @@ message Trajectory
     repeated TrajectoryPoint points = 1;
 }
 
+enum AdditionalAttribute
+{
+    ATTR_UNKNOWN = 0;
+    ATTR_ZOMBIE = 1; // 僵尸车
+    ATTR_ROAD_CONSTRUCTION = 2; // 道路施工区域
+    ATTR_STATIC = 3; // 静止障碍物
+    ATTR_ACCIDENT = 4; // 事故车
+}
+
 // message definition for MsgTypeTrackedObjects
 message SubSource
 {
@@ -125,6 +134,9 @@ message TrackedObject
     repeated TrackedSource tracked_source = 14;
     repeated Location polygon = 15;
     geometry.Point center = 16;
+    AdditionalAttribute add_attribute = 17; // 事件类型
+    reserved 18 to 100;
+    string strUuid = 101;//String类型车辆ID
 }
 
 message TrackedObjects
diff --git a/libraries/mogo-adas-data/src/main/proto/personal/obu_base.proto b/libraries/mogo-adas-data/src/main/proto/personal/obu_base.proto
index 52174fb80e..0954d731da 100644
--- a/libraries/mogo-adas-data/src/main/proto/personal/obu_base.proto
+++ b/libraries/mogo-adas-data/src/main/proto/personal/obu_base.proto
@@ -5,13 +5,13 @@ package com.mogo.support.obu;
 //垂直方向偏差 目前OBU发送的数据未偏移,使用的是elevation
 message VerticalLLV{
   oneof present{
-    double offset1 = 1;//海拔,单位(m)
-    double offset2 = 2;//海拔,单位(m)
-    double offset3 = 3;//海拔,单位(m)
-    double offset4 = 4;//海拔,单位(m)
-    double offset5 = 5;//海拔,单位(m)
-    double offset6 = 6;//海拔,单位(m)
-    double elevation = 7;//海拔,单位(m)
+    double offset1 = 1;   //海拔,单位(m)
+    double offset2 = 2;   //海拔,单位(m)
+    double offset3 = 3;   //海拔,单位(m)
+    double offset4 = 4;   //海拔,单位(m)
+    double offset5 = 5;   //海拔,单位(m)
+    double offset6 = 6;   //海拔,单位(m)
+    double elevation = 7; //海拔,单位(m)
   }
 }
 
@@ -33,135 +33,158 @@ message PositionOffset{
 }
 message  PositionLL1{
   //  (-2048..2047)
-  double longitude = 1;//经度,单位(°)
-  double latitude = 2;//维度,单位(°)
+  double longitude = 1; //经度,单位(°)
+  double latitude = 2;  //维度,单位(°)
 }
 message  PositionLL2{
   //  (-8192..8191)
-  double longitude = 1;//经度,单位(°)
-  double latitude = 2;//维度,单位(°)
+  double longitude = 1; //经度,单位(°)
+  double latitude = 2;  //维度,单位(°)
 }
 message  PositionLL3{
   // (-32768..32767)
-  double longitude = 1;//经度,单位(°)
-  double latitude = 2;//维度,单位(°)
+  double longitude = 1; //经度,单位(°)
+  double latitude = 2;  //维度,单位(°)
 }
 message  PositionLL4{
   // (-131072..131071)
-  double longitude = 1;//经度,单位(°)
-  double latitude = 2;//维度,单位(°)
+  double longitude = 1; //经度,单位(°)
+  double latitude = 2;  //维度,单位(°)
 }
 message  PositionLL5{
   // (-2097152..2097151)
-  double longitude = 1;//经度,单位(°)
-  double latitude = 2;//维度,单位(°)
+  double longitude = 1; //经度,单位(°)
+  double latitude = 2;  //维度,单位(°)
 }
 message  PositionLL6{
   //  (-8388608..8388607)
-  double longitude = 1;//经度,单位(°)
-  double latitude = 2;//维度,单位(°)
+  double longitude = 1; //经度,单位(°)
+  double latitude = 2;  //维度,单位(°)
 }
 message  PositionLatLon{
   // 定义经度数值。东经为正,西经为负。
   //分辨率为1e-7°。
-  double longitude = 1;//经度,单位(°)
-  double latitude = 2;//维度,单位(°)
+  double longitude = 1; //经度,单位(°)
+  double latitude = 2;  //维度,单位(°)
 }
 //////////////////////////////////////////////////////////////////
 
 //交通标志/事件位置信息
 message PositionLLV{
-  PositionOffset position = 1;//经纬度
-  VerticalLLV vertical = 2;//垂直方向偏差
+  PositionOffset position = 1;  //经纬度
+  VerticalLLV vertical = 2;     //垂直方向偏差
 }
 
 //交通参与者尺寸信息
 message VehicleSize {
-  int32 width = 1;//宽度,单位(cm)
-  int32 length = 2;//长度,单位(cm)
-  int32 height = 3;//高度,单位(cm)
+  int32 width = 1;  //宽度,单位(cm)
+  int32 length = 2; //长度,单位(cm)
+  int32 height = 3; //高度,单位(cm)
 }
 
 //四轴加速度
 message AccFourAxes {
-  double  accLng = 1;//纵向加速度,单位(m/s2)
-  double  accLat = 2;//横向加速度,单位(m/s2)
-  double  accVert = 3;//垂直加速度,单位(G)
-  double  accYaw = 4;//横摆角加速度,单位(°/s)
+  double  accLng = 1;   //纵向加速度,单位(m/s2)
+  double  accLat = 2;   //横向加速度,单位(m/s2)
+  double  accVert = 3;  //垂直加速度,单位(G)
+  double  accYaw = 4;   //横摆角加速度,单位(°/s)
 }
 
 //节点信息
 message NodeId{
-  int32 region = 1;/* 定义地图中划分区域的ID号 */
-  int32 id = 2;    /* 定义地图节点ID */
+  int32 region = 1; /* 定义地图中划分区域的ID号 */
+  int32 id = 2;     /* 定义地图节点ID */
 }
 
 //灯色信息
 message SpatLight{
-  int32 phaseID = 1;           /* 信号灯相位ID */
-  int32 maneuvers = 2;          /* 允许转向关系,bit0:直行,bit1:左转,bit2:右转,bit3:掉头 */
-  int32 light = 3;              /* 灯色,0:不可用,1:黑色,2:红闪,3:红色,4:绿闪,5:permissive_green,6:protected_green,7:黄色,8:黄闪 */
-  double countDown = 4;        /* 灯色倒计时,单位(s) */
+  int32 phaseID = 1;          /* 信号灯相位ID */
+  int32 maneuvers = 2;        /* 允许转向关系,bit0:直行,bit1:左转,bit2:右转,bit3:掉头 */
+  int32 light = 3;            /* 灯色,0:不可用,1:黑色,2:红闪,3:红色,4:绿闪,5:permissive_green,6:protected_green,7:黄色,8:黄闪 */
+  double countDown = 4;       /* 灯色倒计时,单位(s) */
   double suggestMaxSpeed = 5; /* 建议最大车速,单位(m/s) */
   double suggestMinSpeed = 6; /* 建议最小车速,单位(m/s) */
 }
 
 //时间
 message DateTime{
-  int32 year = 1;        /* 年份 */
+  int32 year = 1;         /* 年份 */
   int32 month = 2;        /* 月份 */
   int32 day = 3;          /* 日期 */
   int32 hour = 4;         /* 小时 */
   int32 minute = 5;       /* 分钟 */
-  int32 millisecond = 6; /* 毫秒 */
+  int32 millisecond = 6;  /* 毫秒 */
   int32 offset = 7;       /* 定义与UTC时间的分钟差 */
 }
 
 //预警数据
 message WarningData{
-  int32 unitMask = 1; /* 描述所属字段有效性 */
-  int32 status = 2;            /* 状态信息,0:更新,1:添加,2:删除 */
-  int32 warningType = 3;     /* 预警类型,0:前向碰撞预警,1:交叉路口碰撞预警,2:左转辅助预警,3:盲区预警,4:变道预警,
-    5:逆向超车预警,6:紧急制动预警,7:异常车辆提醒,8:失控车辆预警,9:紧急车辆预警,10:弱势交通参与者碰撞预警 */
+  int32 unitMask = 1;         /* 描述所属字段有效性 */
+  int32 status = 2;           /* 状态信息,0:更新,1:添加,2:删除 */
+  int32 warningType = 3;      /* 预警类型,0:前向碰撞预警,1:交叉路口碰撞预警,2:左转辅助预警,3:盲区预警,4:变道预警,
+                                         5:逆向超车预警,6:紧急制动预警,7:异常车辆提醒,8:失控车辆预警,9:紧急车辆预警,10:弱势交通参与者碰撞预警 */
   int32 warningLevel = 4;     /* 预警等级,0:无效,1:DETECTED,2:INFORM,3:WARNING */
-  int32 warningPriority = 5; /* 预警优先级,默认为0,预留 */
+  int32 warningPriority = 5;  /* 预警优先级,默认为0,预留 */
 }
 
 //弱势交通参与者预警信息
 message V2xWarning{
-  int32 unitMask = 1; /* 描述所属字段有效性 */
-  repeated WarningData warningData = 2;
-  DateTime warningTime = 3; /* 预警触发时间 */
-  double distance = 4;      /* 预警触发时与自车之间的距离,单位(m)  */
+  int32 unitMask = 1;                   /* 描述所属字段有效性 */
+  repeated WarningData warningData = 2; /*预警数据*/
+  DateTime warningTime = 3;             /* 预警触发时间 */
+  double distance = 4;                  /* 预警触发时与自车之间的距离,单位(m)  */
 }
 
 //弱势交通参与者信息
 message Participant{
-  int32 ptcType = 1;         /* 交通参与者类型,0:未知,1:机动车,2:非机动车,3:行人,4:OBU自身 */
-  int32 ptcId = 2;           /* 临时ID,取值范围(1..255) */
-  int32 source = 3;            /* 监测信息来源,0:未知,1:RSU自身,2:V2X广播,3:视频传感器,4:微波雷达,5:地磁线圈传感器,6:激光雷达传感器,7:两类或以上感知数据融合 */
-  int64 secMark = 4;         /* UTC时间,单位(ms) */
+  int32 ptcType = 1;            /* 交通参与者类型,0:未知,1:机动车,2:非机动车,3:行人,4:OBU自身 */
+  int32 ptcId = 2;              /* 临时ID,取值范围(1..255) */
+  int32 source = 3;             /* 监测信息来源,0:未知,1:RSU自身,2:V2X广播,3:视频传感器,4:微波雷达,5:地磁线圈传感器,6:激光雷达传感器,7:两类或以上感知数据融合 */
+  int64 secMark = 4;            /* UTC时间,单位(ms) */
   double latitude = 5;          /* 维度,单位(°) */
   double longitude = 6;         /* 经度,单位(°) */
   double elevation = 7;         /* 海拔,单位(m) */
   double speed = 8;             /* 速度,单位(m/s) */
-  double heading = 9;          /* 航向角,单位(°) */
+  double heading = 9;           /* 航向角,单位(°) */
   AccFourAxes accFourAxes = 10; /* 四轴加速度 */
-  VehicleSize ptcSize = 11;          /* 交通参与者尺寸信息 */
-  int32 vehicleClass = 12;     /* 车辆类型,参考《OBU软件SDK使用文档》附录A中的表1 */
-  int32 targetPosition = 13;   /* 目标方位,参考mg_veh_target_position_t */
+  VehicleSize ptcSize = 11;     /* 交通参与者尺寸信息 */
+  int32 vehicleClass = 12;      /* 车辆类型,参考《OBU软件SDK使用文档》附录A中的表1 */
+  int32 targetPosition = 13;    /* 目标方位,参考mg_veh_target_position_t */
 }
 
 message RsiWarning {
-  int32 unitMask = 1;        /* 描述所属字段有效性 */
+  int32 unitMask = 1;         /* 描述所属字段有效性 */
   int32 sceneType = 2;        /* 预警类型,0:无效,1:限速信息,2:道路危险,3:车内标牌,4:前方拥堵 */
-  PositionLLV position = 3;       /* 交通标志/事件位置信息 */
-  int32 signSerialNum = 4;  /* 交通标志类型序号,根据预警类型匹配,0:无效,参照国标《GB 5768.2-2009中“交通标志中文名称索引》表序号 */
-  int32 eventSerialNum = 5; /* 交通事件类型序号,根据预警类型匹配,0:无效,参考国标《GB/T 29100-2012》中定义的事件分类代码 */
-  double speedMaxLimit = 6;  /* 建议最大车速,单位(0.02m/s) */
-  double speedMinLimit = 7;  /* 建议最小车速,单位(0.02m/s) */
+  PositionLLV position = 3;   /* 交通标志/事件位置信息 */
+  int32 signSerialNum = 4;    /* 交通标志类型序号,根据预警类型匹配,0:无效,参照国标《GB 5768.2-2009中“交通标志中文名称索引》表序号 */
+  int32 eventSerialNum = 5;   /* 交通事件类型序号,根据预警类型匹配,0:无效,参考国标《GB/T 29100-2012》中定义的事件分类代码 */
+  double speedMaxLimit = 6;   /* 建议最大车速,单位(0.02m/s) */
+  double speedMinLimit = 7;   /* 建议最小车速,单位(0.02m/s) */
   double eventRadius = 8;     /* 交通事件触发半径,根据预警类型匹配,0:无效,单位(0.1m) */
   int32 warningLevel = 9;     /* 预警等级,0:无效,1:DETECTED,2:INFORM,3:WARNING */
-  int32 targetPosition = 10;   /* 目标方位,参考mg_rti_target_position_t */
-  double distance = 11;          /* 预警触发时与自车之间的距离,单位(0.01m) */
+  int32 targetPosition = 10;  /* 目标方位,参考mg_rti_target_position_t */
+  double distance = 11;       /* 预警触发时与自车之间的距离,单位(0.01m) */
+}
+
+message VehicleControl{
+  int32 unitMask = 1;           /* 描述所属字段有效性 */
+  int32 brakePedalStatus = 2;   /* 刹车踏板状态,0:未装备/未知/不可用,1:刹车踏板未踩下,2:刹车踏板已踩下 */
+  int32 transmissionStatus = 3; /* 车辆档位状态,0:空挡,1:停止档,2:前进挡,3:倒挡,7:无效值 */
+  int32 exteriorLights = 4;     /* 车灯状态,0:近光灯,1:远光灯,2:左转信号灯,3:右转信号灯,4:危险信号灯,5:自动大灯,6:日间行车灯,7:雾灯,8:停车灯 */
+}
+
+message VehicleBasics{
+  int32 unitMask = 1;                 /* 描述所属字段有效性 */
+  string id = 2;                      /* OBU ID */
+  int64 secMark = 3;                  /* UTC时间,单位(ms) */
+  double latitude = 4;                /* 维度,单位(°) */
+  double longitude = 5;               /* 经度,单位(°) */
+  double elevation = 6;               /* 海拔,单位(m) */
+  double speed = 7;                   /* 速度,单位(m/s) */
+  double heading = 8;                 /* 航向角,单位(°) */
+  AccFourAxes accFourAxes = 9;        /* 四轴加速度 */
+  VehicleSize vehSize = 10;           /* 车辆尺寸 */
+  int32 vehClass = 11;                /* 车辆类型,参考《OBU软件SDK使用文档》附录A中的表1 */
+  VehicleControl vehControlMsg = 12;  /* 车辆系统控制信息 */
+  int32 targetPosition = 13;          /* 目标方位,参考mg_veh_target_position_t */
 }
\ No newline at end of file
diff --git a/libraries/mogo-adas-data/src/main/proto/personal/obu_scene.proto b/libraries/mogo-adas-data/src/main/proto/personal/obu_scene.proto
index feb76afbc0..c2a0a62aca 100644
--- a/libraries/mogo-adas-data/src/main/proto/personal/obu_scene.proto
+++ b/libraries/mogo-adas-data/src/main/proto/personal/obu_scene.proto
@@ -2,35 +2,47 @@ syntax = "proto3";
 package com.mogo.support.obu;
 
 import "personal/obu_base.proto";
-//场景PB 目前只有V2I(Rsi、Rsm、Spat、Map)相关场景,后期会添加V2V相关场景
+//场景PB:包括 RV HV(V2V) V2I(Rsi、Rsm、Spat、Map)相关场景
 
 //预警事件 RSI Warning event
 message RsiWarningData {
-  int32 status = 1;          /* 状态信息,0:更新,1:添加,2:删除 */
-  //int32 warning_num = 2;     /* 预警信息数量 */
+  int32 status = 1;                   /* 状态信息,0:更新,1:添加,2:删除 */
   repeated RsiWarning warningMsg = 2; /* 预警信息集合 */
 }
 
 //RSM Warning Msg
 message RsmWarningData{
-  int32 status = 1;         /* 状态信息,0:更新,1:添加,2:删除 */
-  Participant participant = 2; /* 弱势交通参与者信息 */
-  V2xWarning warningMsg = 3; /* 弱势交通参与者预警信息 */
+  int32 status = 1;             /* 状态信息,0:更新,1:添加,2:删除 */
+  Participant participant = 2;  /* 弱势交通参与者信息 */
+  V2xWarning warningMsg = 3;    /* 弱势交通参与者预警信息 */
 }
 
 //SPAT Msg
 message SpatWarningData{
-  int32 status = 1;       /* 状态信息,0:更新,1:添加,2:删除 */
-  int32 warningType = 2; /* 预警类型信息 */
-  repeated SpatLight lights = 3;    /* 灯色信息集合 */
+  int32 status = 1;               /* 状态信息,0:更新,1:添加,2:删除 */
+  int32 warningType = 2;          /* 预警类型信息 */
+  repeated SpatLight lights = 3;  /* 灯色信息集合 */
 }
 
 message MapMatchData{
-  int32 status = 1;/* 状态信息,0:更新,1:添加,2:删除 */
-  int32 unitMask = 2;/* 描述所属字段有效性 */
-  NodeId currentNodeID = 3;/* 前方节点信息 */
-  NodeId upstreamNodeID = 4;/* 上游节点信息 */
-  int32 matchingLaneID = 5;/* 匹配车道ID,0:无效 */
-  double speedMaxLimit = 6;/* 建议最大车速,单位(m/s) */
-  double speedMinLimit = 7;/* 建议最小车速,单位(m/s) */
+  int32 status = 1;           /* 状态信息,0:更新,1:添加,2:删除 */
+  int32 unitMask = 2;         /* 描述所属字段有效性 */
+  NodeId currentNodeID = 3;   /* 前方节点信息 */
+  NodeId upstreamNodeID = 4;  /* 上游节点信息 */
+  int32 matchingLaneID = 5;   /* 匹配车道ID,0:无效 */
+  double speedMaxLimit = 6;   /* 建议最大车速,单位(m/s) */
+  double speedMinLimit = 7;   /* 建议最小车速,单位(m/s) */
+}
+
+//自车信息
+message HvBasicsData{
+  int32 status = 1;               /* 状态信息,0:更新,1:添加,2:删除 */
+  VehicleBasics vehBasicsMsg = 2; /* 自车基础运行信息 */
+}
+
+//他车数据包括 V2V预警信息
+message RvWarningData{
+  int32 status = 1;               /* 状态信息,0:更新,1:添加,2:删除 */
+  VehicleBasics vehBasicsMsg = 2; /* 临车基础运行信息 */
+  V2xWarning warningMsg = 3;      /* V2V预警信息 */
 }
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java
index 91cfec766c..ff3d6b8b67 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java
@@ -195,21 +195,13 @@ public interface OnAdasListener {
      */
     void onPlanningActionMsg(MessagePad.Header header, MessagePad.PlanningActionMsg planningActionMsg);
 
-    /**
-     * OBU预警事件
-     *
-     * @param header         头
-     * @param obuWarningData 数据
-     */
-    void onObuWarningData(MessagePad.Header header, ObuWarningEvent.ObuWarningData obuWarningData);
-
     /**
      * OBU 红绿灯预警信息
      *
      * @param header          头
      * @param spatWarningData 数据
      */
-    void onoObuSpatWarning(MessagePad.Header header, ObuScene.SpatWarningData spatWarningData);
+    void onObuSpatWarning(MessagePad.Header header, ObuScene.SpatWarningData spatWarningData);
 
     /**
      * OBU RSI预警信息
@@ -217,7 +209,7 @@ public interface OnAdasListener {
      * @param header         头
      * @param rsiWarningData 数据
      */
-    void onoObuRsiWarning(MessagePad.Header header, ObuScene.RsiWarningData rsiWarningData);
+    void onObuRsiWarning(MessagePad.Header header, ObuScene.RsiWarningData rsiWarningData);
 
     /**
      * OBU RSM预警信息
@@ -225,7 +217,7 @@ public interface OnAdasListener {
      * @param header         头
      * @param rsmWarningData 数据
      */
-    void onoObuRsmWarning(MessagePad.Header header, ObuScene.RsmWarningData rsmWarningData);
+    void onObuRsmWarning(MessagePad.Header header, ObuScene.RsmWarningData rsmWarningData);
 
     /**
      * OBU 地图匹配结果
@@ -233,7 +225,7 @@ public interface OnAdasListener {
      * @param header       头
      * @param mapMatchData 数据
      */
-    void onoObuObuMapMath(MessagePad.Header header, ObuScene.MapMatchData mapMatchData);
+    void onObuMapMath(MessagePad.Header header, ObuScene.MapMatchData mapMatchData);
 
     /**
      * 重构后的功能状态
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ObuWarningDataMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ObuWarningDataMessage.java
index e07f3d0f2e..a836e22487 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ObuWarningDataMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ObuWarningDataMessage.java
@@ -1,15 +1,19 @@
 package com.zhidao.support.adas.high.msg;
 
 import android.os.SystemClock;
-import android.util.Log;
 
 import com.google.protobuf.InvalidProtocolBufferException;
 import com.google.protobuf.UnknownFieldSet;
+import com.mogo.support.obu.ObuBase;
+import com.mogo.support.obu.ObuPenetrate;
+import com.mogo.support.obu.ObuScene;
 import com.zhidao.support.adas.high.AdasChannel;
 import com.zhidao.support.adas.high.OnAdasListener;
 import com.zhidao.support.adas.high.common.CupidLogUtils;
 import com.zhidao.support.adas.high.protocol.RawData;
 
+import java.util.List;
+
 import mogo.v2x.ObuWarningEvent;
 
 
@@ -20,39 +24,358 @@ public class ObuWarningDataMessage extends MyAbstractMessageHandler {
 
     @Override
     public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
-        ObuWarningEvent.ObuWarningData obuWarningData = ObuWarningEvent.ObuWarningData.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
-        AdasChannel.calculateTimeConsumingOnDispatchRaw("OBU预警事件", raw.receiveTime);
-        long nowTime = 0;
-        if (CupidLogUtils.isEnableLog())
-            nowTime = SystemClock.elapsedRealtime();
-        if (adasListener != null) {
-            adasListener.onObuWarningData(raw.getHeader(), obuWarningData);
-        }
-        AdasChannel.calculateTimeConsumingBusiness("OBU预警事件", nowTime);
-
-
-
-//        ObuPenetrate.WarningData warningData = ObuPenetrate.WarningData.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
-//        UnknownFieldSet set = warningData.getMapMatchData().getUnknownFields();
-//
-//        Log.i("ddd", "set.getField(7).getVarintList()=" + set.getField(7).getVarintList());
-//        Long a = set.getField(7).getVarintList().get(0);
-//
-//        ObuScene.MapMatchData.Builder MapMatchDataBuilder = warningData.getMapMatchData().toBuilder().setSpeedMinLimit(a * 0.02D);
-//        MapMatchDataBuilder.setUnknownFields(UnknownFieldSet.getDefaultInstance());
-//        ObuPenetrate.WarningData.Builder builder = warningData.toBuilder();
-//        builder.setMapMatchData(MapMatchDataBuilder);
-//        warningData = builder.build();
-////        Log.i("ddd","a="+a);
-//
-//
+//        ObuWarningEvent.ObuWarningData obuWarningData = ObuWarningEvent.ObuWarningData.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
 //        AdasChannel.calculateTimeConsumingOnDispatchRaw("OBU预警事件", raw.receiveTime);
 //        long nowTime = 0;
 //        if (CupidLogUtils.isEnableLog())
 //            nowTime = SystemClock.elapsedRealtime();
 //        if (adasListener != null) {
-//            adasListener.onObuWarningData(raw.getHeader(), warningData);
+//            adasListener.onObuWarningData(raw.getHeader(), obuWarningData);
 //        }
 //        AdasChannel.calculateTimeConsumingBusiness("OBU预警事件", nowTime);
+
+        ObuPenetrate.PenetrateWarningData warningData = ObuPenetrate.PenetrateWarningData.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
+        AdasChannel.calculateTimeConsumingOnDispatchRaw("OBU预警事件", raw.receiveTime);
+        long nowTime = 0;
+        if (CupidLogUtils.isEnableLog())
+            nowTime = SystemClock.elapsedRealtime();
+        if (adasListener != null) {
+            if (warningData.getMsgDataType() == 1) {//rsiEvent
+                if (warningData.hasRsiEvent()) {
+                    ObuScene.RsiWarningData rsiWarningData = warningData.getRsiEvent();
+                    ObuScene.RsiWarningData.Builder rsiWarningDataBuilder = rsiWarningData.toBuilder();
+                    int size = rsiWarningData.getWarningMsgCount();
+                    for (int i = 0; i < size; i++) {
+                        ObuBase.RsiWarning warning = rsiWarningData.getWarningMsg(i);
+                        ObuBase.RsiWarning.Builder warningBuilder = warning.toBuilder();
+                        if (warning.hasPosition()) {
+                            ObuBase.PositionLLV positionLLV = warning.getPosition();
+                            ObuBase.PositionLLV.Builder positionLLVBuilder = positionLLV.toBuilder();
+                            if (positionLLV.hasPosition()) {
+                                ObuBase.PositionOffset positionOffset = positionLLV.getPosition();
+                                ObuBase.PositionOffset.Builder positionOffsetBuilder = positionOffset.toBuilder();
+                                if (positionOffset.hasPositionLL1()) {
+                                    ObuBase.PositionLL1 positionLL1 = positionOffset.getPositionLL1();
+                                    ObuBase.PositionLL1.Builder positionLL1Builder = positionLL1.toBuilder();
+                                    UnknownFieldSet set = positionLL1.getUnknownFields();
+                                    UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                                    double value = getVarint(set, unknownFieldSetBuilder, 1, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL1Builder.setLongitude(value);
+                                    }
+                                    value = getVarint(set, unknownFieldSetBuilder, 2, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL1Builder.setLatitude(value);
+                                    }
+                                    positionLL1Builder.setUnknownFields(unknownFieldSetBuilder.build());
+                                    positionOffsetBuilder.setPositionLL1(positionLL1Builder);
+                                    positionLLVBuilder.setPosition(positionOffsetBuilder);
+                                }
+                                if (positionOffset.hasPositionLL2()) {
+                                    ObuBase.PositionLL2 positionLL2 = positionOffset.getPositionLL2();
+                                    ObuBase.PositionLL2.Builder positionLL2Builder = positionLL2.toBuilder();
+                                    UnknownFieldSet set = positionLL2.getUnknownFields();
+                                    UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                                    double value = getVarint(set, unknownFieldSetBuilder, 1, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL2Builder.setLongitude(value);
+                                    }
+                                    value = getVarint(set, unknownFieldSetBuilder, 2, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL2Builder.setLatitude(value);
+                                    }
+                                    positionLL2Builder.setUnknownFields(unknownFieldSetBuilder.build());
+                                    positionOffsetBuilder.setPositionLL2(positionLL2Builder);
+                                    positionLLVBuilder.setPosition(positionOffsetBuilder);
+                                }
+                                if (positionOffset.hasPositionLL3()) {
+                                    ObuBase.PositionLL3 positionLL3 = positionOffset.getPositionLL3();
+                                    ObuBase.PositionLL3.Builder positionLL3Builder = positionLL3.toBuilder();
+                                    UnknownFieldSet set = positionLL3.getUnknownFields();
+                                    UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                                    double value = getVarint(set, unknownFieldSetBuilder, 1, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL3Builder.setLongitude(value);
+                                    }
+                                    value = getVarint(set, unknownFieldSetBuilder, 2, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL3Builder.setLatitude(value);
+                                    }
+                                    positionLL3Builder.setUnknownFields(unknownFieldSetBuilder.build());
+                                    positionOffsetBuilder.setPositionLL3(positionLL3Builder);
+                                    positionLLVBuilder.setPosition(positionOffsetBuilder);
+                                }
+                                if (positionOffset.hasPositionLL4()) {
+                                    ObuBase.PositionLL4 positionLL4 = positionOffset.getPositionLL4();
+                                    ObuBase.PositionLL4.Builder positionLL4Builder = positionLL4.toBuilder();
+                                    UnknownFieldSet set = positionLL4.getUnknownFields();
+                                    UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                                    double value = getVarint(set, unknownFieldSetBuilder, 1, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL4Builder.setLongitude(value);
+                                    }
+                                    value = getVarint(set, unknownFieldSetBuilder, 2, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL4Builder.setLatitude(value);
+                                    }
+                                    positionLL4Builder.setUnknownFields(unknownFieldSetBuilder.build());
+                                    positionOffsetBuilder.setPositionLL4(positionLL4Builder);
+                                    positionLLVBuilder.setPosition(positionOffsetBuilder);
+                                }
+                                if (positionOffset.hasPositionLL5()) {
+                                    ObuBase.PositionLL5 positionLL5 = positionOffset.getPositionLL5();
+                                    ObuBase.PositionLL5.Builder positionLL5Builder = positionLL5.toBuilder();
+                                    UnknownFieldSet set = positionLL5.getUnknownFields();
+                                    UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                                    double value = getVarint(set, unknownFieldSetBuilder, 1, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL5Builder.setLongitude(value);
+                                    }
+                                    value = getVarint(set, unknownFieldSetBuilder, 2, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL5Builder.setLatitude(value);
+                                    }
+                                    positionLL5Builder.setUnknownFields(unknownFieldSetBuilder.build());
+                                    positionOffsetBuilder.setPositionLL5(positionLL5Builder);
+                                    positionLLVBuilder.setPosition(positionOffsetBuilder);
+                                }
+                                if (positionOffset.hasPositionLL6()) {
+                                    ObuBase.PositionLL6 positionLL6 = positionOffset.getPositionLL6();
+                                    ObuBase.PositionLL6.Builder positionLL6Builder = positionLL6.toBuilder();
+                                    UnknownFieldSet set = positionLL6.getUnknownFields();
+                                    UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                                    double value = getVarint(set, unknownFieldSetBuilder, 1, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL6Builder.setLongitude(value);
+                                    }
+                                    value = getVarint(set, unknownFieldSetBuilder, 2, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLL6Builder.setLatitude(value);
+                                    }
+                                    positionLL6Builder.setUnknownFields(unknownFieldSetBuilder.build());
+                                    positionOffsetBuilder.setPositionLL6(positionLL6Builder);
+                                    positionLLVBuilder.setPosition(positionOffsetBuilder);
+                                }
+                                if (positionOffset.hasPositionLatLon()) {
+                                    ObuBase.PositionLatLon positionLatLon = positionOffset.getPositionLatLon();
+                                    ObuBase.PositionLatLon.Builder positionLatLonBuilder = positionLatLon.toBuilder();
+                                    UnknownFieldSet set = positionLatLon.getUnknownFields();
+                                    UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                                    double value = getVarint(set, unknownFieldSetBuilder, 1, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLatLonBuilder.setLongitude(value);
+                                    }
+                                    value = getVarint(set, unknownFieldSetBuilder, 2, 10000000.0D);
+                                    if (value != Double.MIN_VALUE) {
+                                        positionLatLonBuilder.setLatitude(value);
+                                    }
+                                    positionLatLonBuilder.setUnknownFields(unknownFieldSetBuilder.build());
+                                    positionOffsetBuilder.setPositionLatLon(positionLatLonBuilder);
+                                    positionLLVBuilder.setPosition(positionOffsetBuilder);
+                                }
+                            }
+                            if (positionLLV.hasVertical()) {
+                                ObuBase.VerticalLLV verticalLLV = positionLLV.getVertical();
+                                ObuBase.VerticalLLV.Builder verticalLLVBuilder = verticalLLV.toBuilder();
+                                UnknownFieldSet set = verticalLLV.getUnknownFields();
+                                UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                                double value = getVarint(set, unknownFieldSetBuilder, 1, 10.0D);
+                                if (value != Double.MIN_VALUE) {
+                                    verticalLLVBuilder.setOffset1(value);
+                                }
+                                value = getVarint(set, unknownFieldSetBuilder, 2, 10.0D);
+                                if (value != Double.MIN_VALUE) {
+                                    verticalLLVBuilder.setOffset2(value);
+                                }
+                                value = getVarint(set, unknownFieldSetBuilder, 3, 10.0D);
+                                if (value != Double.MIN_VALUE) {
+                                    verticalLLVBuilder.setOffset3(value);
+                                }
+                                value = getVarint(set, unknownFieldSetBuilder, 4, 10.0D);
+                                if (value != Double.MIN_VALUE) {
+                                    verticalLLVBuilder.setOffset4(value);
+                                }
+                                value = getVarint(set, unknownFieldSetBuilder, 5, 10.0D);
+                                if (value != Double.MIN_VALUE) {
+                                    verticalLLVBuilder.setOffset5(value);
+                                }
+                                value = getVarint(set, unknownFieldSetBuilder, 6, 10.0D);
+                                if (value != Double.MIN_VALUE) {
+                                    verticalLLVBuilder.setOffset6(value);
+                                }
+                                value = getVarint(set, unknownFieldSetBuilder, 7, 10.0D);
+                                if (value != Double.MIN_VALUE) {
+                                    verticalLLVBuilder.setElevation(value);
+                                }
+                                verticalLLVBuilder.setUnknownFields(unknownFieldSetBuilder.build());
+                                positionLLVBuilder.setVertical(verticalLLVBuilder);
+                            }
+
+                            warningBuilder.setPosition(positionLLVBuilder);
+                        }
+                        UnknownFieldSet set = warning.getUnknownFields();
+                        UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                        double value = getVarint(set, unknownFieldSetBuilder, 6, 50.0D);
+                        if (value != Double.MIN_VALUE) {
+                            warningBuilder.setSpeedMaxLimit(value);
+                        }
+                        value = getVarint(set, unknownFieldSetBuilder, 7, 50.0D);
+                        if (value != Double.MIN_VALUE) {
+                            warningBuilder.setSpeedMinLimit(value);
+                        }
+                        value = getVarint(set, unknownFieldSetBuilder, 8, 10.0D);
+                        if (value != Double.MIN_VALUE) {
+                            warningBuilder.setEventRadius(value);
+                        }
+                        value = getVarint(set, unknownFieldSetBuilder, 11, 100.0D);
+                        if (value != Double.MIN_VALUE) {
+                            warningBuilder.setDistance(value);
+                        }
+                        warningBuilder.setUnknownFields(unknownFieldSetBuilder.build());
+                        rsiWarningDataBuilder.setWarningMsg(i, warningBuilder);
+                    }
+                    rsiWarningData = rsiWarningDataBuilder.build();
+                    adasListener.onObuRsiWarning(raw.getHeader(), rsiWarningData);
+                }
+            } else if (warningData.getMsgDataType() == 2) {//rsmEvent
+                if (warningData.hasRsmEvent()) {
+                    ObuScene.RsmWarningData rsmWarningData = warningData.getRsmEvent();
+                    ObuScene.RsmWarningData.Builder rsmWarningDataBuilder = rsmWarningData.toBuilder();
+                    if (rsmWarningData.hasParticipant()) {
+                        ObuBase.Participant participant = rsmWarningData.getParticipant();
+                        ObuBase.Participant.Builder participantBuilder = participant.toBuilder();
+                        UnknownFieldSet set = participant.getUnknownFields();
+                        UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                        double value = getVarint(set, unknownFieldSetBuilder, 5, 10000000.0D);
+                        if (value != Double.MIN_VALUE) {
+                            participantBuilder.setLatitude(value);
+                        }
+                        value = getVarint(set, unknownFieldSetBuilder, 6, 10000000.0D);
+                        if (value != Double.MIN_VALUE) {
+                            participantBuilder.setLongitude(value);
+                        }
+                        value = getVarint(set, unknownFieldSetBuilder, 7, 10.0D);
+                        if (value != Double.MIN_VALUE) {
+                            participantBuilder.setElevation(value);
+                        }
+                        value = getVarint(set, unknownFieldSetBuilder, 8, 50.0D);
+                        if (value != Double.MIN_VALUE) {
+                            participantBuilder.setSpeed(value);
+                        }
+                        value = getVarint(set, unknownFieldSetBuilder, 9, 80.0D);
+                        if (value != Double.MIN_VALUE) {
+                            participantBuilder.setHeading(value);
+                        }
+                        participantBuilder.setUnknownFields(unknownFieldSetBuilder.build());
+                        if (participant.hasAccFourAxes()) {
+                            ObuBase.AccFourAxes accFourAxes = participant.getAccFourAxes();
+                            ObuBase.AccFourAxes.Builder accFourAxesBuilder = accFourAxes.toBuilder();
+                            UnknownFieldSet accFourAxesSet = accFourAxes.getUnknownFields();
+                            UnknownFieldSet.Builder accFourAxesSetBuilder = accFourAxesSet.toBuilder();
+                            value = getVarint(accFourAxesSet, accFourAxesSetBuilder, 1, 100.0D);
+                            if (value != Double.MIN_VALUE) {
+                                accFourAxesBuilder.setAccLng(value);
+                            }
+                            value = getVarint(accFourAxesSet, accFourAxesSetBuilder, 2, 100.0D);
+                            if (value != Double.MIN_VALUE) {
+                                accFourAxesBuilder.setAccLat(value);
+                            }
+                            value = getVarint(accFourAxesSet, accFourAxesSetBuilder, 3, 50.0D);
+                            if (value != Double.MIN_VALUE) {
+                                accFourAxesBuilder.setAccVert(value);
+                            }
+                            value = getVarint(accFourAxesSet, accFourAxesSetBuilder, 4, 100.0D);
+                            if (value != Double.MIN_VALUE) {
+                                accFourAxesBuilder.setAccYaw(value);
+                            }
+                            accFourAxesBuilder.setUnknownFields(accFourAxesSetBuilder.build());
+                            participantBuilder.setAccFourAxes(accFourAxesBuilder);
+                        }
+                        if (participant.hasPtcSize()) {
+                            ObuBase.VehicleSize vehicleSize = participant.getPtcSize();
+                            ObuBase.VehicleSize.Builder vehicleSizeBuilder = vehicleSize.toBuilder();
+                            vehicleSizeBuilder.setHeight(vehicleSize.getHeight() * 5);
+                            participantBuilder.setPtcSize(vehicleSizeBuilder);
+                        }
+                        rsmWarningDataBuilder.setParticipant(participantBuilder);
+                    }
+                    if (rsmWarningData.hasWarningMsg()) {
+                        ObuBase.V2xWarning warning = rsmWarningData.getWarningMsg();
+                        ObuBase.V2xWarning.Builder warningBuilder = warning.toBuilder();
+                        UnknownFieldSet warningSet = warning.getUnknownFields();
+                        UnknownFieldSet.Builder warningSetBuilder = warningSet.toBuilder();
+                        double value = getVarint(warningSet, warningSetBuilder, 4, 100.0D);
+                        if (value != Double.MIN_VALUE) {
+                            warningBuilder.setDistance(value);
+                        }
+                        warningBuilder.setUnknownFields(warningSetBuilder.build());
+                        rsmWarningDataBuilder.setWarningMsg(warningBuilder);
+                    }
+                    rsmWarningData = rsmWarningDataBuilder.build();
+                    adasListener.onObuRsmWarning(raw.getHeader(), rsmWarningData);
+                }
+            } else if (warningData.getMsgDataType() == 3) {//spatEvent
+                if (warningData.hasSpatEvent()) {
+                    ObuScene.SpatWarningData spatWarningData = warningData.getSpatEvent();
+                    ObuScene.SpatWarningData.Builder spatWarningDataBuilder = spatWarningData.toBuilder();
+                    int size = spatWarningData.getLightsCount();
+                    for (int i = 0; i < size; i++) {
+                        ObuBase.SpatLight spatLight = spatWarningData.getLights(i);
+                        ObuBase.SpatLight.Builder spatLightBuilder = spatLight.toBuilder();
+                        UnknownFieldSet set = spatLight.getUnknownFields();
+                        UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                        double value = getVarint(set, unknownFieldSetBuilder, 4, 10.0D);
+                        if (value != Double.MIN_VALUE) {
+                            spatLightBuilder.setCountDown(value);
+                        }
+                        value = getVarint(set, unknownFieldSetBuilder, 5, 50.0D);
+                        if (value != Double.MIN_VALUE) {
+                            spatLightBuilder.setSuggestMaxSpeed(value);
+                        }
+                        value = getVarint(set, unknownFieldSetBuilder, 6, 50.0D);
+                        if (value != Double.MIN_VALUE) {
+                            spatLightBuilder.setSuggestMinSpeed(value);
+                        }
+                        spatLightBuilder.setUnknownFields(unknownFieldSetBuilder.build());
+                        spatWarningDataBuilder.setLights(i, spatLightBuilder);
+                    }
+                    spatWarningData = spatWarningDataBuilder.build();
+                    adasListener.onObuSpatWarning(raw.getHeader(), spatWarningData);
+                }
+            } else if (warningData.getMsgDataType() == 4) {//mapMatchData
+                if (warningData.hasMapMatchData()) {
+                    ObuScene.MapMatchData mapMatchData = warningData.getMapMatchData();
+                    ObuScene.MapMatchData.Builder mapMatchDataBuilder = mapMatchData.toBuilder();
+                    UnknownFieldSet set = mapMatchData.getUnknownFields();
+                    UnknownFieldSet.Builder unknownFieldSetBuilder = set.toBuilder();
+                    double value = getVarint(set, unknownFieldSetBuilder, 6, 50.0D);
+                    if (value != Double.MIN_VALUE) {
+                        mapMatchDataBuilder.setSpeedMaxLimit(value);
+                    }
+                    value = getVarint(set, unknownFieldSetBuilder, 7, 50.0D);
+                    if (value != Double.MIN_VALUE) {
+                        mapMatchDataBuilder.setSpeedMinLimit(value);
+                    }
+                    mapMatchDataBuilder.setUnknownFields(unknownFieldSetBuilder.build());
+                    mapMatchData = mapMatchDataBuilder.build();
+                    adasListener.onObuMapMath(raw.getHeader(), mapMatchData);
+                }
+            }
+        }
+        AdasChannel.calculateTimeConsumingBusiness("OBU预警事件", nowTime);
+    }
+
+    private double getVarint(final UnknownFieldSet set, final UnknownFieldSet.Builder builder, final int number, final double precision) {
+        if (set.hasField(number)) {
+            List list = set.getField(number).getVarintList();
+            if (list != null && !list.isEmpty()) {
+                Long value = list.get(0);
+                if (value != null) {
+                    builder.clearField(number);
+                    return value / precision;
+                }
+            }
+        }
+        return Double.MIN_VALUE;
     }
 }
diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java
index 72aa1774bb..07ba7245d8 100644
--- a/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java
+++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/IMogoMap.java
@@ -1,5 +1,6 @@
 package com.mogo.map;
 
+import com.mogo.eagle.core.data.map.MogoLatLng;
 import com.mogo.map.center.CenterLine;
 import com.mogo.map.marker.IMogoMarker;
 import com.mogo.map.marker.MogoMarkerOptions;
@@ -12,6 +13,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 
 import mogo.telematics.pad.MessagePad;
+import mogo.yycp.api.proto.SocketDownData;
 
 /**
  * @author congtaowang
@@ -51,6 +53,13 @@ public interface IMogoMap {
      */
     void updateBatchMarkerPosition(HashMap optionsArrayList);
 
+    /**
+     * 批量更新锚点位置
+     *
+     * @param optionsArrayList 锚点集合
+     */
+    void updateBatchAiMarkerPosition(HashMap optionsArrayList);
+
     /**
      * 添加感知使用到的3d模型
      *
diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarkerManager.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarkerManager.java
index 626bfd6b4f..8e7e2db59f 100644
--- a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarkerManager.java
+++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarkerManager.java
@@ -10,6 +10,7 @@ import java.util.List;
 import java.util.Map;
 
 import mogo.telematics.pad.MessagePad;
+import mogo.yycp.api.proto.SocketDownData;
 
 /**
  * @author congtaowang
@@ -44,6 +45,13 @@ public interface IMogoMarkerManager {
      */
     void updateBatchMarkerPosition(HashMap optionsArrayList);
 
+    /**
+     * 批量更新锚点位置
+     *
+     * @param optionsArrayList 锚点集合
+     */
+    void updateBatchAiMarkerPosition(HashMap optionsArrayList);
+
     /**
      * 添加感知使用到的3d模型
      *
diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java
index 919fe0f9d7..362b48f839 100644
--- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java
+++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java
@@ -13,6 +13,7 @@ import com.mogo.eagle.core.data.map.MogoLocation;
 
 import java.util.List;
 
+
 /**
  * @author congtaowang
  * @since 2019-12-26
@@ -48,6 +49,17 @@ public interface IMogoMapUIController {
      */
     void changeMapVisualAngle(VisualAngleMode angelMode, MogoLatLng mogoLatLng);
 
+    /**
+     * 设置漫游路径
+     * @param trajectory
+     */
+    void setRoamTrajectory(String trajectory);
+
+    /**
+     * 设置漫游模式 , 0:自由漫游,1:路径漫游
+     */
+    void setRomaMode(int mode);
+
     /**
      * 获得当前地图视距模式
      *
diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/VisualAngleMode.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/VisualAngleMode.java
index 61d453ed1d..1b3748d975 100644
--- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/VisualAngleMode.java
+++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/VisualAngleMode.java
@@ -35,7 +35,12 @@ public enum VisualAngleMode implements IMogoMapVisualAngle {
     /**
      * 十字路口视角
      */
-    MAP_STYLE_VR_ANGLE_CROSS(5);
+    MAP_STYLE_VR_ANGLE_CROSS(5),
+
+    /**
+     * 漫游模式
+     */
+    MAP_STYLE_VR_ROMA(7);
 
 
     private final int code;
@@ -62,4 +67,8 @@ public enum VisualAngleMode implements IMogoMapVisualAngle {
     public boolean isMediumSight() {
         return code == MODE_MEDIUM_SIGHT.getCode();
     }
+
+    public boolean isRoma(){
+        return code == MAP_STYLE_VR_ROMA.getCode();
+    }
 }
diff --git a/libraries/mogo-map/build.gradle b/libraries/mogo-map/build.gradle
index d3adcc32cb..fb7c7dbfa8 100644
--- a/libraries/mogo-map/build.gradle
+++ b/libraries/mogo-map/build.gradle
@@ -63,8 +63,6 @@ dependencies {
         implementation project(':core:mogo-core-utils')
         implementation project(':libraries:mogo-map-api')
         implementation project(':foudations:mogo-commons')
-
-        implementation project(':core:mogo-core-data')
         implementation project(':core:mogo-core-function-call') //todo 解除依赖
     }
 }
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 77df0450d2..8c003a0a5f 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
@@ -8,6 +8,7 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_MAP
 import static com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_300;
 import static com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_CROSS;
 import static com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ANGLE_TOP;
+import static com.mogo.map.uicontroller.VisualAngleMode.MAP_STYLE_VR_ROMA;
 import static com.mogo.map.uicontroller.VisualAngleMode.MODE_CLOSE_SIGHT;
 import static com.mogo.map.uicontroller.VisualAngleMode.MODE_LONG_SIGHT;
 import static com.mogo.map.uicontroller.VisualAngleMode.MODE_MEDIUM_SIGHT;
@@ -83,6 +84,7 @@ import org.jetbrains.annotations.Nullable;
 import java.util.ArrayList;
 import java.util.List;
 
+
 public class AMapViewWrapper implements IMogoMapView,
         IMogoMapUIController,
         OnMapLoadedListener,
@@ -189,10 +191,10 @@ public class AMapViewWrapper implements IMogoMapView,
     public void onRoadIdInfo(@androidx.annotation.Nullable String roadId) {
 
         if (roadId != null && !TextUtils.isEmpty(roadId)) {
-            CallerLogger.INSTANCE.d(M_MAP + TAG, "onRoadIdInfo::" + roadId);
+           // CallerLogger.INSTANCE.d(M_MAP + TAG, "onRoadIdInfo::" + roadId);
             CallerMapRoadListenerManager.INSTANCE.invokeListenersOnRoadIdGet(roadId);
         } else {
-            CallerLogger.INSTANCE.d(M_MAP + TAG, "onRoadIdInfo::null");
+            //CallerLogger.INSTANCE.d(M_MAP + TAG, "onRoadIdInfo::null");
         }
     }
 
@@ -210,27 +212,27 @@ public class AMapViewWrapper implements IMogoMapView,
                  *         }
                  */
                 String provider = carLoc.getProvider();
-                CallerLogger.INSTANCE.d(M_MAP + TAG, "car_loc: " + carLoc + "");
+                //CallerLogger.INSTANCE.d(M_MAP + TAG, "car_loc: " + carLoc + "");
                 if (!MapAutoApi.GPS_FLAG.equals(provider)) {
-                    CallerLogger.INSTANCE.d(M_MAP + TAG, "convert before: car_loc: {lon: " + carLoc.getLongitude() + ", lat: " + carLoc.getLatitude() + "}");
+                    //CallerLogger.INSTANCE.d(M_MAP + TAG, "convert before: car_loc: {lon: " + carLoc.getLongitude() + ", lat: " + carLoc.getLatitude() + "}");
                     LonLatPoint p = new LonLatPoint(carLoc.getLongitude(), carLoc.getLatitude());
                     p = MapTools.INSTANCE.switchLonLatWGS84(p);
                     carLoc.setLongitude(p.longitude);
                     carLoc.setLatitude(p.latitude);
-                    CallerLogger.INSTANCE.d(M_MAP + TAG, "convert after: car_loc: {lon: " + carLoc.getLongitude() + ", lat: " + carLoc.getLatitude() + "}");
+                    //CallerLogger.INSTANCE.d(M_MAP + TAG, "convert after: car_loc: {lon: " + carLoc.getLongitude() + ", lat: " + carLoc.getLatitude() + "}");
                 }
-                CallerLogger.INSTANCE.d(M_MAP + TAG, "onStopLineInfo:stop_line" + stopLine + ", car_loc:{lon: " + carLoc.getLatitude() + ", lat: " + carLoc.getLongitude() + "}");
+                //CallerLogger.INSTANCE.d(M_MAP + TAG, "onStopLineInfo:stop_line" + stopLine + ", car_loc:{lon: " + carLoc.getLatitude() + ", lat: " + carLoc.getLongitude() + "}");
                 MapRoadInfo.StopLine stopInfo = convert(stopLine);
                 LonLatPoint p1 = points.get(0);
                 LonLatPoint p2 = points.get(points.size() - 1);
                 double distanceOfCarToStopLine = MapDataApi.INSTANCE.getNearstFromPointToSegment(carLoc.getLongitude(), carLoc.getLatitude(), p1.longitude, p1.latitude, p2.longitude, p2.latitude) * 10_0000;
                 stopInfo.setDistanceOfCarToStopLine(distanceOfCarToStopLine);
-                CallerLogger.INSTANCE.d(M_MAP + TAG, "onStopLineInfo: --- distance: " + distanceOfCarToStopLine);
+                //CallerLogger.INSTANCE.d(M_MAP + TAG, "onStopLineInfo: --- distance: " + distanceOfCarToStopLine);
                 CallerMapRoadListenerManager.INSTANCE.invokeListenersOnStopLineGet(stopInfo);
             }
         } else {
             if (carLoc != null) {
-                CallerLogger.INSTANCE.d(M_MAP + TAG, "onStopLineInfo::null, car_loc:{lon: " + carLoc.getLatitude() + ", lat: " + carLoc.getLongitude() + "}");
+                //CallerLogger.INSTANCE.d(M_MAP + TAG, "onStopLineInfo::null, car_loc:{lon: " + carLoc.getLatitude() + ", lat: " + carLoc.getLongitude() + "}");
             }
         }
     }
@@ -362,6 +364,16 @@ public class AMapViewWrapper implements IMogoMapView,
         }
     }
 
+    @Override
+    public void setRoamTrajectory(String trajectory) {
+        mMapView.getMapAutoViewHelper().setRoamTrajectory(ROMA_ROAD);
+    }
+
+    @Override
+    public void setRomaMode(int mode) {
+        mMapView.getMapAutoViewHelper().setRoamStyle(mode,1800, MapAutoApi.ROAM_SPEED_40);
+    }
+
     @Override
     public VisualAngleMode getCurrentMapVisualAngle() {
         return mVisualAngleMode;
@@ -384,7 +396,7 @@ public class AMapViewWrapper implements IMogoMapView,
     public void moveToCenter(MogoLatLng latLng, boolean animate) {
         CallerLogger.INSTANCE.d(M_MAP + TAG, "move to center " + latLng);
         if (latLng == null || latLng.lat == 0.0d || latLng.lon == 0.0d) {
-            CallerLogger.INSTANCE.e(M_MAP + TAG, "latlng = null or is illegal");
+            CallerLogger.INSTANCE.e(M_MAP + TAG, "latLng = null or is illegal");
             return;
         }
         if (DebugConfig.isDebug()) {
@@ -727,13 +739,19 @@ public class AMapViewWrapper implements IMogoMapView,
             initMapView();
             initMyLocation();
             loadPreVehicleModel();
-
-            if (mMapView.getLocationClient() != null) {
-                mMapView.getLocationClient().setIsUseExtraGPSData(true);
-            }
+            loadRomaRoad(); //todo for show of hengyang
         }
     }
 
+    private static final String ROMA_ROAD = "112.577698,26.82026482,112.5776649,26.82024463,112.5776315,26.82022433,112.5775976,26.82020375,112.5775631,26.8201828,112.5775278,26.8201614,112.5774918,26.82013967,112.5774553,26.82011768,112.5774184,26.82009541,112.5773801,26.82007238,112.577343,26.82005009,112.5773046,26.82002699,112.5772689,26.82000566,112.5772343,26.81998499,112.5771981,26.8199634,112.5771604,26.81994093,112.5771241,26.81991927,112.5770863,26.81989686,112.577048,26.81987432,112.5770092,26.81985169,112.5769702,26.81982908,112.5769311,26.8198067,112.5768912,26.81978399,112.5768525,26.81976202,112.5768148,26.81974082,112.5767765,26.81971934,112.5767375,26.8196976,112.5767005,26.81967709,112.5766627,26.81965632,112.5766243,26.8196354,112.5765873,26.81961534,112.5765514,26.81959614,112.5765094,26.81957391,112.5764739,26.81955537,112.5764377,26.81953663,112.5763962,26.8195154,112.5763611,26.81949759,112.5763253,26.81947942,112.5762886,26.81946081,112.5762538,26.81944299,112.5762181,26.81942459,112.5761771,26.81940327,112.5761425,26.81938516,112.5761026,26.81936424,112.5760665,26.81934525,112.5760283,26.81932496,112.5759929,26.81930612,112.5759553,26.81928594,112.5759164,26.819265,112.5758797,26.81924523,112.5758431,26.81922557,112.5758043,26.81920481,112.5757701,26.81918656,112.5757372,26.81916931,112.575705,26.81915323,112.5756723,26.8191394,112.5756388,26.81913008,112.5756042,26.81912741,112.5755689,26.81913241,112.5755345,26.81914523,112.575501,26.81916323,112.5754702,26.81918345,112.5754414,26.81920591,112.5754142,26.81923028,112.5753873,26.8192577,112.5753624,26.81928628,112.5753385,26.81931747,112.575318,26.81934811,112.5752981,26.81938112,112.575279,26.81941509,112.5752615,26.81944712,112.5752441,26.81947941,112.5752259,26.8195132,112.5752073,26.81954787,112.5751884,26.81958344,112.5751691,26.81961976,112.5751494,26.81965723,112.57513,26.81969415,112.575111,26.81973053,112.5750914,26.81976802,112.5750718,26.81980571,112.5750521,26.81984347,112.5750319,26.81988209,112.5750139,26.81991636,112.5749962,26.81995017,112.5749754,26.81998984,112.5749573,26.82002443,112.5749386,26.8200601,112.5749197,26.82009614,112.5749008,26.82013245,112.5748813,26.82016981,112.5748627,26.82020577,112.574843,26.82024356,112.5748242,26.82027988,112.5748048,26.8203173,112.5747853,26.82035503,112.5747657,26.82039302,112.5747457,26.82043198,112.5747264,26.82046932,112.5747067,26.82050756,112.5746869,26.82054576,112.5746677,26.82058291,112.5746479,26.82062126,112.5746291,26.82065783,112.5746089,26.82069715,112.5745902,26.82073333,112.5745732,26.82076629,112.5745548,26.82080203,112.5745377,26.82083496,112.5745212,26.82086682,112.574505,26.82089828,112.5744891,26.82092935,112.574473,26.82096083,112.5744574,26.82099114,112.5744427,26.82102038,112.5744341,26.82105102,112.5744217,26.82108217,112.5744034,26.82111193,112.5743842,26.821142,112.5743648,26.82117413,112.5743472,26.82120453,112.5743279,26.82123795,112.5743097,26.82127083,112.5742903,26.82130636,112.5742724,26.8213397,112.5742548,26.82137277,112.574237,26.8214064,112.5742188,26.82144091,112.5742005,26.82147546,112.5741813,26.82151155,112.5741619,26.8215485,112.5741421,26.82158628,112.574124,26.82162082,112.5741058,26.8216558,112.5740873,26.82169111,112.5740687,26.82172683,112.5740495,26.8217638,112.5740308,26.82179956,112.5740115,26.82183663,112.5739919,26.82187428,112.573972,26.82191258,112.5739519,26.82195149,112.5739332,26.82198747,112.5739153,26.82202211,112.5738944,26.82206251,112.5738756,26.82209882,112.5738567,26.8221355,112.5738378,26.82217255,112.5738182,26.82221085,112.5737995,26.82224751,112.5737803,26.82228527,112.5737607,26.82232415,112.5737419,26.82236124,112.5737225,26.82239931,112.5737029,26.82243731,112.5736827,26.82247603,112.5736634,26.82251246,112.5736438,26.82254928,112.5736243,26.82258572,112.5736043,26.82262308,112.5735852,26.82265864,112.5735657,26.82269511,112.5735457,26.82273244,112.5735268,26.82276772,112.5735077,26.82280347,112.5734861,26.82284394,112.5734658,26.822882,112.5734452,26.82292018,112.5734247,26.82295753,112.5734042,26.82299402,112.5733832,26.82303027,112.5733626,26.82306378,112.5733406,26.82309759,112.573319,26.82312874,112.5732941,26.82316277,112.5732689,26.82319562,112.5732434,26.82322829,112.5732177,26.82326103,112.573125,26.823276,112.5730926,26.82319509,112.5731186,26.82316135,112.5731418,26.82313049,112.5731671,26.82309585,112.5731906,26.82306251,112.5732133,26.82302916,112.5732356,26.82299504,112.5732575,26.82296012,112.5732792,26.8229244,112.5733004,26.82288868,112.5733224,26.82285045,112.5733415,26.82281652,112.5733631,26.82277759,112.5733823,26.82274233,112.5734012,26.8227074,112.5734232,26.82266644,112.5734429,26.82262949,112.5734628,26.82259213,112.5734828,26.82255438,112.573503,26.82251618,112.5735232,26.82247772,112.5735441,26.82243805,112.573564,26.82240019,112.5735849,26.82236028,112.5736054,26.82232125,112.5736254,26.82228313,112.5736465,26.82224299,112.5736666,26.82220471,112.5736877,26.82216437,112.5737079,26.8221259,112.5737285,26.8220863,112.5737493,26.82204643,112.5737701,26.82200633,112.5737916,26.82196499,112.5738122,26.82192543,112.5738339,26.82188365,112.5738547,26.82184377,112.5738767,26.82180167,112.5738956,26.82176558,112.5739167,26.82172515,112.5739391,26.82168239,112.5739605,26.82164148,112.573983,26.8215983,112.5740045,26.82155708,112.5740266,26.82151468,112.5740465,26.8214764,112.5740659,26.8214391,112.5740854,26.82140175,112.574105,26.82136438,112.5741274,26.8213217,112.5741469,26.82128434,112.5741666,26.82124703,112.5741861,26.82120977,112.5742058,26.82117251,112.5742277,26.82113096,112.574248,26.82109253,112.5742678,26.8210551,112.5742876,26.82101759,112.5743103,26.82097465,112.5743301,26.82093699,112.5743495,26.82090037,112.5743727,26.82085623,112.5743926,26.82081862,112.5744124,26.82078108,112.5744321,26.82074358,112.5744518,26.82070609,112.5744715,26.82066866,112.5744938,26.82062594,112.5745133,26.82058863,112.574535,26.82054716,112.5745549,26.82050899,112.5745741,26.82047199,112.5745933,26.82043511,112.5746145,26.82039418,112.574634,26.82035661,112.5746549,26.82031624,112.574676,26.82027535,112.5746968,26.82023518,112.5747177,26.82019483,112.5747373,26.82015724,112.5747573,26.82011956,112.5747776,26.82008238,112.5747981,26.82004564,112.5748193,26.82000863,112.5748421,26.81996979,112.5748629,26.81993507,112.5748842,26.81989978,112.574907,26.81986224,112.5749281,26.81982769,112.5749484,26.81979457,112.5749701,26.8197589,112.5749921,26.81972245,112.5750122,26.81968835,112.5750325,26.81965318,112.5750515,26.81961904,112.5750695,26.81958583,112.5750898,26.81954748,112.5751093,26.81951021,112.5751277,26.81947433,112.5751461,26.81943786,112.5751632,26.8194037,112.5751818,26.81936582,112.575199,26.81933074,112.5752154,26.81929703,112.575232,26.81926305,112.5752475,26.81923084,112.5752623,26.81920053,112.5752764,26.8191712,112.5752904,26.81914362,112.5753061,26.81911433,112.5753237,26.81908528,112.5753441,26.81905648,112.5753677,26.81902905,112.5753944,26.81900493,112.5754244,26.81898445,112.5754583,26.81896707,112.575493,26.81895367,112.5755294,26.81894349,112.575567,26.81893672,112.5756041,26.81893372,112.5756415,26.8189344,112.5756798,26.81893869,112.5757186,26.81894678,112.5757544,26.81895756,112.5757898,26.81897108,112.5758268,26.81898715,112.5758655,26.81900556,112.5759008,26.81902323,112.5759373,26.81904202,112.5759748,26.81906168,112.5760131,26.81908211,112.5760514,26.81910281,112.5760868,26.81912227,112.5761239,26.81914281,112.5761608,26.81916343,112.5761975,26.81918408,112.5762367,26.81920643,112.5762756,26.81922888,112.5763151,26.81925176,112.57635,26.81927208,112.5763891,26.81929497,112.5764295,26.81931871,112.5764661,26.81934025,112.5765068,26.81936437,112.5765425,26.81938563,112.5765836,26.81941011,112.5766186,26.81943106,112.5766557,26.81945345,112.5766919,26.81947536,112.5767284,26.81949747,112.576764,26.81951916,112.5768011,26.81954171,112.5768394,26.81956507,112.5768758,26.81958727,112.5769144,26.81961095,112.5769511,26.81963345,112.576989,26.81965674,112.5770281,26.81968076,112.5770662,26.81970418,112.5771043,26.81972764,112.5771414,26.81975049,112.5771808,26.81977472,112.5772192,26.81979831,112.5772577,26.81982191,112.5772952,26.81984484,112.577335,26.81986907,112.5773736,26.81989259,112.5774123,26.81991606,112.5774498,26.81993877,112.5774882,26.81996205,112.5775276,26.81998588,112.5775644,26.82000825,112.5776031,26.82003178,112.5776393,26.82005387,112.5776772,26.82007712,112.5777137,26.82009957,112.5777488,26.82012121,112.5777907,26.82014706,112.5778261,26.82016891,112.5778652,26.820193,112.577905,26.82021753,112.5779449,26.82024206,112.5779859,26.8202672,112.5780257,26.82029165,112.5780603,26.82031297,112.5780997,26.82033728,112.578138,26.82036083,112.5781768,26.82038473,112.5782161,26.82040883,112.5782537,26.82043183,112.5782895,26.82045365,112.5783251,26.82047532,112.5783596,26.82049637,112.5783979,26.82051971,112.5784329,26.82054099,112.5784705,26.82056384,112.5785066,26.82058588,112.57854,26.82060632,112.5785745,26.82062766,112.5786093,26.82064924,112.5786404,26.82066849,112.5786713,26.82068759,112.5787014,26.82070605,112.5787297,26.82072339,112.5787569,26.82074014,112.5787857,26.8207589,112.5788141,26.82077914,112.5788421,26.82080214,112.5788692,26.8208285,112.578893,26.82085669,112.578913,26.82088621,112.5789302,26.82091859,112.5789438,26.82095338,112.5789539,26.82098972,112.5789601,26.82102729,112.5789619,26.8210634,112.5789595,26.82110054,112.5789525,26.82113842,112.5789405,26.8211768,112.5789249,26.82121207,112.5789047,26.82124716,112.5788828,26.82127905,112.5788587,26.82131182,112.5788364,26.8213422,112.5788121,26.82137567,112.5787872,26.82140995,112.5787614,26.82144538,112.5787355,26.82148084,112.5787084,26.82151799,112.5786832,26.82155261,112.5786581,26.82158701,112.5786326,26.82162203,112.5786075,26.82165672,112.5785815,26.82169273,112.5785547,26.82172993,112.5785284,26.82176648,112.5785021,26.82180326,112.5784763,26.8218394,112.5784498,26.82187675,112.5784225,26.8219154,112.5783962,26.82195248,112.5783691,26.82199081,112.5783411,26.82203039,112.5783137,26.82206924,112.5782862,26.82210834,112.5782587,26.82214764,112.5782353,26.82218122,112.5782077,26.82222088,112.5781836,26.82225567,112.5781588,26.82229152,112.5781347,26.82232641,112.5781077,26.82236534,112.5780829,26.82240132,112.5780587,26.82243632,112.5780345,26.82247136,112.578011,26.82250546,112.5779827,26.82254669,112.5779586,26.82258199,112.5779345,26.82261734,112.5779112,26.82265173,112.5778864,26.82268825,112.577863,26.82272287,112.5778382,26.82275969,112.5778141,26.82279565,112.5777908,26.82283063,112.5777662,26.82286771,112.5777431,26.8229028,112.5777187,26.82294001,112.577695,26.82297621,112.5776713,26.8230124,112.5776476,26.82304855,112.5776247,26.82308364,112.5775972,26.82312593,112.5775744,26.82316101,112.5775477,26.82320226,112.5775237,26.82323937,112.5775004,26.82327543,112.5774737,26.82331663,112.5774504,26.82335271,112.5774237,26.82339398,112.5774004,26.82343015,112.5773771,26.82346637,112.5773538,26.82350264,112.5773311,26.82353795,112.5773045,26.82357962,112.5772805,26.82361727,112.5772579,26.82365292,112.5772305,26.82369605,112.5772038,26.82373828,112.5771804,26.82377537,112.5771576,26.82381151,112.5771335,26.8238499,112.57711,26.82388731,112.5770866,26.82392483,112.5770632,26.82396247,112.5770399,26.82400024,112.5770172,26.82403706,112.5769932,26.8240762,112.5769706,26.82411333,112.5769466,26.82415281,112.5769239,26.82419023,112.5769006,26.8242289,112.5768766,26.82426888,112.5768538,26.82430686,112.5768304,26.82434619,112.5768062,26.82438686,112.5767826,26.82442659,112.576759,26.8244664,112.5767362,26.82450513,112.576712,26.82454613,112.5766887,26.82458599,112.5766654,26.82462584,112.5766429,26.82466453,112.5766198,26.82470431,112.5765961,26.82474519,112.5765731,26.82478489,112.5765508,26.82482342,112.5765272,26.8248642,112.5765044,26.82490376,112.5764823,26.82494211,112.5764597,26.82498158,112.5764365,26.82502214,112.5764141,26.82506156,112.5763923,26.82509987,112.5763694,26.82514046,112.5763479,26.82517884,112.5763253,26.82521944,112.5763041,26.82525765,112.5762819,26.82529789,112.5762605,26.82533679,112.5762399,26.82537422,112.5762184,26.82541343,112.5761953,26.82545571,112.5761739,26.82549472,112.5761508,26.82553699,112.5761295,26.82557604,112.5761059,26.82561945,112.5760853,26.82565746,112.5760653,26.8256944,112.5760443,26.82573355,112.5760238,26.82577161,112.5760035,26.82580955,112.5759834,26.82584724,112.5759607,26.82588994,112.5759383,26.82593221,112.5759161,26.82597406,112.5758938,26.82601648,112.5758733,26.82605542,112.5758519,26.8260963,112.5758305,26.82613716,112.5758087,26.82617896,112.5757879,26.82621856,112.5757669,26.82625897,112.5757456,26.82630002,112.5757251,26.82633968,112.5757048,26.82637922,112.5756853,26.82641773,112.5756651,26.82645798,112.5756464,26.82649596,112.5756275,26.82653452,112.575609,26.82657262,112.5755908,26.82661047,112.5755725,26.82664893,112.575555,26.82668614,112.5755378,26.82672289,112.5755189,26.82676373,112.5755008,26.82680306,112.5754827,26.82684261,112.5754649,26.82688149,112.5754474,26.82691971,112.5754297,26.82695807,112.5754129,26.82699406,112.5753942,26.8270344,112.5753769,26.82707138,112.5753601,26.82710745,112.5753433,26.82714345,112.5753269,26.82717861,112.5753107,26.82721345,112.5752958,26.8272458,112.5752809,26.82727812,112.5752663,26.82730994,112.5752524,26.82734051,112.5752393,26.82736945,112.575226,26.82739794,112.5752118,26.82742821,112.5751971,26.82745922,112.5751817,26.82749174,112.5751666,26.8275242,112.5751515,26.8275565,112.5751352,26.82759177,112.5751203,26.82762466,112.5751043,26.8276599,112.5750881,26.82769574,112.5750729,26.82772944,112.5750574,26.82776339,112.5750421,26.82779694,112.5750261,26.82783198,112.5750105,26.82786635,112.5749952,26.82790045,112.5749799,26.82793441,112.5749647,26.82796847,112.5749503,26.82800031,112.5749367,26.82803037,112.5749241,26.82805848,112.5749101,26.82808862,112.5748948,26.8281212,112.574879,26.82815463,112.5748635,26.82818708,112.5748472,26.8282214,112.5748312,26.82825531,112.574814,26.82829177,112.5747983,26.82832525,112.5747814,26.82836176,112.5747645,26.82839855,112.574748,26.82843472,112.5747317,26.82847055,112.5747144,26.82850911,112.5746971,26.82854794,112.5746795,26.82858784,112.5746636,26.82862412,112.5746474,26.82866127,112.5746311,26.8286993,112.5746145,26.82873817,112.5745982,26.82877687,112.5745814,26.82881732,112.5745645,26.82885843,112.5745476,26.82890018,112.5745304,26.8289424,112.5745128,26.82898606,112.5744961,26.82902786,112.5744789,26.82907101,112.5744616,26.82911452,112.5744436,26.82915967,112.5744281,26.82919867,112.5744125,26.82923804,112.5743967,26.82927771,112.5743813,26.82931649,112.5743654,26.82935656,112.5743471,26.82940243,112.5743307,26.82944378,112.5743129,26.82948851,112.5742967,26.82952975,112.5742814,26.82956861,112.5742631,26.82961532,112.5742459,26.8296596,112.5742301,26.82970036,112.5742151,26.82973993,112.5742002,26.82977939,112.5741854,26.82981876,112.5741692,26.82986254,112.5741527,26.8299073,112.5741363,26.82995202,112.5741217,26.82999225,112.5741054,26.83003703,112.5740891,26.83008201,112.5740748,26.83012154,112.574061,26.8301602,112.5740467,26.83020022,112.5740318,26.83024179,112.5740173,26.83028262,112.5740027,26.83032378,112.5739884,26.83036406,112.5739736,26.83040576,112.5739583,26.83044889,112.5739435,26.83049099,112.5739291,26.83053203,112.5739143,26.83057443,112.5738996,26.83061691,112.573885,26.83065939,112.57387,26.83070302,112.5738554,26.83074539,112.5738409,26.83078771,112.5738269,26.8308288,112.5738121,26.83087228,112.5737977,26.83091457,112.5737834,26.83095689,112.5737692,26.83099924,112.5737555,26.83104042,112.5737416,26.83108282,112.5737276,26.83112527,112.5737134,26.83116903,112.5736999,26.83121044,112.5736861,26.83125311,112.5736724,26.83129583,112.5736587,26.83133862,112.5736452,26.83138146,112.5736317,26.83142437,112.5736183,26.83146737,112.5736045,26.83151168,112.5735913,26.83155482,112.573578,26.83159803,112.5735648,26.83164125,112.5735517,26.83168446,112.573539,26.83172641,112.5735257,26.83177076,112.5735132,26.83181264,112.5735001,26.83185701,112.5734872,26.83190019,112.5734744,26.83194343,112.5734616,26.83198674,112.5734487,26.83203012,112.573436,26.8320736,112.5734232,26.83211711,112.5734109,26.83215929,112.573398,26.83220391,112.5733859,26.832246,112.573373,26.83229048,112.5733606,26.83233362,112.5733483,26.83237662,112.573336,26.83241948,112.5733237,26.83246218,112.5733116,26.83250468,112.5732998,26.83254575,112.5732879,26.83258779,112.5732757,26.83263079,112.5732641,26.8326724,112.5732526,26.83271382,112.5732416,26.83275385,112.5732301,26.83279609,112.573219,26.83283702,112.5732079,26.83287792,112.5731968,26.83291878,112.573186,26.83295848,112.5731747,26.83300056,112.5731637,26.8330415,112.5731527,26.83308249,112.5731421,26.83312245,112.573131,26.83316484,112.5731204,26.8332061,112.5731098,26.83324731,112.5730979,26.83329449,112.5730876,26.83333567,112.5730774,26.83337685,112.5730674,26.83341796,112.5730575,26.83345902,112.5730477,26.83350006,112.5730378,26.83354109,112.5730281,26.833581,112.5730183,26.83362208,112.5730082,26.83366432,112.5729983,26.83370531,112.5729885,26.83374624,112.5729785,26.83378717,112.5729685,26.8338281,112.5729587,26.83386787,112.5729483,26.83391,112.5729369,26.83395684,112.572927,26.83399787,112.5729158,26.83404479,112.5729065,26.83408467,112.5728968,26.83412688,112.5728875,26.83416797,112.5728781,26.83420907,112.5728687,26.83425023,112.5728593,26.83429146,112.5728499,26.83433277,112.5728405,26.83437417,112.5728311,26.83441559,112.5728217,26.83445712,112.5728109,26.83450465,112.5728015,26.83454636,112.5727922,26.83458807,112.572783,26.83462974,112.572774,26.83467145,112.5727651,26.83471318,112.5727564,26.83475493,112.5727478,26.83479672,112.5727393,26.8348385,112.5727311,26.83487906,112.5727225,26.834922,112.5727129,26.83496964,112.5727046,26.83501131,112.5726952,26.83505885,112.5726858,26.83510637,112.5726778,26.83514682,112.5726694,26.83518971,112.5726604,26.83523626,112.572651,26.83528532,112.5726431,26.83532732,112.5726343,26.83537423,112.5726263,26.83541764,112.5726186,26.83545991,112.5726109,26.83550227,112.5726032,26.83554476,112.5725955,26.83558734,112.5725881,26.83562882,112.5725802,26.83567289,112.5725726,26.83571591,112.5725653,26.83575785,112.5725575,26.83580247,112.57255,26.83584605,112.5725425,26.83588981,112.5725352,26.83593248,112.5725275,26.83597781,112.5725202,26.83602077,112.5725125,26.83606641,112.5725052,26.83610966,112.5724976,26.83615563,112.5724904,26.83619918,112.5724828,26.83624548,112.5724754,26.8362907,112.572468,26.83633612,112.5724609,26.83638041,112.5724534,26.8364275,112.5724462,26.83647349,112.5724391,26.83651971,112.5724323,26.83656468,112.5724255,26.83661082,112.5724187,26.83665804,112.5724124,26.83670237,112.5724058,26.83674911,112.5723994,26.83679439,112.5723933,26.8368383,112.5723872,26.83688345,112.5723811,26.83692856,112.572375,26.83697362,112.572369,26.83701871,112.5723627,26.8370651,112.5723568,26.83710893,112.5723507,26.83715406,112.5723446,26.83719921,112.5723385,26.83724439,112.5723325,26.83728967,112.5723264,26.83733635,112.5723206,26.8373818,112.5723149,26.83742737,112.5723092,26.83747304,112.5723036,26.83751881,112.5722983,26.83756338,112.5722929,26.8376094,112.5722875,26.83765684,112.5722823,26.83770308,112.5722773,26.83774945,112.5722725,26.83779601,112.5722678,26.83784277,112.5722633,26.83788973,112.5722588,26.83793682,112.5722543,26.83798399,112.5722497,26.83803128,112.5722451,26.83807868,112.5722402,26.83812616,112.5722352,26.83817373,112.5722301,26.8382214,112.5722251,26.83826772,112.5722199,26.83831666,112.572215,26.83836403,112.5722103,26.83841106,112.5722058,26.83845773,112.5722014,26.83850393,112.5721972,26.83854851,112.5721929,26.83859432,112.5721884,26.83864135,112.572184,26.83868696,112.5721797,26.8387312,112.5721753,26.83877669,112.5721707,26.83882212,112.5721662,26.83886751,112.5721616,26.83891288,112.5721568,26.83895952,112.5721522,26.83900354,112.5721474,26.83905014,112.5721427,26.83909412,112.572138,26.83913936,112.5721333,26.83918457,112.5721286,26.83922975,112.5721238,26.83927622,112.5721192,26.83932139,112.5721145,26.83936654,112.5721098,26.83941167,112.5721051,26.83945547,112.5721002,26.83950183,112.5720954,26.83954687,112.5720907,26.83959058,112.5720858,26.83963502,112.5720807,26.83968067,112.5720758,26.83972506,112.572071,26.83976819,112.5720661,26.83981385,112.5720613,26.83985821,112.5720565,26.83990258,112.5720519,26.83994566,112.5720472,26.83998988,112.5720423,26.84003533,112.5720376,26.84007955,112.5720328,26.84012386,112.5720282,26.840167,112.5720233,26.8402128,112.5720184,26.84025612,112.5720131,26.84030211,112.5720077,26.84034695,112.5720023,26.84039055,112.5719966,26.84043554,112.5719906,26.8404819,112.5719847,26.84052699,112.5719789,26.8405721,112.5719732,26.84061592,112.5719672,26.84066228,112.5719614,26.84070739,112.5719557,26.84075117,112.5719497,26.84079748,112.5719438,26.84084247,112.5719378,26.84088749,112.5719317,26.84093258,112.5719255,26.8409777,112.5719194,26.84102155,112.5719129,26.84106808,112.5719066,26.84111343,112.5719001,26.84115892,112.5718937,26.84120458,112.5718873,26.84124916,112.5718806,26.84129651,112.571874,26.84134262,112.5718675,26.84138874,112.5718608,26.84143489,112.5718543,26.84147982,112.5718473,26.84152753,112.5718406,26.84157434,112.5718338,26.84162116,112.571827,26.84166798,112.5718201,26.84171482,112.5718132,26.84176168,112.5718062,26.84180853,112.571799,26.84185535,112.5717918,26.84190218,112.5717847,26.84194764,112.5717774,26.84199439,112.57177,26.84204102,112.5717624,26.84208882,112.5717551,26.842135,112.571748,26.84218082,112.571741,26.84222489,112.5717337,26.8422711,112.5717265,26.84231576,112.5717193,26.84236021,112.5717122,26.84240319,112.5717047,26.84244857,112.5716978,26.84249013,112.5716902,26.84253673,112.571683,26.84258083,112.5716761,26.8426237,112.5716691,26.84266786,112.5716618,26.84271345,112.5716548,26.84275665,112.5716475,26.84280248,112.5716403,26.8428471,112.571633,26.84289176,112.5716258,26.84293515,112.5716182,26.8429798,112.5716103,26.84302571,112.5716025,26.84307036,112.5715949,26.84311377,112.5715869,26.84315974,112.5715793,26.84320316,112.5715712,26.84324916,112.5715633,26.84329394,112.5715553,26.84333875,112.5715476,26.84338234,112.5715393,26.84342858,112.5715315,26.84347232,112.5715233,26.84351873,112.5715153,26.84356395,112.5715074,26.84360923,112.5714995,26.84365337,112.5714912,26.8437002,112.5714831,26.84374579,112.571475,26.84379143,112.5714669,26.84383711,112.5714587,26.8438828,112.5714505,26.84392853,112.5714423,26.84397429,112.5714343,26.84401877,112.5714258,26.8440659,112.5714176,26.8441118,112.5714093,26.84415776,112.5714009,26.84420378,112.5713925,26.84424984,112.5713842,26.84429593,112.5713758,26.84434205,112.5713676,26.8443869,112.571359,26.8444344,112.5713509,26.8444793,112.5713422,26.84452688,112.5713338,26.84457314,112.5713253,26.84461935,112.571317,26.84466415,112.5713082,26.84471147,112.5712998,26.84475603,112.5712908,26.8448031,112.5712818,26.84484878,112.5712726,26.84489446,112.5712634,26.84493882,112.5712539,26.84498451,112.571244,26.84503151,112.5712344,26.84507722,112.5712247,26.84512285,112.571215,26.84516837,112.5712056,26.84521246,112.5711957,26.84525888,112.5711865,26.84530236,112.5711768,26.84534804,112.5711673,26.84539214,112.5711581,26.84543471,112.5711487,26.84547826,112.571139,26.84552282,112.5711298,26.84556473,112.5711205,26.84560765,112.5711094,26.84565769,112.5711001,26.84569896,112.5710906,26.84574134,112.5710807,26.84578481,112.5710712,26.845827,112.5710616,26.84586907,112.5710521,26.84591106,112.5710431,26.84595172,112.5710323,26.84600064,112.5710232,26.84604221,112.5710128,26.84608957,112.5710037,26.84613087,112.5709946,26.84617214,112.5709854,26.8462134,112.5709763,26.84625465,112.5709672,26.84629582,112.570958,26.84633685,112.5709476,26.84638355,112.5709371,26.84642991,112.5709267,26.84647585,112.5709174,26.84651581,112.5709081,26.8465556,112.5708976,26.84659976,112.5708866,26.84664595,112.5708764,26.84668976,112.5708658,26.84673575,112.5708558,26.8467794,112.5708455,26.84682522,112.570836,26.84686882,112.570826,26.84691518,112.5708163,26.84696026,112.5708066,26.84700418,112.5707964,26.84705038,112.5707865,26.84709444,112.5707758,26.84714031,112.5707649,26.84718482,112.5707539,26.84722957,112.5707432,26.84727344,112.5707332,26.84731397,112.5707221,26.84735914,112.5707124,26.84739878,112.5707014,26.84744421,112.5706908,26.84748863,112.5706798,26.84753517,112.5706693,26.84757924,112.5706585,26.84762413,112.5706477,26.84766855,112.5706365,26.8477134,112.5706258,26.84775556,112.5706145,26.8477995,112.5706039,26.84784073,112.5705931,26.84788232,112.5705824,26.84792412,112.5705709,26.84796921,112.5705607,26.84800877,112.5705505,26.84804796,112.5705404,26.84808688,112.5705302,26.84812575,112.5705201,26.84816464,112.5705102,26.8482027,112.5704998,26.84824295,112.5704882,26.84828748,112.5704779,26.84832742,112.5704675,26.84836772,112.5704572,26.84840838,112.5704468,26.8484494,112.5704366,26.84848975,112.5704257,26.84853252,112.5704151,26.84857458,112.5704046,26.84861591,112.5703934,26.84865968,112.5703825,26.84870272,112.5703715,26.84874608,112.5703607,26.84878861,112.5703493,26.84883365,112.5703381,26.84887792,112.5703271,26.84892137,112.5703159,26.84896625,112.5703043,26.84901253,112.5702932,26.84905668,112.5702818,26.84910205,112.5702699,26.84914862,112.5702583,26.84919407,112.570248,26.84923387,112.5702366,26.84927827,112.5702249,26.84932388,112.5702129,26.84937066,112.5702026,26.84941056,112.570191,26.84945605,112.5701797,26.84950019,112.5701679,26.8495464,112.5701565,26.84959133,112.570145,26.84963618,112.570135,26.84967543,112.5701235,26.84972039,112.5701119,26.84976556,112.5701018,26.84980523,112.5700904,26.8498496,112.5700788,26.84989509,112.5700673,26.84994037,112.5700558,26.84998543,112.5700441,26.85003142,112.5700328,26.85007603,112.5700216,26.85012033,112.5700109,26.85016313,112.5699998,26.85020753,112.5699894,26.85024901,112.5699787,26.85029197,112.5699684,26.85033356,112.5699584,26.85037394,112.5699483,26.85041524,112.5699381,26.85045745,112.5699282,26.85049851,112.5699184,26.85053943,112.5699088,26.8505802,112.5698993,26.85062075,112.5698899,26.85066102,112.5698808,26.85070076,112.5698709,26.8507441,112.5698615,26.85078546,112.5698527,26.85082356,112.5698434,26.85086429,112.5698344,26.85090363,112.5698259,26.85094065,112.5698172,26.85097788,112.5698084,26.85101497,112.5698,26.85105005,112.5697919,26.85108314,112.5697842,26.8511138,112.5697767,26.85114401,112.5697686,26.85117697,112.5697602,26.85121048,112.5697515,26.85124505,112.5697425,26.85128118,112.5697337,26.8513163,112.5697242,26.85135425,112.5697152,26.8513906,112.5697064,26.85142572,112.5696974,26.85146147,112.5696879,26.85149941,112.5696783,26.85153659,112.5696681,26.85157572,112.5696578,26.85161485,112.5696472,26.8516542,112.5696371,26.85169159,112.5696266,26.85172999,112.5696155,26.85177033,112.5696046,26.85181023,112.5695929,26.85185299,112.5695823,26.85189162,112.5695719,26.85193022,112.569561,26.85197066,112.5695497,26.85201321,112.5695382,26.85205596,112.5695279,26.85209482,112.5695174,26.85213436,112.5695067,26.85217449,112.5694959,26.85221516,112.569485,26.85225633,112.5694743,26.85229688,112.5694633,26.85233886,112.5694524,26.85238113,112.5694413,26.85242466,112.5694308,26.8524661,112.5694198,26.85250956,112.5694092,26.85255178,112.5693988,26.85259279,112.569388,26.85263469,112.5693769,26.85267757,112.569366,26.8527194,112.5693554,26.85276025,112.5693443,26.85280333,112.5693334,26.85284558,112.5693225,26.85288805,112.5693117,26.85292966,112.5693002,26.85297363,112.5692891,26.85301569,112.5692777,26.85305902,112.569266,26.85310356,112.5692546,26.85314714,112.5692431,26.85319091,112.5692317,26.85323497,112.5692202,26.85327933,112.5692087,26.85332392,112.5691972,26.85336863,112.5691858,26.85341325,112.5691749,26.85345641,112.5691636,26.85350087,112.5691531,26.85354275,112.569143,26.85358335,112.5691331,26.85362307,112.5691222,26.85366725,112.5691124,26.85370644,112.5691027,26.85374561,112.569093,26.85378487,112.5690831,26.85382439,112.5690719,26.85386919,112.5690621,26.85390839,112.5690516,26.85395007,112.5690412,26.85399127,112.5690308,26.85403196,112.5690199,26.85407429,112.5690085,26.85411835,112.5689974,26.85416091,112.5689856,26.85420639,112.5689743,26.8542504,112.5689637,26.85429169,112.5689535,26.85433115,112.5689427,26.85437326,112.5689326,26.85441331,112.568922,26.8544548,112.568911,26.8544977,112.5689005,26.85453841,112.5688894,26.8545817,112.568879,26.85462277,112.5688678,26.85466638,112.5688567,26.85470901,112.5688457,26.8547519,112.5688345,26.85479502,112.5688235,26.8548371,112.5688122,26.85488059,112.5688006,26.85492545,112.5687893,26.85496911,112.5687782,26.85501151,112.5687664,26.85505634,112.568755,26.85509972,112.5687435,26.85514281,112.5687322,26.85518554,112.5687208,26.85522789,112.5687097,26.85526979,112.5686988,26.85531119,112.5686882,26.85535218,112.5686777,26.85539307,112.5686676,26.85543275,112.5686555,26.85548062,112.5686452,26.8555216,112.5686348,26.85556272,112.5686242,26.85560399,112.5686136,26.85564545,112.5686028,26.85568712,112.568592,26.855729,112.5685811,26.85577112,112.5685701,26.85581347,112.5685591,26.85585607,112.5685481,26.85589891,112.568537,26.85594198,112.5685261,26.85598526,112.5685154,26.85602751,112.568504,26.85607247,112.568493,26.85611635,112.5684822,26.85615918,112.5684712,26.85620345,112.5684604,26.85624665,112.5684487,26.85629386,112.568438,26.85633727,112.5684268,26.85638327,112.568416,26.85642808,112.5684053,26.85647302,112.5683947,26.85651807,112.5683842,26.85656321,112.5683738,26.85660839,112.5683637,26.85665351,112.568354,26.8566972,112.5683439,26.85674318,112.5683342,26.85678752,112.5683248,26.85683053,112.5683149,26.85687604,112.5683053,26.85692029,112.5682957,26.85696459,112.5682862,26.85700893,112.5682767,26.85705329,112.5682672,26.85709769,112.5682579,26.85714209,112.5682488,26.8571852,112.5682394,26.85723081,112.5682305,26.8572739,112.5682215,26.85731824,112.5682123,26.85736381,112.5682036,26.85740683,112.5681948,26.85745103,112.5681859,26.85749648,112.5681773,26.85754054,112.568169,26.85758313,112.5681604,26.8576279,112.568152,26.85767111,112.5681425,26.85772013,112.5681341,26.85776279,112.5681257,26.85780527,112.5681174,26.85784767,112.5681094,26.85788874,112.5681013,26.85793112,112.5680933,26.85797353,112.5680849,26.8580172,112.5680771,26.85805841,112.5680686,26.85810201,112.5680605,26.8581444,112.5680523,26.85818672,112.5680441,26.85822898,112.5680359,26.85827112,112.5680278,26.85831313,112.5680202,26.85835379,112.5680122,26.85839662,112.5680046,26.85843805,112.5679972,26.85847932,112.5679899,26.85852052,112.5679818,26.85856636,112.5679745,26.85860858,112.5679665,26.85865545,112.5679588,26.8587011,112.567951,26.85874787,112.5679442,26.85878995,112.5679376,26.85883087,112.5679301,26.85887767,112.5679228,26.85892331,112.5679156,26.85897016,112.5679081,26.85901824,112.5679019,26.85905934,112.5678958,26.85910045,112.5678899,26.85914155,112.5678832,26.85918852,112.5678766,26.85923428,112.5678697,26.85928233,112.5678631,26.85932918,112.5678564,26.859376,112.5678505,26.85941691,112.5678441,26.85946248,112.5678372,26.85951028,112.5678314,26.85955104,112.5678251,26.85959643,112.5678187,26.85964302,112.5678123,26.8596896,112.5678067,26.85973154,112.5678013,26.85977234,112.5677951,26.85981906,112.5677898,26.85986003,112.5677839,26.85990581,112.5677779,26.85995296,112.5677725,26.85999563,112.5677668,26.86004212,112.5677617,26.86008411,112.5677566,26.86012636,112.5677515,26.86017008,112.5677466,26.86021286,112.5677419,26.86025591,112.5677373,26.86029923,112.5677327,26.86034278,112.5677282,26.86038529,112.5677236,26.86043051,112.5677192,26.86047342,112.5677146,26.86051896,112.5677102,26.86056344,112.5677058,26.86060811,112.5677013,26.86065295,112.5676968,26.86069794,112.5676924,26.86074306,112.5676879,26.86078835,112.5676836,26.8608324,112.5676792,26.86087911,112.567675,26.86092323,112.5676707,26.86096996,112.5676667,26.86101413,112.5676625,26.86106091,112.5676586,26.86110507,112.5676547,26.86115052,112.5676509,26.86119722,112.5676471,26.86124256,112.5676436,26.86128659,112.5676401,26.86133193,112.5676365,26.86137856,112.567633,26.86142383,112.5676298,26.86146768,112.5676264,26.86151389,112.5676232,26.86155733,112.5676199,26.86160315,112.5676169,26.86164637,112.5676139,26.86169085,112.567611,26.8617353,112.5676082,26.86177972,112.5676055,26.8618241,112.567603,26.86186844,112.5676005,26.86191278,112.5675981,26.86195711,112.5675956,26.86200143,112.5675931,26.86204698,112.5675907,26.86209002,112.5675883,26.86213433,112.5675859,26.86217863,112.5675836,26.86222282,112.5675814,26.86226677,112.5675792,26.86231036,112.5675767,26.86236083,112.5675747,26.86240343,112.5675729,26.86244457,112.5675711,26.86248692,112.5675695,26.8625294,112.567568,26.8625734,112.5675665,26.86261653,112.5675649,26.86266005,112.5675634,26.86270397,112.5675619,26.86274699,112.5675604,26.8627929,112.5675589,26.86283793,112.5675573,26.86288327,112.5675557,26.86292896,112.5675542,26.86297495,112.5675527,26.86302126,112.5675513,26.8630665,112.5675498,26.86311466,112.5675484,26.86316171,112.567547,26.86320891,112.5675455,26.86325623,112.5675442,26.86330222,112.567543,26.86335091,112.567542,26.86339822,112.5675411,26.86344545,112.5675403,26.86349126,112.5675397,26.86353966,112.5675393,26.86358666,112.5675392,26.86363231,112.5675391,26.86368061,112.5675392,26.86372751,112.5675393,26.86377292,112.5675394,26.86381943,112.5675396,26.86386562,112.5675399,26.86391154,112.5675403,26.86395865,112.5675408,26.86400441,112.5675413,26.86405016,112.5675417,26.8640946,112.5675422,26.86414172,112.5675425,26.86418629,112.5675429,26.86423223,112.5675434,26.86427959,112.5675438,26.86432449,112.5675443,26.86437088,112.567545,26.86441879,112.5675456,26.86446553,112.5675463,26.86451242,112.567547,26.86455813,112.5675478,26.86460532,112.5675487,26.86465255,112.5675497,26.86469973,112.5675508,26.86474818,112.5675518,26.8647952,112.5675528,26.86484079,112.5675538,26.86488894,112.5675547,26.86493564,112.5675556,26.8649809,112.5675565,26.86502875,112.5675575,26.86507392,112.5675586,26.86512044,112.5675598,26.86516698,112.5675611,26.86521358,112.5675624,26.86526024,112.5675639,26.8653083,112.5675654,26.86535509,112.5675669,26.86540063,112.5675684,26.86544893,112.5675698,26.86549465,112.5675713,26.86554177,112.5675728,26.86558895,112.5675744,26.86563619,112.567576,26.86568345,112.5675777,26.86573073,112.5675794,26.86577797,112.5675811,26.86582519,112.5675828,26.86587235,112.5675845,26.86591946,112.5675862,26.86596643,112.5675879,26.86601314,112.5675896,26.86605953,112.5675914,26.86610556,112.5675931,26.8661511,112.5675948,26.86619611,112.5675965,26.86624066,112.5675981,26.86628506,112.5675997,26.86632938,112.5676012,26.8663736,112.5676026,26.86641774,112.567604,26.86646184,112.5676053,26.86650591,112.5676066,26.86654994,112.567608,26.86659387,112.5676093,26.86663766,112.5676107,26.86668755,112.5676122,26.86673861,112.5676135,26.86678214,112.5676148,26.86682564,112.5676161,26.86686787,112.5676175,26.86691253,112.5676188,26.86695465,112.5676203,26.86699922,112.5676217,26.86704242,112.5676234,26.86709151,112.5676248,26.86713429,112.5676263,26.867177,112.5676277,26.86721962,112.5676292,26.86726217,112.5676306,26.86730467,112.5676321,26.86734711,112.5676336,26.8673895,112.5676351,26.86743181,112.5676366,26.8674741,112.5676382,26.8675163,112.5676398,26.86755835,112.5676415,26.86760491,112.5676433,26.86765356,112.567645,26.86769974,112.5676466,26.86774824,112.5676482,26.86779427,112.5676499,26.86784246,112.5676513,26.86788327,112.5676529,26.86792937,112.5676544,26.86797508,112.567656,26.86801958,112.5676575,26.86806627,112.5676588,26.86811174,112.56766,26.86815602,112.5676612,26.86820255,112.5676624,26.86824785,112.5676636,26.86829295,112.5676648,26.86833755,112.567666,26.86838151,112.5676672,26.86842482,112.5676684,26.8684664,112.5676697,26.86850838,112.5676711,26.86855089,112.5676725,26.86859187,112.567674,26.86863133,112.5676758,26.86867703,112.5676775,26.8687205,112.5676792,26.86876492,112.567681,26.86881031,112.5676825,26.86884977,112.5676843,26.86889408,112.567686,26.86893806,112.5676878,26.86898149,112.5676896,26.86902318,112.5676916,26.86906601,112.5676934,26.8691061,112.5676951,26.86914758,112.5676967,26.86918727,112.5676983,26.86922862,112.5676999,26.86926787,112.5677015,26.86930793,112.5677032,26.86934797,112.5677049,26.86938941,112.5677064,26.86942616,112.5677079,26.86946374,112.5677094,26.86950196,112.5677106,26.86954073,112.5677116,26.86957671,112.5677125,26.86961395,112.5677133,26.86965285,112.5677139,26.86968931,112.5677145,26.86972855,112.5677152,26.8697684,112.5677158,26.86980514,112.5677164,26.86984473,112.5677172,26.8698842,112.567718,26.86992669,112.5677189,26.86996511,112.5677198,26.8700034,112.5677211,26.87004334,112.5677225,26.87008406,112.5677242,26.87012649,112.567726,26.8701677,112.5677276,26.87020653,112.5677294,26.87024957,112.5677313,26.87029304,112.5677331,26.8703369,112.5677348,26.87038102,112.5677365,26.87042525,112.567738,26.87046473,112.5677394,26.8705044,112.5677409,26.8705492,112.5677422,26.87058911,112.5677437,26.87063399,112.5677452,26.87067786,112.5677468,26.87072362,112.5677482,26.87076329,112.5677498,26.87080678,112.5677515,26.87085218,112.5677531,26.87089667,112.5677545,26.87093638,112.5677562,26.87098112,112.5677578,26.87102582,112.5677592,26.87107049,112.5677606,26.87111427,112.567762,26.87115923,112.5677631,26.87120044,112.5677642,26.87123993,112.5677654,26.87128176,112.5677665,26.87132284,112.5677676,26.8713641,112.5677689,26.87140948,112.5677702,26.87145066,112.5677716,26.87149177,112.5677732,26.87153386,112.5677748,26.87157488,112.5677765,26.87161593,112.5677786,26.8716622,112.5677808,26.87170338,112.5677835,26.87174867,112.5677865,26.87179597,112.5677896,26.87184229,112.5677925,26.87188359,112.5677954,26.87192509,112.5677982,26.8719657,112.5678013,26.87200843,112.5678045,26.87205014,112.5678077,26.87209078,112.5678113,26.87213258,112.567815,26.87217562,112.5678187,26.8722168,112.5678227,26.87225928,112.5678271,26.8723031,112.5678317,26.87234609,112.5678365,26.87238934,112.5678416,26.87243287,112.5678467,26.87247555,112.5678524,26.87252062,112.567858,26.87256366,112.5678641,26.87260796,112.5678706,26.87265354,112.5678773,26.87269815,112.5678839,26.8727407,112.5678915,26.87278791,112.567899,26.87283305,112.5679065,26.8728772,112.5679145,26.87292261,112.5679226,26.87296804,112.567931,26.87301448,112.5679391,26.87305842,112.5679478,26.87310415,112.5679564,26.87314812,112.5679649,26.87319042,112.5679736,26.87323363,112.5679826,26.87327784,112.5679916,26.87332101,112.5680006,26.87336323,112.5680102,26.87340774,112.5680196,26.87345008,112.5680296,26.8734945,112.5680396,26.87353764,112.5680496,26.87357952,112.5680603,26.87362338,112.5680708,26.87366498,112.5680817,26.87370763,112.5680931,26.87375136,112.5681043,26.87379404,112.5681154,26.87383572,112.5681271,26.87387854,112.5681393,26.87392248,112.5681511,26.87396431,112.5681637,26.87400834,112.5681759,26.87405007,112.5681886,26.8740926,112.5682013,26.87413495,112.5682144,26.87417813,112.5682272,26.87421989,112.56824,26.87426146,112.5682525,26.87430187,112.5682659,26.87434423,112.5682791,26.87438543,112.5682921,26.87442549,112.5683057,26.87446646,112.56832,26.87450832,112.568334,26.87454804,112.5683486,26.87458865,112.568364,26.87463007,112.5683791,26.87467028,112.5683941,26.87470935,112.56841,26.87475022,112.5684256,26.87478982,112.5684413,26.87482925,112.5684568,26.87486759,112.5684732,26.87490781,112.568489,26.87494607,112.5685057,26.87498631,112.5685218,26.87502462,112.5685388,26.87506496,112.5685556,26.87510438,112.5685721,26.87514287,112.5685892,26.8751824,112.5686068,26.87522304,112.568624,26.87526283,112.568641,26.87530174,112.5686592,26.87534279,112.568677,26.87538192,112.5686957,26.87542207,112.5687154,26.87546328,112.5687351,26.87550355,112.568755,26.87554395,112.5687746,26.87558345,112.5687955,26.87562508,112.5688159,26.87566582,112.5688355,26.87570463,112.5688567,26.87574661,112.568878,26.87578862,112.5688985,26.87582857,112.5689196,26.87586951,112.568941,26.87591038,112.5689627,26.87595119,112.5689853,26.87599293,112.569007,26.8760326,112.5690296,26.87607324,112.56905,26.8761098,112.5690701,26.87614531,112.5690904,26.87618078,112.5691108,26.87621621,112.5691343,26.87625667,112.5691573,26.87629595,112.5691788,26.87633201,112.5692021,26.87637086,112.5692267,26.87641147,112.5692478,26.87644601,112.5692713,26.87648445,112.5692954,26.87652374,112.5693195,26.87656287,112.5693444,26.87660277,112.5693688,26.87664153,112.5693928,26.87667913,112.5694177,26.8767176,112.5694428,26.87675601,112.5694681,26.87679436,112.5694934,26.8768325,112.5695192,26.87687128,112.5695444,26.87690883,112.5695692,26.87694517,112.5695956,26.87698314,112.5696213,26.8770199,112.5696464,26.87705539,112.569672,26.87709121,112.5696972,26.87712641,112.569723,26.87716213,112.5697476,26.8771959,112.5697728,26.87723028,112.5697986,26.87726528,112.5698239,26.8772992,112.5698491,26.87733279,112.5698735,26.87736502,112.5698982,26.87739742,112.5699227,26.87742931,112.5699511,26.87746567,112.5699759,26.87749705,112.5700034,26.87753144,112.5700292,26.87756355,112.5700572,26.87759807,112.5700836,26.87763027,112.5701094,26.87766161,112.5701346,26.87769192,112.5701602,26.87772271,112.5701894,26.87775754,112.5702175,26.8777908,112.5702444,26.8778225,112.5702724,26.87785521,112.570299,26.87788639,112.5703262,26.87791827,112.5703535,26.87795024,112.5703812,26.87798232,112.570409,26.87801452,112.5704378,26.87804762,112.5704656,26.87807942,112.5704943,26.87811207,112.5705239,26.87814573,112.57055,26.87817517,112.5705795,26.87820838,112.5706086,26.87824094,112.5706386,26.87827435,112.570666,26.87830487,112.5706921,26.87833411,112.5707197,26.87836502,112.5707467,26.8783954,112.570773,26.87842527,112.5708042,26.87846069,112.5708307,26.87849089,112.5708578,26.87852192,112.5708848,26.8785529,112.570912,26.87858398,112.5709392,26.87861513,112.5709665,26.87864642,112.5709939,26.87867787,112.5710219,26.8787103,112.5710486,26.87874138,112.5710768,26.87877439,112.5711043,26.87880694,112.571132,26.87883986,112.5711591,26.87887224,112.5711876,26.87890658,112.5712147,26.87893953,112.5712425,26.87897356,112.5712712,26.87900876,112.5712984,26.87904251,112.5713269,26.87907826,112.5713541,26.8791125,112.5713825,26.87914884,112.57141,26.87918475,112.5714367,26.8792201,112.571464,26.87925676,112.5714918,26.87929472,112.5715181,26.87933117,112.5715449,26.87936889,112.5715714,26.87940687,112.5715983,26.8794462,112.5716211,26.87948,112.5716464,26.87951792,112.5716723,26.87955689,112.5716984,26.87959697,112.5717229,26.87963516,112.5717477,26.87967437,112.5717729,26.87971472,112.5717972,26.87975423,112.5718185,26.8797889,112.5718396,26.87982372,112.5718608,26.87985863,112.5718819,26.87989362,112.571903,26.87992869,112.5719239,26.87996384,112.5719447,26.87999908,112.5719653,26.88003445,112.5719887,26.88007503,112.5720089,26.88011061,112.572029,26.88014626,112.5720489,26.88018204,112.5720709,26.88022205,112.5720934,26.88026317,112.5721136,26.8803002,112.572136,26.88034131,112.5721555,26.88037712,112.5721749,26.88041272,112.5721961,26.88045213,112.5722175,26.8804922,112.572239,26.88053295,112.5722596,26.88057256,112.5722793,26.88061094,112.5722997,26.88065126,112.5723193,26.88069069,112.5723382,26.88072932,112.5723575,26.88076921,112.5723772,26.88081047,112.5723963,26.88085103,112.5724146,26.88089089,112.5724336,26.88093314,112.5724515,26.88097353,112.5724694,26.88101512,112.5724872,26.88105683,112.5725052,26.88109967,112.5725227,26.8811415,112.5725395,26.88118231,112.572557,26.88122519,112.5725734,26.88126585,112.5725904,26.88130857,112.5726065,26.88134921,112.5726229,26.88139095,112.5726396,26.88143384,112.5726552,26.88147476,112.5726711,26.88151689,112.5726866,26.8815592,112.5727023,26.88160268,112.5727169,26.88164415,112.5727321,26.88168776,112.5727464,26.88173044,112.57276,26.88177213,112.5727736,26.88181505,112.5727873,26.88185923,112.5728003,26.8819025,112.5728126,26.88194482,112.5728253,26.88198937,112.572837,26.88203166,112.5728489,26.88207502,112.5728608,26.88211844,112.5728729,26.882163,112.5728846,26.88220661,112.5728961,26.88224934,112.5729081,26.88229451,112.5729196,26.88233889,112.572931,26.88238354,112.5729418,26.88242734,112.5729529,26.88247365,112.5729622,26.88251337,112.5729727,26.88255892,112.5729816,26.88259894,112.5729912,26.88264369,112.5730007,26.8826898,112.5730102,26.88273723,112.5730191,26.8827836,112.5730274,26.88282886,112.5730357,26.88287527,112.573043,26.88291695,112.5730506,26.88296203,112.5730574,26.8830035,112.5730637,26.88304359,112.5730707,26.88308921,112.5730772,26.88313361,112.5730837,26.88318019,112.5730898,26.88322456,112.5730956,26.88327006,112.573101,26.88331559,112.573106,26.8833612,112.5731108,26.88340803,112.5731151,26.88345264,112.5731193,26.88349962,112.5731233,26.88354552,112.573127,26.88359032,112.5731309,26.88363636,112.5731351,26.8836824,112.5731394,26.8837294,112.573143,26.88377382,112.5731465,26.88382025,112.5731496,26.88386438,112.5731524,26.88390964,112.5731552,26.88395614,112.5731577,26.88400177,112.57316,26.88404771,112.5731619,26.88409275,112.5731635,26.88414031,112.5731646,26.88418646,112.5731655,26.88422689,112.5731662,26.88426731,112.573167,26.88431228,112.5731677,26.88435821,112.5731684,26.8844051,112.573169,26.88444973,112.5731696,26.88449555,112.5731703,26.88454143,112.5731709,26.88458853,112.5731715,26.88463453,112.5731721,26.88467941,112.5731728,26.88472542,112.5731736,26.88477119,112.5731744,26.88481672,112.5731753,26.88486222,112.5731762,26.88490886,112.5731771,26.88495433,112.5731779,26.8849986,112.5731787,26.88504505,112.5731794,26.88509026,112.5731799,26.88513432,112.5731805,26.8851807,112.5731811,26.88522601,112.5731816,26.88526913,112.573182,26.8853157,112.5731824,26.8853622,112.5731827,26.88540748,112.573183,26.88545269,112.5731833,26.88549665,112.5731835,26.88554242,112.5731839,26.885587,112.5731845,26.88563051,112.5731855,26.8856763,112.5731867,26.88571988,112.5731879,26.88576573,112.5731892,26.88580938,112.5731906,26.88585532,112.573192,26.88590019,112.5731937,26.88594398,112.5731957,26.8859888,112.5731981,26.88603332,112.5732009,26.88607752,112.5732041,26.88612163,112.5732075,26.88616681,112.5732105,26.88620981,112.5732134,26.886254,112.573216,26.8862994,112.5732182,26.88634383,112.5732201,26.88638838,112.573222,26.88643187,112.5732235,26.8864765,112.5732247,26.88652111,112.5732257,26.8865668,112.5732264,26.88661012,112.5732272,26.88665429,112.5732279,26.8866991,112.5732287,26.88674112,112.5732294,26.88678376,112.5732302,26.88682736,112.5732311,26.88686979,112.573232,26.88691107,112.5732329,26.88695441,112.5732338,26.88699665,112.5732348,26.88703772,112.5732358,26.88707964,112.5732369,26.88712224,112.5732379,26.88716342,112.5732389,26.88720337,112.57324,26.88724526,112.5732411,26.88728608,112.5732423,26.88732683,112.5732435,26.88737261,112.5732447,26.88741327,112.573246,26.88745799,112.5732472,26.88749974,112.5732483,26.88754058,112.5732495,26.88758659,112.5732505,26.88762748,112.5732515,26.88766725,112.5732527,26.88771383,112.5732537,26.88775403,112.5732548,26.88779323,112.5732559,26.88783443,112.573257,26.88787467,112.5732581,26.88791397,112.5732592,26.88795426,112.5732604,26.88799539,112.5732615,26.8880351,112.5732628,26.88807811,112.5732642,26.88812219,112.5732656,26.88816439,112.5732669,26.88820476,112.5732681,26.88824514,112.5732693,26.88828462,112.5732704,26.88832748,112.5732712,26.88836919,112.573272,26.88841039,112.573273,26.88845229,112.5732744,26.88849209,112.5732763,26.88853272,112.5732786,26.8885709,112.5732813,26.88860951,112.5732843,26.88864863,112.5732876,26.88868959,112.5732905,26.88872781,112.5732929,26.88876477,112.5732951,26.88880399";
+    private static final String ROMA_ROAD_1 = ",112.5732967,26.88884312,112.573298,26.88888136,112.5732992,26.88892276,112.5733003,26.8889593,112.5733014,26.88899739,112.5733025,26.8890355,112.5733035,26.88907108,112.5733047,26.88910874,112.5733058,26.88914569,112.5733066,26.88917961,112.5733074,26.88921312,112.5733083,26.88924725,112.5733091,26.88928032,112.5733103,26.88931571,112.5733115,26.88934913,112.5733125,26.88938455,112.5733134,26.88941967,112.5733143,26.8894553,112.5733152,26.88949305,112.573316,26.88953007,112.5733168,26.88956712,112.5733176,26.88960438,112.5733185,26.88964099,112.5733192,26.88967683,112.5733199,26.8897127,112.5733206,26.88974841,112.5733212,26.88978519,112.5733219,26.88982266,112.5733226,26.88985869,112.5733237,26.88989748,112.5733249,26.88993489,112.5733263,26.88997389,112.5733277,26.8900134,112.573329,26.8900502,112.5733303,26.89008916,112.5733317,26.89012966,112.5733332,26.89017157,112.5733347,26.89021087,112.5733361,26.89025122,112.5733373,26.89029287,112.5733381,26.89033146,112.5733386,26.89037135,112.5733389,26.89040761,112.5733389,26.89044447,112.5733388,26.89048254,112.5733387,26.89051882,112.5733386,26.89055676,112.5733386,26.8905955,112.5733387,26.89063273,112.5733388,26.89067132,112.5733391,26.89071264,112.5733393,26.89075182,112.5733397,26.89079314,112.5733402,26.89083474,112.5733409,26.89087733,112.5733415,26.89091545,112.5733423,26.89096038,112.5733432,26.8910007,112.5733441,26.89104087,112.573345,26.89108273,112.5733458,26.89112539,112.5733466,26.89116976,112.5733473,26.89121255,112.5733479,26.89125243,112.5733484,26.89129414,112.573349,26.89133951,112.5733495,26.89138274,112.5733501,26.89142482,112.5733507,26.89146856,112.5733513,26.89150994,112.573352,26.89155147,112.5733526,26.89159204,112.5733532,26.89163237,112.5733538,26.89167485,112.5733543,26.89171622,112.5733548,26.89175582,112.5733552,26.89179554,112.5733555,26.89183582,112.5733557,26.89187439,112.5733559,26.89191337,112.5733562,26.89195256,112.5733565,26.89199002,112.5733569,26.89203278,112.5733573,26.89207054,112.5733578,26.89210966,112.5733582,26.89214979,112.5733586,26.89219126,112.5733589,26.89223355,112.5733593,26.89227699,112.5733597,26.89231949,112.5733601,26.89236064,112.5733606,26.89240248,112.5733612,26.89244543,112.5733618,26.89248381,112.5733625,26.89252191,112.5733633,26.89256242,112.573364,26.89260178,112.5733649,26.89264348,112.5733658,26.89268478,112.5733666,26.89272566,112.5733673,26.89276889,112.573368,26.89281071,112.5733688,26.89285489,112.5733695,26.89289371,112.5733705,26.89293683,112.5733713,26.8929815,112.5733722,26.89302808,112.5733729,26.89306938,112.5733733,26.89311028,112.5733737,26.89315388,112.5733739,26.89319699,112.573374,26.89323947,112.5733742,26.89328454,112.5733746,26.89332775,112.5733751,26.89337233,112.5733757,26.89341704,112.5733763,26.89346293,112.573377,26.89350663,112.5733776,26.8935515,112.573378,26.89359639,112.5733785,26.89364237,112.5733789,26.89368712,112.5733794,26.8937306,112.5733801,26.89377614,112.5733808,26.89382037,112.5733815,26.89386435,112.5733822,26.89390691,112.573383,26.89395145,112.5733837,26.89399472,112.5733844,26.89403673,112.5733851,26.89407956,112.5733857,26.89412318,112.5733862,26.89416548,112.5733868,26.89420647,112.5733873,26.8942483,112.5733878,26.89428988,112.5733883,26.89433615,112.5733888,26.8943777,112.5733893,26.89441781,112.5733899,26.89446164,112.5733907,26.89450614,112.5733915,26.89455137,112.5733923,26.89459049,112.5733931,26.89463334,112.5733939,26.89467329,112.5733947,26.89471224,112.5733956,26.89475591,112.5733964,26.89479847,112.5733971,26.89484176,112.5733979,26.89488484,112.5733985,26.89492867,112.5733989,26.8949712,112.5733991,26.89501312,112.5733994,26.89505325,112.5733996,26.89509321,112.5733999,26.89513677,112.5734002,26.89517651,112.5734006,26.89521431,112.573401,26.89525288,112.5734013,26.89529152,112.5734017,26.89533116,112.5734021,26.89536936,112.5734025,26.89540959,112.5734029,26.89545278,112.5734034,26.89549274,112.5734039,26.89553381,112.5734043,26.89557331,112.5734049,26.89561481,112.5734053,26.89565445,112.5734057,26.89569472,112.5734059,26.89573454,112.5734062,26.8957736,112.5734064,26.89581245,112.5734065,26.89585335,112.5734066,26.89589289,112.5734068,26.89593014,112.573407,26.89596891,112.5734072,26.89600663,112.5734071,26.89604329,112.5734065,26.89607874,112.5734033,26.8961115,112.5733885,26.89614048,112.5733594,26.89615626,112.5733261,26.89616072,112.5732919,26.89616149,112.5732556,26.89616183,112.573221,26.89616196,112.5731862,26.89616097,112.5731528,26.89615707,112.57312,26.89614683,112.5730933,26.89612524,112.5730807,26.89609266,112.5730791,26.89605794,112.5730796,26.89602181,112.5730799,26.89598458,112.57308,26.89594866,112.5730801,26.89591138,112.5730804,26.89586999,112.5730807,26.89583017,112.5730809,26.89579278,112.5730809,26.89575293,112.5730811,26.89571153,112.5730813,26.89566893,112.5730815,26.89562531,112.5730817,26.89558522,112.5730818,26.89554443,112.5730816,26.89550201,112.5730812,26.89546086,112.5730807,26.89541728,112.5730801,26.89537506,112.5730794,26.89533041,112.5730788,26.89528732,112.5730781,26.89524696,112.5730773,26.89520359,112.5730763,26.89515832,112.5730753,26.89511534,112.5730741,26.895072,112.573073,26.89502936,112.573072,26.89498744,112.573071,26.89494533,112.5730702,26.89490572,112.5730693,26.89486505,112.5730684,26.89482173,112.5730676,26.89478014,112.573067,26.89473705,112.5730666,26.8946958,112.5730665,26.8946542,112.5730664,26.89461166,112.5730661,26.89456982,112.5730655,26.8945277,112.5730648,26.89448509,112.5730641,26.89444724,112.5730633,26.89440734,112.5730627,26.8943688,112.5730623,26.89432806,112.573062,26.89428862,112.5730619,26.89424679,112.5730619,26.89420622,112.5730619,26.89416428,112.5730617,26.894122,112.5730614,26.89407948,112.5730611,26.89403586,112.5730608,26.89399505,112.5730604,26.89395071,112.57306,26.89390857,112.5730596,26.89386637,112.5730592,26.89382411,112.5730588,26.89378642,112.5730584,26.89374473,112.5730579,26.89370185,112.5730574,26.89365882,112.5730569,26.89361566,112.5730563,26.89357237,112.5730557,26.89352906,112.5730552,26.89348503,112.5730547,26.89344298,112.5730542,26.89339899,112.5730537,26.89335682,112.5730532,26.89331263,112.5730527,26.89326926,112.5730523,26.8932269,112.5730518,26.89318296,112.5730513,26.89314193,112.5730508,26.89309986,112.5730501,26.89305483,112.5730493,26.89301059,112.5730485,26.89296809,112.5730477,26.89292827,112.5730469,26.89288538,112.5730462,26.89284648,112.5730456,26.89280284,112.5730449,26.89275812,112.5730442,26.89271515,112.5730434,26.89267005,112.5730426,26.89262685,112.5730418,26.89258263,112.5730412,26.89253851,112.5730411,26.89249867,112.5730408,26.89245598,112.5730404,26.89241124,112.57304,26.89236733,112.5730397,26.89232821,112.5730395,26.8922852,112.5730393,26.89224026,112.573039,26.89219719,112.5730386,26.89215689,112.5730382,26.89211347,112.5730377,26.89206894,112.5730371,26.89202329,112.5730364,26.89198359,112.5730357,26.89194406,112.5730348,26.89190081,112.573034,26.89186042,112.5730331,26.89181692,112.5730323,26.89177132,112.5730315,26.89172754,112.5730306,26.89168257,112.5730298,26.8916364,112.5730292,26.8915963,112.5730286,26.89155153,112.573028,26.89151226,112.5730275,26.89146971,112.5730269,26.89142553,112.5730263,26.89138216,112.5730257,26.89134344,112.5730252,26.8913007,112.5730247,26.89125681,112.5730242,26.89121279,112.5730237,26.89116805,112.5730232,26.89112542,112.5730228,26.89108565,112.5730222,26.89104309,112.5730216,26.891,112.573021,26.89095657,112.5730204,26.89091571,112.5730197,26.89087365,112.573019,26.89083393,112.5730182,26.89079307,112.5730175,26.89075464,112.5730167,26.89071179,112.5730158,26.890669,112.573015,26.89062799,112.5730143,26.8905879,112.5730137,26.89054827,112.5730132,26.89050954,112.5730129,26.89047035,112.5730126,26.89043179,112.5730124,26.89039326,112.5730124,26.89035626,112.5730126,26.8903165,112.5730128,26.89027831,112.5730131,26.89023978,112.5730135,26.89020133,112.5730142,26.89016195,112.573015,26.8901229,112.573016,26.89008347,112.5730169,26.8900436,112.5730175,26.89000409,112.5730179,26.88996363,112.573018,26.88992305,112.573018,26.88988251,112.5730178,26.88984153,112.5730175,26.88980195,112.5730172,26.889763,112.5730168,26.88972426,112.5730164,26.88968621,112.5730159,26.8896472,112.5730156,26.8896077,112.5730153,26.88956763,112.5730149,26.8895263,112.573015,26.88948602,112.5730154,26.88944825,112.5730163,26.88941028,112.5730175,26.88937211,112.5730192,26.88933369,112.5730211,26.88929501,112.5730231,26.88925521,112.5730251,26.88921664,112.5730272,26.88917695,112.5730293,26.88913726,112.5730312,26.88909752,112.5730329,26.88905761,112.5730342,26.88901694,112.5730351,26.88897695,112.5730358,26.88893662,112.5730363,26.88889578,112.5730366,26.88885506,112.5730368,26.88881282,112.5730368,26.88877344,112.5730367,26.88873567,112.5730363,26.88869385,112.5730358,26.88865167,112.5730355,26.88861355,112.5730352,26.88857604,112.5730353,26.88853783,112.573036,26.88850285,112.5730381,26.8884678,112.5730414,26.88843287,112.5730459,26.88839641,112.5730501,26.88836049,112.5730538,26.88832288,112.5730569,26.8882834,112.5730593,26.88824441,112.5730612,26.88820407,112.5730624,26.88816653,112.5730632,26.88812675,112.5730636,26.88808468,112.5730638,26.88804298,112.5730638,26.88800383,112.5730637,26.8879638,112.5730636,26.88792198,112.5730633,26.88788025,112.573063,26.88783868,112.5730628,26.88779446,112.5730627,26.88775538,112.5730626,26.88771081,112.5730625,26.88767077,112.5730624,26.88763149,112.5730622,26.8875858,112.5730618,26.88754374,112.5730614,26.88750332,112.5730609,26.88746145,112.5730603,26.88741917,112.5730596,26.8873754,112.573059,26.88733334,112.5730582,26.88728878,112.5730574,26.88724606,112.5730566,26.88720198,112.5730558,26.88715766,112.573055,26.88711198,112.5730542,26.88706716,112.5730535,26.88702326,112.5730528,26.88697691,112.5730521,26.88693149,112.5730515,26.88688703,112.5730509,26.88684114,112.5730503,26.88679492,112.5730497,26.886753,112.5730491,26.88670608,112.5730486,26.88666481,112.573048,26.88661866,112.5730474,26.88657015,112.5730468,26.88652287,112.5730463,26.8864815,112.5730457,26.88643422,112.5730451,26.8863882,112.5730444,26.88634004,112.5730438,26.88629326,112.5730432,26.88624779,112.5730427,26.88620128,112.5730422,26.88615365,112.5730418,26.886113,112.5730414,26.88607235,112.5730409,26.88603171,112.5730404,26.88599109,112.5730399,26.88594474,112.5730393,26.88590428,112.5730388,26.88585928,112.5730381,26.88581315,112.5730375,26.88576584,112.573037,26.8857254,112.5730363,26.88568022,112.5730356,26.88563363,112.5730349,26.88558562,112.5730342,26.88554445,112.5730335,26.88550318,112.5730328,26.88546189,112.5730319,26.88541473,112.5730311,26.88537343,112.5730303,26.88533212,112.5730294,26.88529089,112.5730285,26.88524512,112.5730277,26.88519833,112.5730271,26.88515065,112.5730267,26.88511019,112.5730263,26.88506425,112.573026,26.88502088,112.5730257,26.88497335,112.5730256,26.88492856,112.5730256,26.88488519,112.5730258,26.88484095,112.5730259,26.88479582,112.5730259,26.88475206,112.5730256,26.88470963,112.5730251,26.88466503,112.5730246,26.88462156,112.5730239,26.88457918,112.5730232,26.88453565,112.5730224,26.88449103,112.5730216,26.8844475,112.5730207,26.88440509,112.5730197,26.88436157,112.5730186,26.88431671,112.5730174,26.88427269,112.5730161,26.8842295,112.5730145,26.8841838,112.5730127,26.88413884,112.5730109,26.88409464,112.573009,26.884049,112.573007,26.88400193,112.5730051,26.8839615,112.5730028,26.883915,112.5730006,26.88387428,112.5729984,26.88383342,112.5729959,26.88379245,112.5729932,26.8837514,112.5729903,26.88371044,112.5729871,26.88366959,112.5729834,26.88362416,112.5729793,26.88357766,112.5729748,26.88353023,112.5729708,26.8834899,112.5729666,26.88344952,112.5729623,26.88340907,112.5729577,26.88336862,112.5729529,26.88332817,112.5729479,26.8832878,112.5729426,26.88324749,112.572937,26.88320728,112.5729312,26.88316723,112.5729244,26.88312256,112.5729171,26.8830766,112.5729094,26.88303051,112.5729012,26.88298303,112.572894,26.88294231,112.5728871,26.88290217,112.5728796,26.8828595,112.572872,26.88281792,112.5728644,26.88277586,112.5728569,26.88273482,112.5728484,26.88269156,112.5728399,26.88264966,112.5728312,26.88260788,112.572822,26.88256629,112.5728127,26.88252487,112.572803,26.88248338,112.5727931,26.88244204,112.5727834,26.88240206,112.5727731,26.88236009,112.572763,26.88231966,112.5727512,26.88227392,112.5727396,26.88222985,112.5727291,26.88219079,112.5727169,26.88214677,112.5727042,26.88210204,112.572692,26.8820596,112.5726793,26.88201625,112.5726665,26.88197324,112.5726533,26.88192965,112.5726405,26.88188865,112.5726268,26.88184561,112.5726132,26.8818036,112.5725997,26.88176259,112.5725855,26.88172043,112.5725707,26.8816771,112.5725565,26.8816358,112.5725415,26.88159334,112.5725264,26.88155081,112.572511,26.88150823,112.5724954,26.8814657,112.5724795,26.88142339,112.5724634,26.8813813,112.5724465,26.8813382,112.57243,26.88129717,112.5724129,26.88125502,112.5723955,26.88121281,112.5723774,26.88116959,112.5723601,26.8811287,112.5723417,26.88108614,112.5723237,26.88104504,112.5723062,26.88100556,112.5722884,26.88096593,112.5722703,26.88092599,112.5722526,26.88088738,112.5722353,26.88085008,112.5722176,26.88081218,112.5721995,26.8807741,112.572182,26.88073772,112.5721629,26.88069858,112.5721449,26.88066292,112.5721255,26.88062533,112.5721058,26.88058778,112.5720862,26.88055066,112.5720664,26.88051342,112.5720459,26.88047514,112.5720259,26.88043827,112.5720047,26.88039948,112.5719839,26.88036225,112.5719622,26.88032409,112.5719404,26.88028602,112.5719179,26.88024716,112.5718961,26.88020984,112.5718754,26.88017492,112.5718528,26.88013739,112.5718313,26.8801023,112.5718101,26.88006792,112.571789,26.88003419,112.5717638,26.87999408,112.5717419,26.87995981,112.5717189,26.87992442,112.5716948,26.8798879,112.5716709,26.87985208,112.5716472,26.87981711,112.571622,26.87978042,112.571597,26.87974467,112.5715723,26.8797097,112.5715467,26.87967372,112.5715206,26.8796376,112.5714936,26.87960038,112.5714675,26.87956482,112.5714407,26.87952843,112.5714134,26.87949148,112.5713876,26.87945693,112.5713616,26.87942227,112.5713353,26.87938759,112.5713099,26.87935455,112.5712856,26.87932296,112.5712568,26.8792859,112.5712316,26.87925359,112.5712068,26.87922198,112.571181,26.87918931,112.5711542,26.87915546,112.5711282,26.87912288,112.571101,26.87908911,112.5710725,26.87905404,112.5710447,26.8790202,112.5710158,26.87898511,112.5709866,26.87894977,112.5709565,26.87891343,112.5709276,26.87887888,112.5708978,26.87884366,112.5708673,26.87880792,112.5708378,26.87877355,112.5708093,26.87874059,112.5707796,26.87870656,112.570751,26.87867398,112.570723,26.87864244,112.5706941,26.87861029,112.5706641,26.87857742,112.5706344,26.87854533,112.5706052,26.878514,112.5705752,26.87848191,112.570545,26.87844992,112.5705142,26.87841731,112.5704852,26.87838658,112.5704558,26.87835547,112.5704261,26.87832404,112.5703985,26.87829459,112.5703672,26.87826116,112.5703368,26.87822827,112.5703064,26.87819522,112.5702777,26.87816376,112.5702477,26.87813063,112.570219,26.87809865,112.5701894,26.87806568,112.5701592,26.87803168,112.5701329,26.87800179,112.5701039,26.87796856,112.5700766,26.87793705,112.5700499,26.87790587,112.5700237,26.87787493,112.569996,26.87784169,112.5699686,26.8778085,112.5699416,26.87777537,112.5699135,26.87774068,112.5698846,26.8777044,112.5698576,26.87767022,112.5698286,26.87763295,112.5698002,26.87759619,112.5697744,26.87756276,112.5697462,26.87752631,112.5697199,26.87749247,112.5696942,26.87745934,112.5696691,26.87742689,112.5696431,26.87739326,112.5696164,26.87735855,112.5695906,26.87732475,112.569565,26.87729089,112.5695402,26.87725792,112.5695106,26.87721804,112.5694856,26.87718389,112.5694607,26.87714969,112.569436,26.87711554,112.5694115,26.87708153,112.5693874,26.87704768,112.5693611,26.8770101,112.5693345,26.87697143,112.5693076,26.87693169,112.5692849,26.87689765,112.5692599,26.87685958,112.5692347,26.87682032,112.5692129,26.87678588,112.5691882,26.8767465,112.5691633,26.87670629,112.5691402,26.87666829,112.5691169,26.87662984,112.569094,26.87659195,112.5690706,26.8765532,112.5690484,26.87651636,112.5690252,26.87647757,112.5690028,26.8764397,112.5689811,26.87640275,112.5689591,26.87636474,112.5689367,26.87632568,112.568915,26.8762874,112.568894,26.8762499,112.5688728,26.87621139,112.5688515,26.87617194,112.5688316,26.87613461,112.5688116,26.87609641,112.5687913,26.87605717,112.5687715,26.87601885,112.5687522,26.87598143,112.5687323,26.87594291,112.5687123,26.87590424,112.5686917,26.87586442,112.568672,26.87582637,112.5686514,26.87578619,112.5686319,26.8757478,112.568612,26.87570831,112.5685921,26.87566873,112.568572,26.87562808,112.5685524,26.87558833,112.5685336,26.87554945,112.5685142,26.87550855,112.5684958,26.8754687,112.5684783,26.87542992,112.5684608,26.87539031,112.5684435,26.87535077,112.5684264,26.87531125,112.5684095,26.87527174,112.5683928,26.87523232,112.5683759,26.87519204,112.5683599,26.87515375,112.5683436,26.87511442,112.5683268,26.87507399,112.568311,26.87503544,112.5682949,26.87499591,112.568279,26.87495635,112.5682629,26.8749157,112.5682473,26.87487598,112.5682324,26.87483724,112.5682169,26.87479641,112.5682019,26.87475651,112.5681875,26.87471759,112.568173,26.87467768,112.5681584,26.87463682,112.5681444,26.87459696,112.5681311,26.87455821,112.5681179,26.87451876,112.5681048,26.87447884,112.5680927,26.8744415,112.5680788,26.87439836,112.5680659,26.874358,112.5680528,26.87431705,112.5680408,26.87427962,112.5680289,26.87424188,112.568016,26.87420139,112.5680032,26.87416169,112.56799,26.87412103,112.5679778,26.8740834,112.5679648,26.87404224,112.5679536,26.87400567,112.5679423,26.87396694,112.5679319,26.87392933,112.5679214,26.87389029,112.5679109,26.87384999,112.567901,26.87381101,112.5678909,26.87376984,112.5678812,26.87373004,112.567871,26.87368804,112.5678611,26.87364741,112.5678508,26.87360523,112.5678402,26.87356236,112.5678304,26.87352268,112.5678211,26.87348436,112.5678103,26.87343955,112.5678007,26.87339815,112.5677916,26.87335822,112.5677825,26.87331672,112.5677733,26.87327368,112.5677649,26.87323236,112.5677563,26.87318953,112.5677481,26.87314629,112.5677399,26.87310163,112.5677323,26.87305885,112.5677249,26.87301482,112.5677177,26.87296977,112.5677112,26.8729271,112.5677047,26.87288338,112.5676982,26.87283962,112.5676916,26.87279458,112.5676853,26.87275153,112.5676788,26.87270728,112.5676724,26.87266312,112.5676659,26.87261775,112.5676599,26.87257434,112.5676537,26.87252853,112.5676479,26.87248363,112.5676424,26.87243961,112.5676371,26.87239419,112.5676319,26.87234731,112.5676275,26.87230706,112.5676225,26.87226078,112.5676182,26.87222008,112.5676139,26.87217914,112.5676096,26.87213798,112.5676051,26.87209184,112.5676007,26.87204309,112.5675971,26.87200134,112.5675937,26.87196062,112.5675905,26.8719185,112.5675875,26.87187621,112.5675849,26.87183377,112.5675826,26.87179121,112.5675808,26.87174733,112.5675795,26.87170582,112.5675783,26.87166177,112.5675774,26.87162009,112.5675765,26.87157093,112.5675757,26.87152664,112.5675747,26.87148478,112.5675736,26.87144041,112.5675724,26.87139718,112.5675711,26.87135386,112.5675699,26.87131048,112.5675688,26.87126725,112.5675673,26.87122412,112.5675654,26.8711811,112.5675634,26.87113938,112.5675611,26.87109529,112.567559,26.87105253,112.5675571,26.87100987,112.5675554,26.87096736,112.5675537,26.87092512,112.567552,26.87087727,112.5675504,26.87083084,112.5675488,26.87078346,112.5675474,26.87073649,112.5675462,26.87069473,112.5675448,26.87064901,112.5675435,26.87060517,112.5675421,26.87056099,112.5675407,26.87051645,112.5675395,26.8704748,112.5675383,26.87043287,112.567537,26.87039053,112.5675358,26.87034983,112.5675346,26.87031065,112.5675331,26.87026466,112.5675317,26.87022081,112.5675299,26.87017502,112.5675282,26.87013109,112.5675264,26.87009001,112.5675247,26.87004982,112.5675232,26.87001052,112.5675214,26.8699641,112.5675199,26.86992484,112.5675183,26.86988464,112.5675165,26.86984338,112.5675144,26.86979907,112.5675123,26.86975781,112.5675103,26.8697176,112.5675084,26.86967842,112.5675064,26.86963225,112.5675048,26.8695931,112.567503,26.86954786,112.5675014,26.86950648,112.5675001,26.86946691,112.5674988,26.86942606,112.5674976,26.86938392,112.5674965,26.86934351,112.5674954,26.86930177,112.5674943,26.86925977,112.5674932,26.86921749,112.5674921,26.86917495,112.567491,26.86913224,112.5674898,26.86908935,112.5674886,26.86904525,112.5674874,26.86900313,112.5674863,26.86895978,112.5674852,26.8689163,112.567484,26.86887162,112.5674827,26.86882903,112.5674813,26.86878515,112.5674798,26.86873992,112.5674783,26.86869666,112.5674766,26.86865197,112.5674749,26.86860584,112.5674731,26.8685605,112.5674712,26.868516,112.5674694,26.86847009,112.5674675,26.86842391,112.5674659,26.86838218,112.5674642,26.86834152,112.5674626,26.86830078,112.5674609,26.86825999,112.5674592,26.86821914,112.5674574,26.86817355,112.5674555,26.86812672,112.5674536,26.86807979,112.5674518,26.86803165,112.5674501,26.86799053,112.5674485,26.86794938,112.5674468,26.86790817,112.567445,26.86786215,112.5674431,26.86781487,112.5674412,26.86776628,112.5674395,26.86771875,112.5674379,26.86767233,112.5674362,26.86762341,112.5674346,26.86757562,112.5674331,26.86752895,112.5674315,26.86748102,112.5674298,26.86743174,112.5674284,26.8673908,112.567427,26.86734857,112.5674256,26.86730509,112.5674242,26.86726398,112.5674228,26.8672216,112.5674214,26.86717915,112.56742,26.86713666,112.5674185,26.86709288,112.567417,26.86705026,112.5674156,26.86700761,112.5674142,26.86696616,112.5674127,26.86692347,112.5674112,26.86687958,112.5674097,26.86683694,112.5674082,26.86679552,112.5674066,26.86675284,112.5674051,26.86671013,112.5674036,26.86666735,112.567402,26.8666245,112.5674003,26.86658036,112.5673988,26.86653862,112.5673972,26.86649561,112.5673955,26.86645253,112.5673936,26.86640201,112.567392,26.86635884,112.56739,26.86630946,112.5673881,26.86626128,112.5673862,26.86621183,112.5673844,26.86616862,112.5673828,26.86612551,112.5673811,26.86608121,112.5673795,26.86603937,112.5673779,26.86599629,112.5673764,26.8659532,112.567375,26.86591009,112.5673736,26.86586696,112.567372,26.86582258,112.5673705,26.86578066,112.5673689,26.86573754,112.567367,26.86569438,112.5673651,26.86565124,112.5673632,26.86560809,112.5673614,26.86556491,112.5673597,26.86552172,112.567358,26.8654711,112.5673566,26.8654279,112.5673553,26.86538593,112.567354,26.86534148,112.5673527,26.86529826,112.5673513,26.86525503,112.5673501,26.86521301,112.5673488,26.86516974,112.5673475,26.86512644,112.5673463,26.86508189,112.5673452,26.8650398,112.567344,26.86499649,112.5673427,26.86495199,112.5673416,26.86490877,112.5673405,26.86486555,112.5673396,26.86482358,112.5673386,26.86478042,112.5673378,26.8647373,112.5673369,26.86469429,112.5673361,26.86465025,112.5673354,26.86460882,112.5673348,26.86456629,112.5673343,26.86452384,112.5673338,26.86448017,112.5673334,26.86443894,112.5673331,26.86439528,112.5673328,26.86435283,112.5673325,26.86431159,112.5673322,26.86426913,112.5673319,26.86422543,112.5673317,26.86418416,112.5673316,26.86414044,112.5673315,26.86409911,112.5673315,26.86405653,112.5673316,26.86401274,112.5673317,26.86397137,112.5673318,26.86392876,112.567332,26.86388614,112.5673321,26.86384351,112.5673322,26.86380086,112.5673322,26.86375816,112.5673321,26.86371536,112.5673321,26.86367248,112.5673321,26.86362955,112.5673326,26.86357924,112.5673332,26.86353624,112.5673342,26.86349317,112.5673352,26.86345126,112.5673365,26.86340684,112.5673378,26.86336361,112.5673391,26.86332033,112.5673403,26.86327822,112.5673412,26.86323356,112.5673419,26.86319004,112.5673425,26.86314639,112.5673432,26.86310264,112.5673439,26.86306,112.5673446,26.86301475,112.5673455,26.86297064,112.5673465,26.86292645,112.5673477,26.86288212,112.567349,26.86283769,112.5673504,26.86279316,112.5673518,26.86274854,112.5673534,26.8627051,112.567355,26.86265906,112.5673568,26.86261425,112.5673586,26.86257067,112.5673607,26.86252576,112.5673629,26.8624808,112.5673651,26.8624345,112.5673673,26.86239072,112.5673697,26.86234436,112.5673719,26.86230063,112.5673743,26.86225443,112.5673767,26.86220961,112.5673791,26.8621662,112.5673816,26.8621217,112.5673844,26.86207613,112.5673871,26.86203196,112.5673898,26.86198919,112.5673927,26.86194408,112.5673957,26.86190044,112.5673986,26.86185828,112.5674016,26.86181519,112.5674047,26.86177236,112.5674078,26.86172852,112.5674109,26.86168607,112.5674139,26.86164492,112.5674171,26.86160136,112.5674202,26.86155902,112.5674234,26.86151665,112.5674267,26.86147546,112.5674301,26.86143301,112.5674335,26.86139048,112.567437,26.86134783,112.5674405,26.861305,112.5674442,26.86126202,112.5674481,26.86121756,112.5674518,26.86117533,112.5674556,26.86113159,112.5674595,26.86108761,112.5674634,26.86104335,112.5674673,26.86099883,112.5674714,26.86095276,112.5674752,26.860909,112.5674793,26.86086241,112.5674832,26.8608182,112.5674871,26.86077258,112.5674911,26.86072692,112.5674952,26.86068139,112.5674993,26.86063475,112.5675033,26.86059091,112.5675075,26.86054592,112.5675119,26.86050102,112.5675163,26.86045621,112.5675209,26.8604115,112.5675255,26.86036692,112.5675301,26.86032249,112.5675347,26.86027832,112.5675395,26.86023447,112.5675443,26.86019094,112.5675499,26.86014143,112.5675551,26.86009704,112.5675602,26.86005525,112.5675657,26.86001113,112.5675712,26.85996839,112.5675769,26.85992583,112.5675827,26.85988345,112.5675885,26.85984244,112.5675945,26.85979918,112.5676003,26.8597573,112.5676061,26.85971567,112.5676127,26.85966849,112.5676184,26.85962746,112.5676248,26.85958196,112.5676315,26.8595343,112.567638,26.85948797,112.5676438,26.85944753,112.5676496,26.85940715,112.5676555,26.85936687,112.567662,26.85932217,112.5676688,26.85927647,112.5676758,26.85922972,112.5676827,26.85918415,112.5676895,26.85913975,112.5676964,26.85909433,112.5677036,26.85904794,112.5677103,26.859004,112.5677173,26.8589591,112.5677244,26.85891326,112.5677315,26.85886871,112.5677384,26.85882537,112.5677455,26.85878094,112.5677529,26.85873538,112.5677601,26.85869095,112.5677673,26.85864762,112.567775,26.85860196,112.5677826,26.85855723,112.5677901,26.85851344,112.5677978,26.85846829,112.5678058,26.85842178,112.5678136,26.85837618,112.5678205,26.8583361,112.5678275,26.85829587,112.5678355,26.85825086,112.5678437,26.85820449,112.5678512,26.85816261,112.5678596,26.85811587,112.567868,26.85807012,112.5678758,26.85802773,112.5678835,26.85798637,112.5678914,26.8579449,112.5678993,26.8579033,112.5679074,26.85786158,112.5679155,26.85781974,112.5679237,26.85777775,112.5679318,26.85773564,112.56794,26.85769342,112.5679492,26.85764624,112.5679588,26.8575977,112.5679674,26.85755387,112.5679756,26.85751238,112.5679844,26.85746833,112.5679928,26.85742662,112.5680018,26.85738235,112.5680105,26.85734049,112.5680197,26.85729609,112.5680285,26.8572541,112.5680377,26.85721086,112.5680468,26.85716763,112.5680559,26.85712438,112.5680653,26.85707988,112.5680744,26.85703659,112.5680834,26.85699454,112.5680927,26.85695129,112.5681021,26.85690798,112.5681117,26.85686472,112.5681214,26.85682142,112.5681316,26.85677687,112.5681412,26.85673477,112.5681512,26.85669142,112.5681612,26.85664807,112.5681713,26.85660471,112.5681815,26.8565613,112.5681918,26.85651784,112.5682022,26.85647436,112.5682125,26.85643085,112.568223,26.85638731,112.5682334,26.85634374,112.5682438,26.85630014,112.5682542,26.85625653,112.5682646,26.85621292,112.568275,26.85616934,112.5682856,26.85612576,112.5682961,26.85608222,112.5683068,26.85603871,112.5683175,26.85599523,112.5683283,26.85595174,112.5683391,26.85590827,112.56835,26.85586481,112.5683608,26.85582135,112.5683716,26.8557779,112.5683824,26.85573445,112.5683932,26.85569109,112.5684039,26.85564784,112.5684146,26.85560469,112.5684253,26.85556164,112.5684359,26.85551869,112.5684465,26.85547585,112.5684571,26.8554331,112.5684692,26.85538435,112.5684798,26.85534179,112.5684907,26.855298,112.568501,26.85525659,112.5685119,26.85521269,112.5685225,26.85516999,112.5685328,26.85512851,112.5685435,26.85508584,112.5685545,26.85504202,112.5685652,26.85499958,112.568576,26.85495741,112.5685865,26.85491681,112.5685972,26.85487547,112.5686081,26.85483341,112.56862,26.85478737,112.5686301,26.85474766,112.5686411,26.85470406,112.5686521,26.85466006,112.568663,26.85461675,112.5686741,26.85457261,112.5686845,26.85453065,112.5686953,26.85448763,112.5687062,26.85444347,112.5687171,26.85440031,112.5687278,26.85435814,112.568739,26.85431482,112.5687505,26.85427036,112.5687615,26.854228,112.5687728,26.85418444,112.5687842,26.85414074,112.568796,26.85409578,112.5688072,26.85405281,112.5688186,26.85400854,112.5688303,26.85396292,112.5688403,26.8539238,112.5688516,26.85387999,112.5688634,26.85383485,112.5688757,26.85378837,112.5688879,26.85374282,112.5688998,26.85369813,112.5689122,26.85365202,112.5689231,26.85361148,112.568934,26.85357073,112.568945,26.85352976,112.5689563,26.85348742,112.5689669,26.85344729,112.5689777,26.85340595,112.5689884,26.85336456,112.568999,26.85332314,112.5690095,26.85328177,112.5690201,26.85323937,112.5690301,26.85319962,112.5690419,26.85315203,112.5690519,26.85311185,112.5690618,26.85307214,112.5690725,26.85302843,112.5690834,26.85298416,112.5690945,26.85293939,112.5691052,26.85289631,112.5691153,26.85285525,112.5691254,26.85281427,112.5691363,26.85276925,112.5691467,26.85272479,112.5691558,26.85268448,112.5691642,26.85264604,112.5691739,26.85260068,112.5691823,26.85256148,112.5691914,26.85251902,112.5692006,26.85247698,112.5692099,26.85243617,112.5692195,26.85239528,112.5692291,26.85235591,112.5692383,26.85231832,112.5692483,26.85227828,112.5692577,26.85224057,112.5692673,26.85220256,112.5692765,26.85216641,112.5692852,26.85213217,112.5692934,26.85209921,112.5693012,26.85206782,112.5693088,26.8520366,112.5693165,26.85200596,112.5693244,26.85197473,112.5693329,26.85194174,112.5693415,26.85190886,112.5693505,26.85187391,112.5693596,26.85183913,112.5693689,26.8518038,112.5693786,26.85176767,112.5693886,26.85173053,112.5693987,26.85169321,112.5694093,26.8516548,112.5694193,26.85161924,112.5694299,26.85158166,112.5694409,26.85154281,112.5694525,26.85150268,112.5694646,26.85146038,112.5694754,26.85142303,112.5694865,26.85138403,112.5694981,26.85134331,112.5695094,26.8513035,112.5695209,26.85126192,112.5695315,26.85122334,112.5695429,26.85118118,112.5695535,26.85114123,112.5695636,26.8511028,112.5695755,26.85105703,112.569586,26.85101676,112.5695962,26.85097701,112.5696067,26.85093573,112.5696177,26.85089286,112.5696282,26.85085165,112.5696391,26.85080916,112.5696501,26.85076663,112.5696614,26.8507231,112.5696721,26.85068191,112.5696831,26.85064005,112.5696943,26.85059766,112.5697049,26.8505579,112.5697157,26.8505174,112.5697268,26.8504759,112.5697376,26.85043546,112.5697479,26.85039631,112.5697583,26.85035632,112.569769,26.85031532,112.5697793,26.85027546,112.5697893,26.85023657,112.5697997,26.85019564,112.5698107,26.85015163,112.5698219,26.85010653,112.5698321,26.8500653,112.5698417,26.85002598,112.5698515,26.84998557,112.5698615,26.84994409,112.5698711,26.84990454,112.5698812,26.84986385,112.5698918,26.84982193,112.5699024,26.84978088,112.5699128,26.84974064,112.5699238,26.84969806,112.5699346,26.84965622,112.569945,26.84961514,112.5699557,26.84957283,112.5699663,26.84953049,112.5699772,26.84948722,112.5699876,26.84944638,112.5699983,26.84940488,112.570009,26.84936345,112.57002,26.84932117,112.5700303,26.84928134,112.5700409,26.84924079,112.5700518,26.8491992,112.5700621,26.84915954,112.5700727,26.8491187,112.5700833,26.8490776,112.5700944,26.84903516,112.5701051,26.8489945,112.5701161,26.84895247,112.5701271,26.84891002,112.5701384,26.84886612,112.5701492,26.84882402,112.5701606,26.84877956,112.5701718,26.84873609,112.5701827,26.84869375,112.5701938,26.84865055,112.5702048,26.84860776,112.5702158,26.84856529,112.5702268,26.8485228,112.5702382,26.84847919,112.5702493,26.84843653,112.5702603,26.84839485,112.5702715,26.848352,112.5702828,26.84830902,112.5702945,26.84826488,112.5703052,26.8482239,112.5703166,26.84817971,112.5703278,26.84813556,112.5703382,26.84809355,112.5703487,26.84805035,112.5703592,26.84800699,112.57037,26.8479623,112.5703803,26.8479196,112.5703909,26.84787565,112.5704018,26.84783026,112.570412,26.84778789,112.5704233,26.84774191,112.5704349,26.84769563,112.570446,26.84765133,112.5704563,26.84761025,112.5704663,26.8475702,112.5704764,26.84753009,112.5704865,26.84748987,112.5704967,26.8474496,112.5705069,26.84740932,112.5705171,26.84736909,112.5705271,26.84732902,112.5705369,26.84728922,112.5705466,26.84724972,112.5705562,26.84721025,112.5705668,26.84716626,112.5705776,26.84712107,112.5705886,26.84707583,112.5705999,26.84702942,112.5706107,26.84698518,112.5706216,26.84693969,112.5706323,26.84689405,112.5706416,26.84685284,112.5706517,26.84680806,112.5706608,26.84676669,112.5706698,26.84672647,112.5706787,26.84668626,112.5706888,26.84664152,112.5706994,26.84659467,112.5707094,26.84655054,112.5707195,26.84650579,112.5707294,26.84646167,112.5707392,26.8464178,112.5707492,26.84637281,112.5707587,26.84633008,112.5707686,26.84628626,112.5707786,26.8462413,112.5707883,26.84619855,112.5707984,26.84615469,112.5708087,26.84610965,112.5708187,26.84606559,112.5708286,26.84602245,112.5708386,26.84597801,112.5708489,26.84593231,112.5708586,26.84588861,112.5708685,26.84584351,112.5708785,26.84579714,112.5708871,26.84575753,112.5708955,26.84571792,112.5709038,26.84567829,112.5709132,26.84563323,112.5709222,26.84558947,112.5709313,26.84554459,112.5709406,26.84549855,112.5709496,26.84545356,112.5709584,26.84540959,112.5709675,26.84536402,112.5709769,26.84531752,112.5709851,26.84527773,112.5709933,26.84523775,112.5710016,26.84519755,112.5710098,26.84515713,112.5710181,26.84511659,112.5710263,26.84507603,112.5710345,26.84503528,112.5710427,26.84499453,112.5710509,26.84495367,112.5710591,26.84491286,112.5710672,26.84487214,112.5710754,26.84483149,112.5710846,26.84478523,112.5710925,26.84474496,112.5711013,26.8447002,112.5711105,26.84465306,112.5711191,26.84460815,112.571127,26.84456655,112.5711347,26.84452593,112.5711424,26.84448508,112.57115,26.84444403,112.5711577,26.8444028,112.571165,26.8443626,112.5711726,26.84432108,112.5711805,26.84427818,112.571188,26.8442375,112.5711962,26.84419424,112.5712043,26.84415208,112.5712123,26.8441098,112.5712203,26.84406849,112.5712286,26.84402576,112.5712372,26.84398154,112.5712456,26.84393827,112.571254,26.84389472,112.5712622,26.84385088,112.5712704,26.84380676,112.5712782,26.84376361,112.5712865,26.84371764,112.5712944,26.84367271,112.5713022,26.84362883,112.5713104,26.84358216,112.5713184,26.84353655,112.5713263,26.84349208,112.5713344,26.84344615,112.5713428,26.8433988,112.571351,26.84335266,112.5713591,26.84330645,112.5713672,26.84326013,112.5713751,26.84321383,112.5713831,26.84316752,112.571391,26.84312124,112.571399,26.84307506,112.5714069,26.84302917,112.5714143,26.8429849,112.5714221,26.84293842,112.5714296,26.84289371,112.5714368,26.84285079,112.5714443,26.84280575,112.5714514,26.84276205,112.5714584,26.8427197,112.5714654,26.8426762,112.5714726,26.84263154,112.5714795,26.84258815,112.5714863,26.84254605,112.5714934,26.84250158,112.5715002,26.84245846,112.5715068,26.84241668,112.5715137,26.8423725,112.5715205,26.84232956,112.5715271,26.8422866,112.5715338,26.84224355,112.5715404,26.84220166,112.5715471,26.84215849,112.5715539,26.84211527,112.5715609,26.84207078,112.5715677,26.84202744,112.5715745,26.84198409,112.5715811,26.84194197,112.5715878,26.84189863,112.5715945,26.84185531,112.5716012,26.84181201,112.5716083,26.84176755,112.5716152,26.84172559,112.5716224,26.84168113,112.5716292,26.84163906,112.5716361,26.84159567,112.5716428,26.84155208,112.5716495,26.84150697,112.5716558,26.8414629,112.5716621,26.84141857,112.5716681,26.84137527,112.5716743,26.84133048,112.5716804,26.84128548,112.5716863,26.84124022,112.5716922,26.8411947,112.5716982,26.84114767,112.5717038,26.84110308,112.5717098,26.84105704,112.5717158,26.84101086,112.5717222,26.84096328,112.5717283,26.84091824,112.5717347,26.84087052,112.5717408,26.84082539,112.5717472,26.84077764,112.5717533,26.84073261,112.5717595,26.84068633,112.5717657,26.84064021,112.5717717,26.8405942,112.5717776,26.84054829,112.5717835,26.84050127,112.571789,26.84045706,112.5717946,26.84041174,112.5718002,26.84036654,112.5718058,26.84032018,112.5718112,26.84027644,112.5718166,26.84023153,112.5718221,26.84018682,112.5718275,26.84014242,112.5718329,26.84009818,112.5718382,26.84005414,112.5718435,26.84001029,112.5718487,26.8399667,112.5718545,26.83991705,112.5718596,26.8398725,112.5718645,26.83982929,112.5718693,26.83978622,112.571874,26.83974449,112.5718789,26.83970042,112.5718836,26.83965766,112.5718883,26.83961497,112.5718927,26.83957366,112.5718974,26.83953004,112.5719019,26.8394877,112.5719061,26.83944662,112.5719104,26.83940439,112.5719148,26.83936105,112.5719191,26.83931893,112.5719233,26.83927806,112.5719275,26.83923605,112.5719317,26.83919408,112.5719358,26.83915211,112.57194,26.83910895,112.571944,26.83906821,112.5719481,26.83902626,112.5719523,26.8389844,112.5719566,26.83894137,112.571961,26.83890078,112.5719663,26.83885186,112.5719707,26.83881012,112.571975,26.83876837,112.5719791,26.83872667,112.5719834,26.83868499,112.571988,26.83863857,112.5719926,26.83859103,112.5719972,26.83854363,112.5720014,26.83850125,112.5720058,26.83845578,112.5720098,26.83841426,112.5720141,26.8383695,112.5720184,26.83832369,112.5720227,26.83827689,112.572027,26.83823128,112.5720312,26.83818691,112.5720357,26.83814037,112.57204,26.83809507,112.5720443,26.83805101,112.5720486,26.8380059,112.5720531,26.83795988,112.5720575,26.83791423,112.5720617,26.83787247,112.5720662,26.83782923,112.572071,26.8377853,112.5720758,26.83774361,112.5720807,26.83770091,112.5720857,26.83765715,112.5720904,26.83761439,112.5720949,26.83757271,112.5720996,26.83753004,112.5721046,26.83748653,112.5721096,26.83744437,112.5721145,26.83740363,112.5721197,26.83736224,112.572125,26.83732131,112.5721303,26.83728088,112.5721354,26.83724088,112.5721413,26.83719506,112.5721463,26.83715633,112.5721522,26.83711078,112.572158,26.83706731,112.5721641,26.837023,112.5721705,26.83697868,112.5721765,26.83693825,112.5721825,26.83689968,112.5721886,26.83685976,112.5721949,26.83681839,112.5722009,26.83677757,112.5722068,26.83673729,112.5722129,26.83669555,112.5722192,26.83665242,112.5722255,26.83660994,112.5722316,26.83656812,112.572238,26.83652481,112.5722444,26.83648114,112.5722509,26.83643723,112.5722575,26.83639331,112.5722642,26.83634823,112.5722708,26.83630512,112.5722776,26.83626056,112.5722846,26.83621557,112.5722919,26.83616898,112.5722982,26.83612874,112.5723046,26.83608814,112.5723111,26.83604724,112.5723177,26.83600605,112.5723245,26.83596463,112.5723311,26.83592419,112.5723382,26.83588113,112.5723453,26.83583914,112.5723523,26.83579702,112.5723594,26.83575467,112.5723666,26.83571207,112.572374,26.83566922,112.5723817,26.83562614,112.5723895,26.83558271,112.5723976,26.83553901,112.5724059,26.83549503,112.5724143,26.83545079,112.5724229,26.83540627,112.5724315,26.83536147,112.5724401,26.83531642,112.5724488,26.83527114,112.5724575,26.83522564,112.5724664,26.83517992,112.5724752,26.83513403,112.5724842,26.83508794,112.5724933,26.83504165,112.5725024,26.83499516,112.5725118,26.83494849,112.5725209,26.834903,112.5725308,26.83485461,112.5725403,26.8348087,112.5725506,26.8347599,112.5725606,26.83471224,112.5725708,26.8346645,112.5725806,26.83461812,112.5725911,26.83456913,112.5726011,26.83452165,112.5726109,26.83447571,112.572621,26.83442874,112.572631,26.8343821,112.5726414,26.83433449,112.5726516,26.83428852,112.5726613,26.83424417,112.5726714,26.83419885,112.5726813,26.83415383,112.5726916,26.83410786,112.5727013,26.83406474,112.5727114,26.83402068,112.5727214,26.83397694,112.5727315,26.83393352,112.5727418,26.83388918,112.5727515,26.83384759,112.5727615,26.83380507,112.5727715,26.83376283,112.5727815,26.83371968,112.5727909,26.8336792,112.5728009,26.83363665,112.5728104,26.83359677,112.5728217,26.83354905,112.5728314,26.83350861,112.572841,26.83346845,112.5728507,26.83342848,112.5728616,26.8333838,112.572873,26.83333783,112.5728849,26.83329071,112.5728965,26.83324462,112.5729067,26.83320424,112.572917,26.83316383,112.5729284,26.83311875,112.5729402,26.83307238,112.5729525,26.83302465,112.5729631,26.83298372,112.5729738,26.8329426,112.5729844,26.8329025,112.5729958,26.83285996,112.5730072,26.83281861,112.5730184,26.83277862,112.5730303,26.83273646,112.5730417,26.83269686,112.5730539,26.83265527,112.5730674,26.83260946,112.5730807,26.83256518,112.5730945,26.83251871,112.5731065,26.83247888,112.57312,26.83243315,112.5731319,26.83239295,112.5731433,26.83235378,112.5731555,26.83231219,112.5731674,26.83227166,112.5731794,26.83223112,112.5731914,26.83219068,112.5732032,26.83215049,112.5732161,26.83210599,112.5732293,26.83206025,112.5732425,26.83201454,112.573256,26.83196793,112.5732675,26.83192843,112.5732791,26.83188899,112.5732908,26.83184951,112.5733039,26.83180549,112.5733175,26.8317603,112.5733316,26.8317139,112.5733436,26.83167425,112.5733558,26.83163458,112.5733698,26.8315893,112.5733821,26.83154987,112.5733944,26.83151079,112.5734066,26.83147204,112.5734202,26.83142885,112.5734342,26.83138452,112.5734487,26.83133903,112.5734624,26.83129566,112.5734767,26.83125107,112.5734911,26.83120637,112.5735061,26.83116058,112.573519,26.83112147,112.573532,26.83108228,112.5735451,26.83104302,112.5735599,26.83099919,112.5735752,26.8309542,112.5735908,26.83090917,112.573607,26.83086304,112.573621,26.83082368,112.5736349,26.83078442,112.5736503,26.83074088,112.5736657,26.83069655,112.5736812,26.83065148,112.5736957,26.83060895,112.5737105,26.83056584,112.5737252,26.83052315,112.5737404,26.83047951,112.573755,26.83043811,112.5737699,26.83039589,112.5737851,26.83035311,112.5737998,26.83031175,112.5738143,26.83027152,112.5738295,26.83022924,112.5738443,26.83018799,112.5738588,26.83014777,112.5738736,26.83010652,112.5738883,26.83006519,112.5739035,26.8300227,112.573918,26.82998218,112.5739327,26.82994066,112.5739474,26.82989933,112.573962,26.82985842,112.5739762,26.82981797,112.5739904,26.82977773,112.5740048,26.82973659,112.5740185,26.82969752,112.5740324,26.82965751,112.5740466,26.82961668,112.57406,26.82957815,112.5740736,26.82953912,112.5740889,26.82949478,112.5741018,26.82945758,112.574115,26.82941969,112.5741286,26.82938128,112.5741418,26.82934446,112.5741565,26.82930484,112.5741718,26.82926535,112.5741873,26.82922699,112.5742027,26.82918967,112.5742192,26.82914978,112.5742349,26.82911184,112.5742491,26.82907713,112.5742631,26.82904236,112.5742775,26.82900665,112.5742914,26.82897283,112.5743051,26.82893948,112.5743175,26.82890905,112.5743294,26.82887934,112.5743412,26.82884938,112.5743534,26.82881806,112.5743662,26.82878494,112.5743792,26.82875159,112.5743932,26.82871695,112.5744066,26.82868419,112.574421,26.82864938,112.5744352,26.82861544,112.5744495,26.82858142,112.5744645,26.82854579,112.5744802,26.82850912,112.5744965,26.82847139,112.5745119,26.82843644,112.5745277,26.82840103,112.5745437,26.82836521,112.5745602,26.82832832,112.5745767,26.82829174,112.5745933,26.82825533,112.5746107,26.82821768,112.5746284,26.82817956,112.5746464,26.82814074,112.5746648,26.82810122,112.5746816,26.82806509,112.5746987,26.82802857,112.5747161,26.82799153,112.5747337,26.82795388,112.5747518,26.82791476,112.5747694,26.82787675,112.574788,26.82783641,112.574806,26.82779729,112.5748231,26.8277604,112.5748395,26.82772485,112.5748564,26.82768796,112.5748761,26.82764503,112.5748931,26.82760822,112.5749106,26.82757017,112.5749288,26.82753095,112.5749462,26.82749347,112.5749641,26.82745489,112.5749821,26.82741615,112.5750005,26.82737629,112.5750181,26.82733827,112.5750362,26.82729917,112.5750545,26.82725996,112.5750729,26.82722067,112.5750915,26.82718128,112.5751103,26.82714182,112.5751297,26.82710132,112.5751483,26.82706278,112.5751674,26.82702322,112.5751871,26.82698264,112.5752058,26.826944,112.5752251,26.82690436,112.5752444,26.82686463,112.5752644,26.8268238,112.5752836,26.82678487,112.5753034,26.82674487,112.5753233,26.82670481,112.5753432,26.82666475,112.5753631,26.82662487,112.5753828,26.82658516,112.5754031,26.82654453,112.5754223,26.82650587,112.5754421,26.82646619,112.5754619,26.82642647,112.5754823,26.82638576,112.5755017,26.826347,112.5755218,26.8263072,112.5755424,26.82626639,112.5755621,26.82622756,112.5755823,26.82618778,112.5756025,26.82614805,112.5756233,26.82610736,112.575643,26.82606871,112.5756633,26.82602905,112.5756843,26.82598828,112.5757044,26.8259494,112.5757253,26.8259094,112.5757462,26.82586928,112.5757678,26.82582818,112.5757884,26.82578909,112.5758095,26.82574899,112.5758308,26.82570888,112.5758521,26.8256687,112.5758736,26.82562842,112.5758957,26.82558697,112.5759169,26.82554742,112.5759365,26.82551078,112.5759557,26.82547503,112.575975,26.82543918,112.5759945,26.82540325,112.5760165,26.82536312,112.576037,26.82532598,112.5760593,26.82528568,112.5760823,26.82524415,112.5761058,26.82520135,112.5761282,26.82516047,112.5761512,26.8251184,112.5761715,26.82508155,112.5761918,26.8250446,112.5762122,26.8250075,112.5762328,26.82497025,112.5762536,26.8249329,112.5762747,26.82489549,112.576296,26.82485808,112.5763176,26.82482065,112.5763394,26.82478315,112.5763614,26.82474563,112.5763836,26.82470807,112.5764059,26.82467045,112.5764282,26.82463279,112.5764507,26.82459504,112.5764732,26.82455714,112.5764959,26.82451906,112.5765187,26.8244808,112.5765414,26.82444236,112.5765643,26.82440377,112.5765873,26.82436503,112.5766103,26.8243262,112.5766333,26.8242873,112.5766563,26.82424836,112.5766793,26.82420936,112.5767024,26.82417035,112.5767255,26.82413139,112.5767486,26.82409266,112.5767718,26.82405426,112.5767952,26.82401617,112.5768184,26.82397842,112.5768415,26.82394106,112.5768675,26.82389881,112.57689,26.8238624,112.5769121,26.82382648,112.5769377,26.82378503,112.5769617,26.82374607,112.5769862,26.82370623,112.5770106,26.82366648,112.5770325,26.8236307,112.577056,26.82359184,112.5770776,26.82355585,112.5770985,26.82352077,112.5771191,26.82348565,112.5771395,26.82345051,112.5771598,26.82341535,112.5771798,26.82338019,112.5772019,26.82334115,112.5772242,26.82330145,112.5772462,26.82326217,112.5772682,26.82322307,112.5772905,26.82318416,112.577313,26.82314536,112.5773362,26.82310578,112.5773584,26.8230684,112.5773813,26.82303052,112.5774047,26.82299227,112.5774275,26.82295555,112.5774498,26.82292036,112.5774726,26.82288478,112.577496,26.82284873,112.577518,26.82281481,112.5775436,26.82277584,112.5775668,26.8227404,112.5775889,26.82270667,112.5776116,26.82267202,112.577635,26.82263636,112.5776572,26.82260227,112.5776799,26.82256708,112.5777022,26.82253158,112.5777246,26.82249483,112.5777455,26.82245955,112.5777668,26.8224232,112.5777883,26.82238602,112.5778084,26.82235089,112.5778313,26.82231089,112.5778521,26.82227511,112.5778746,26.82223755,112.5778983,26.82219925,112.5779212,26.82216358,112.5779447,26.82212803,112.5779687,26.82209266,112.5779915,26.82205946,112.5780155,26.82202476,112.5780386,26.82199153,112.578063,26.82195673,112.5780866,26.82192336,112.5781108,26.82188914,112.5781349,26.82185496,112.5781588,26.82182106,112.578183,26.82178691,112.5782056,26.82175498,112.5782284,26.82172268,112.578252,26.82168907,112.5782738,26.82165769,112.578297,26.82162352,112.578319,26.82159035,112.57834,26.82155755,112.5783603,26.82152419,112.578379,26.82149185,112.5783968,26.82146083,112.5784156,26.8214279,112.5784338,26.82139713,112.5784526,26.82136704,112.5784737,26.82133537,112.5784954,26.82130434,112.5785179,26.82127371,112.5785392,26.82124509,112.5785613,26.82121474,112.5785826,26.82118459,112.578603,26.82115312,112.5786192,26.82112113,112.5786297,26.82108804,112.5786344,26.82105208,112.5786328,26.82101569,112.5786258,26.82097918,112.5786153,26.82094473,112.5786011,26.8209112,112.5785817,26.82087705,112.5785582,26.82084558,112.5785324,26.82081834,112.5785038,26.82079259,112.5784737,26.8207676,112.5784418,26.82074259,112.5784091,26.82071846,112.578379,26.82069718,112.5783473,26.82067552,112.5783147,26.82065364,112.5782815,26.82063157,112.5782474,26.82060937,112.5782152,26.82058867,112.5781801,26.8205663,112.5781471,26.8205455,112.5781091,26.82052165,112.5780759,26.82050087,112.578042,26.82047964,112.5780081,26.8204585,112.5779742,26.82043738,112.5779398,26.82041587,112.577907,26.82039532,112.5778726,26.82037382,112.57784,26.82035339,112.5778063,26.82033228,112.5777708,26.82030994,112.5777338,26.82028685";
+
+    private void loadRomaRoad() {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append(ROMA_ROAD).append(ROMA_ROAD_1);
+        setRoamTrajectory(buffer.toString());
+    }
+
     @Override
     public boolean onTouch(@Nullable MotionEvent motionEvent) {
         MogoMapListenerHandler.Companion.getMogoMapListenerHandler().onTouch(motionEvent);
@@ -782,6 +800,8 @@ public class AMapViewWrapper implements IMogoMapView,
                 return MAP_STYLE_VR_ANGLE_TOP;
             case 5:
                 return MAP_STYLE_VR_ANGLE_CROSS;
+            case 7:
+                return MAP_STYLE_VR_ROMA;
             default:
                 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 5e092f589e..d471356be8 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
@@ -6,6 +6,7 @@ import android.graphics.Point;
 import android.util.Pair;
 
 import com.mogo.eagle.core.data.config.FunctionBuildConfig;
+import com.mogo.eagle.core.data.map.MogoLatLng;
 import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
 import com.mogo.map.center.CenterLine;
 import com.mogo.map.marker.AMapInfoWindowAdapter;
@@ -41,6 +42,7 @@ import java.util.HashMap;
 import java.util.List;
 
 import mogo.telematics.pad.MessagePad;
+import mogo.yycp.api.proto.SocketDownData;
 
 /**
  * @author congtaowang
@@ -123,6 +125,24 @@ public class AMapWrapper implements IMogoMap {
         MarkerHelper.INSTANCE.updateBatchMarkerPositon(markerOptionsArrayList, false, FunctionBuildConfig.isBeautyMode ? 8.0f : 0f, 1, time, 1);
     }
 
+    @SuppressLint("NewApi")
+    @Override
+    public void updateBatchAiMarkerPosition(HashMap optionsArrayList) {
+        if (!checkAMap()) {
+            return;
+        }
+        ArrayList markerOptionsArrayList = new ArrayList<>();
+        optionsArrayList.forEach((s, trackedObject) -> {
+            MarkerSimpleData markerOptions = ObjectUtils.fromAiData(trackedObject);
+            if (markerOptions != null) {
+                markerOptionsArrayList.add(markerOptions);
+            }
+        });
+        long time = markerOptionsArrayList.get(0).getTime();
+        // 最后一个参数,是否管理锚点的删除
+        MarkerHelper.INSTANCE.updateBatchMarkerPositon(markerOptionsArrayList, false, FunctionBuildConfig.isBeautyMode ? 8.0f : 0f, 1, time, 0);
+    }
+
     @Override
     public String addPreVehicleModel(int type, int modelRes) {
         try {
diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java
index a0e6c9c882..e46f160a1a 100644
--- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java
+++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java
@@ -16,6 +16,7 @@ import com.mogo.map.uicontroller.VisualAngleMode;
 
 import java.util.List;
 
+
 /**
  * @author congtaowang
  * @since 2019-12-26
@@ -81,6 +82,23 @@ public class MogoMapUIController implements IMogoMapUIController {
         }
     }
 
+    @Override
+    public void setRoamTrajectory(String trajectory) {
+        initDelegate();
+        if (mDelegate != null) {
+            mDelegate.setRoamTrajectory(trajectory);
+        }
+    }
+
+    @Override
+    public void setRomaMode(int mode) {
+        initDelegate();
+        if (mDelegate != null) {
+            CallerLogger.INSTANCE.d(TAG, "set setRomaMode: " + mode);
+            mDelegate.setRomaMode(mode);
+        }
+    }
+
     @Override
     public VisualAngleMode getCurrentMapVisualAngle() {
         initDelegate();
diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMarkerManager.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMarkerManager.java
index b37d3934f3..ceb1a65a6b 100644
--- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMarkerManager.java
+++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMarkerManager.java
@@ -15,6 +15,7 @@ import java.util.List;
 import java.util.Map;
 
 import mogo.telematics.pad.MessagePad;
+import mogo.yycp.api.proto.SocketDownData;
 
 /**
  * @author congtaowang
@@ -29,17 +30,17 @@ public class MogoMarkerManager implements IMogoMarkerManager {
     private static volatile MogoMarkerManager sInstance;
     private Context mApplicationContext;
 
-    private MogoMarkerManager( Context context ) {
-        if ( context != null ) {
+    private MogoMarkerManager(Context context) {
+        if (context != null) {
             mApplicationContext = context.getApplicationContext();
         }
     }
 
-    public static MogoMarkerManager getInstance( Context context ) {
-        if ( sInstance == null ) {
-            synchronized ( MogoMarkerManager.class ) {
-                if ( sInstance == null ) {
-                    sInstance = new MogoMarkerManager( context );
+    public static MogoMarkerManager getInstance(Context context) {
+        if (sInstance == null) {
+            synchronized (MogoMarkerManager.class) {
+                if (sInstance == null) {
+                    sInstance = new MogoMarkerManager(context);
                 }
             }
         }
@@ -51,27 +52,27 @@ public class MogoMarkerManager implements IMogoMarkerManager {
     }
 
     @Override
-    public IMogoMarker addMarker( String tag, MogoMarkerOptions options ) {
+    public IMogoMarker addMarker(String tag, MogoMarkerOptions options) {
         try {
-            return MogoMap.getInstance().getMogoMap().addMarker( tag, options );
-        } catch ( Exception e ) {
+            return MogoMap.getInstance().getMogoMap().addMarker(tag, options);
+        } catch (Exception e) {
             e.printStackTrace();
             return null;
         }
     }
 
     @Override
-    public List< IMogoMarker > addMarkers( String tag, ArrayList< MogoMarkerOptions > options, boolean moveToCenter ) {
+    public List addMarkers(String tag, ArrayList options, boolean moveToCenter) {
         try {
-            return MogoMap.getInstance().getMogoMap().addMarkers( tag, options, moveToCenter );
-        } catch ( Exception e ) {
+            return MogoMap.getInstance().getMogoMap().addMarkers(tag, options, moveToCenter);
+        } catch (Exception e) {
             e.printStackTrace();
             return null;
         }
     }
 
     @Override
-    public void updateBatchMarkerPosition(HashMap optionsArrayList) {
+    public void updateBatchMarkerPosition(HashMap optionsArrayList) {
         try {
             MogoMap.getInstance().getMogoMap().updateBatchMarkerPosition(optionsArrayList);
         } catch (Exception e) {
@@ -79,6 +80,15 @@ public class MogoMarkerManager implements IMogoMarkerManager {
         }
     }
 
+    @Override
+    public void updateBatchAiMarkerPosition(HashMap optionsArrayList) {
+        try {
+            MogoMap.getInstance().getMogoMap().updateBatchAiMarkerPosition(optionsArrayList);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
     @Override
     public String addPreVehicleModel(int type, int modelRes) {
         try {
@@ -100,9 +110,9 @@ public class MogoMarkerManager implements IMogoMarkerManager {
 
 
     @Override
-    public void removeMarkers( String tag ) {
+    public void removeMarkers(String tag) {
         CallMarkersClearManager.INSTANCE.invokeClearAllMarkersOfTag(tag);
-        MogoMarkersHandler.Companion.getMogoMarkersHandler().remove( tag );
+        MogoMarkersHandler.Companion.getMogoMarkersHandler().remove(tag);
     }
 
     @Override
@@ -123,27 +133,27 @@ public class MogoMarkerManager implements IMogoMarkerManager {
     }
 
     @Override
-    public void inVisibleWithoutMarkers(String ...owner) {
+    public void inVisibleWithoutMarkers(String... owner) {
         MogoMarkersHandler.Companion.getMogoMarkersHandler().inVisibleMarkers(owner);
     }
 
     @Override
-    public List< IMogoMarker > getMarkers( String tag ) {
-        return MogoMarkersHandler.Companion.getMogoMarkersHandler().getMarkers( tag );
+    public List getMarkers(String tag) {
+        return MogoMarkersHandler.Companion.getMogoMarkersHandler().getMarkers(tag);
     }
 
     @Override
-    public Map< String, List< IMogoMarker > > getAllMarkers() {
+    public Map> getAllMarkers() {
         return MogoMarkersHandler.Companion.getMogoMarkersHandler().getAllMarkers();
     }
 
     @Override
-    public void removeMarkersExcept( String tag ) {
-        MogoMarkersHandler.Companion.getMogoMarkersHandler().deleteAllExcept( tag );
+    public void removeMarkersExcept(String tag) {
+        MogoMarkersHandler.Companion.getMogoMarkersHandler().deleteAllExcept(tag);
     }
 
     @Override
-    public void addRouteWay(Context context, MogoLatLng startPoint, MogoLatLng endPoint, List< MogoLatLng > wayPoints ) {
+    public void addRouteWay(Context context, MogoLatLng startPoint, MogoLatLng endPoint, List wayPoints) {
     }
 
     @Override
diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java
index 7c2283a699..9da7c35e7a 100644
--- a/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java
+++ b/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java
@@ -11,6 +11,7 @@ import com.zhidaoauto.map.sdk.open.MapAutoApi;
 
 import java.util.List;
 
+
 /**
  * @author congtaowang
  * @since 2019-12-26
@@ -19,8 +20,6 @@ import java.util.List;
  */
 public class AMapUIController implements IMogoMapUIController {
 
-    private static final String TAG = "AMapUIController";
-
     private static volatile AMapUIController sInstance;
 
     private IMogoMapUIController mClient;
@@ -70,6 +69,20 @@ public class AMapUIController implements IMogoMapUIController {
         }
     }
 
+    @Override
+    public void setRoamTrajectory(String trajectory) {
+        if (mClient != null) {
+            mClient.setRoamTrajectory(trajectory);
+        }
+    }
+
+    @Override
+    public void setRomaMode(int mode) {
+        if (mClient != null) {
+            mClient.setRomaMode(mode);
+        }
+    }
+
     @Override
     public VisualAngleMode getCurrentMapVisualAngle() {
         if (mClient != null) {
diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java
index eeae86dd6b..95f035487e 100644
--- a/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java
+++ b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import mogo.telematics.pad.MessagePad;
+import mogo.yycp.api.proto.SocketDownData;
 
 /**
  * @author congtaowang
@@ -117,6 +118,26 @@ public class ObjectUtils {
         return markerOptions;
     }
 
+    public static MarkerSimpleData fromAiData(SocketDownData.CloudRoadDataProto aiData) {
+        if (aiData == null) {
+            return null;
+        }
+        MarkerSimpleData markerOptions = null;
+        try {
+            markerOptions = new MarkerSimpleData();
+            markerOptions.setId(aiData.getUuid().hashCode());
+            markerOptions.setMarkerType(aiData.getType());
+            markerOptions.setRotateAngle((float) aiData.getHeading());
+            markerOptions.setLat(aiData.getWgslat());
+            markerOptions.setLon(aiData.getWgslon());
+            markerOptions.setTime(Double.valueOf(aiData.getSatelliteTime()).longValue());
+            markerOptions.setColor("#00FF00FF");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return markerOptions;
+    }
+
     private static BitmapDescriptor getBitmapDescriptorFromMogo(MogoMarkerOptions options) {
         if (options == null) {
             return null;
diff --git a/libraries/mogo-obu/build.gradle b/libraries/mogo-obu/build.gradle
index e3dc611b6f..bbd5333e3a 100644
--- a/libraries/mogo-obu/build.gradle
+++ b/libraries/mogo-obu/build.gradle
@@ -1,6 +1,5 @@
 plugins {
     id 'com.android.library'
-    id 'com.google.protobuf'
 }
 
 android {
@@ -21,31 +20,6 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
-    sourceSets {
-        main {
-            proto {
-                srcDir 'src/main/proto'
-                include '**/*.proto'
-            }
-        }
-    }
-
-    protobuf {
-        protoc {
-            artifact = rootProject.ext.dependencies.protoc
-        }
-
-        generateProtoTasks {
-            all().each { task ->
-                task.builtins {
-                    remove java
-                }
-                task.builtins {
-                    java {}
-                }
-            }
-        }
-    }
 
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
@@ -54,8 +28,7 @@ android {
 }
 
 dependencies {
-    api project(':libraries:mogo-adas-data')
-    api rootProject.ext.dependencies.protobuf_java
-    api rootProject.ext.dependencies.protobuf_java_util
+    implementation project(':libraries:mogo-adas-data')
+    implementation rootProject.ext.dependencies.androidxappcompat
     api rootProject.ext.dependencies.mogoobu
 }
diff --git a/libraries/mogo-obu/src/main/java/com/zhidao/support/obu/ObuManager.java b/libraries/mogo-obu/src/main/java/com/zhidao/support/obu/ObuManager.java
new file mode 100644
index 0000000000..9844746ece
--- /dev/null
+++ b/libraries/mogo-obu/src/main/java/com/zhidao/support/obu/ObuManager.java
@@ -0,0 +1,825 @@
+package com.zhidao.support.obu;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.mogo.support.obu.MogoObuManager;
+import com.mogo.support.obu.ObuBase;
+import com.mogo.support.obu.ObuScene;
+import com.mogo.support.obu.OnMogoObuListener;
+import com.mogo.support.obu.constants.MogoObuConstants;
+import com.mogo.support.obu.constants.MogoObuTopicId;
+import com.mogo.support.obu.model.MogoObuHvBasicsData;
+import com.mogo.support.obu.model.MogoObuMapMathData;
+import com.mogo.support.obu.model.MogoObuRsiWarningData;
+import com.mogo.support.obu.model.MogoObuRsmWarningData;
+import com.mogo.support.obu.model.MogoObuRvWarningData;
+import com.mogo.support.obu.model.MogoObuSpatWarningData;
+import com.mogo.support.obu.model.advance.AccFourAxes;
+import com.mogo.support.obu.model.advance.DateTime;
+import com.mogo.support.obu.model.advance.NodeId;
+import com.mogo.support.obu.model.advance.Participant;
+import com.mogo.support.obu.model.advance.PositionLLV;
+import com.mogo.support.obu.model.advance.RsiWarning;
+import com.mogo.support.obu.model.advance.SpatLight;
+import com.mogo.support.obu.model.advance.V2xWarning;
+import com.mogo.support.obu.model.advance.VehBasics;
+import com.mogo.support.obu.model.advance.VehControl;
+import com.mogo.support.obu.model.advance.VehSize;
+import com.mogo.support.obu.model.advance.VerticalLLV;
+import com.mogo.support.obu.model.advance.WarningData;
+import com.mogo.support.obu.option.MogoObuLog;
+import com.mogo.support.obu.option.MogoObuOptions;
+import com.mogo.support.obu.upgrade.OnUpgradeListener;
+
+import java.util.List;
+import java.util.Set;
+
+import mogo.telematics.pad.MessagePad;
+
+public class ObuManager {
+    private static final String TAG = ObuManager.class.getSimpleName();
+    private static volatile ObuManager INSTANCE;
+    private OnObuListener listener;
+
+    public static ObuManager getInstance() {
+        if (INSTANCE == null) {
+            synchronized (ObuManager.class) {
+                if (INSTANCE == null) {
+                    INSTANCE = new ObuManager();
+                }
+            }
+        }
+        return INSTANCE;
+    }
+
+    /**
+     * 获取当前连接状态
+     *
+     * @return 连接状态
+     * @since 1.0.0
+     */
+    public int getConnectStatus() {
+        return MogoObuManager.getInstance().getConnectStatus();
+    }
+
+    /**
+     * 获取已连接的OBU IP 断开连接会置null
+     *
+     * @return IP
+     * @since 1.0.0
+     */
+    public String getConnectedIp() {
+        return MogoObuManager.getInstance().getConnectedIp();
+    }
+
+    /**
+     * 获取已连接的OBU 端口 断开连接会置null
+     *
+     * @return 端口
+     * @since 1.0.0
+     */
+    public int getConnectedPort() {
+        return MogoObuManager.getInstance().getConnectedPort();
+    }
+
+    /**
+     * 获取当前SDK版本
+     *
+     * @return 版本
+     * @since 1.0.0
+     */
+    public String getVersion() {
+        return MogoObuManager.getInstance().getVersion();
+    }
+
+    /**
+     * 获取当前SO版本号
+     *
+     * @return 版本 未连接为null
+     * @since 1.0.0
+     */
+    public String getSoVersion() {
+        return MogoObuManager.getInstance().getSoVersion();
+    }
+
+    /**
+     * 获取当前OBU软件版本
+     * 需主动调用获取{@link MogoObuManager#getObuVersion(Context, String, OnUpgradeListener)}
+     *
+     * @return 版本 null表示 无法连接OBU;无法获取版本;
+     * @since 1.1.0
+     */
+    @Nullable
+    public String getObuVersion() {
+        return MogoObuManager.getInstance().getObuVersion();
+    }
+
+    /**
+     * 获取已注册的 Topic ID
+     *
+     * @return Topic ID
+     * @since 1.0.0
+     */
+    public List getRegisteredTopicId() {
+        return MogoObuManager.getInstance().getRegisteredTopicId();
+    }
+
+    /**
+     * 获取未注册的 Topic ID
+     *
+     * @return Topic ID
+     * @since 1.0.0
+     */
+    public List getUnregisteredTopicId() {
+        return MogoObuManager.getInstance().getUnregisteredTopicId();
+    }
+
+    /**
+     * 注册回调 包括连接状态以及数据回调
+     *
+     * @param obuListener 数据回调接口
+     * @since 1.0.0
+     */
+    public void registerObuListener(OnObuListener obuListener) {
+        this.listener = obuListener;
+        MogoObuManager.getInstance().registerMogoObuListener(mogoObuListener);
+    }
+
+    /**
+     * 取消注册
+     *
+     * @since 1.0.0
+     */
+    public void unregisterObuListener() {
+        MogoObuManager.getInstance().unregisterMogoObuListener();
+        listener = null;
+    }
+
+
+    /**
+     * 连接
+     * 调用结果异步返回 listener.onMogoObuCallResult(BaseResult result)
+     * 异步结果回调回调顺序 每次一种类型
+     * 1.result.function == MogoObuConstants.CALL_FUNCTION.CONFIG onMogoObuCallResult(MogoObuCallConfigResult result) 连接配置或日志配置(如果有配置)
+     * 2.result.function == MogoObuConstants.CALL_FUNCTION.INIT onMogoObuCallResult(MogoObuCallResult result)  初始化,进行连接操作
+     * 3.result.function == MogoObuConstants.CALL_FUNCTION.TOPIC_REGIST onMogoObuCallResult(MogoObuCallRegisterResult result)  注册Topic ID(如果有配置)
+     *
+     * @param options 参数
+     * @since 1.0.0
+     */
+    public void connect(MogoObuOptions options) {
+        MogoObuManager.getInstance().connect(options);
+    }
+
+
+    /**
+     * 断开连接
+     * 调用结果异步返回 listener.onMogoObuCallResult(BaseResult result)
+     *
+     * @since 1.0.1
+     */
+    public void disconnect() {
+        MogoObuManager.getInstance().disconnect();
+    }
+
+
+    /**
+     * 注册Topic
+     * 调用结果异步返回 listener.onMogoObuCallResult(BaseResult result)
+     * result.function == MogoObuConstants.CALL_FUNCTION.TOPIC_REGIST onMogoObuCallResult(MogoObuCallRegisterResult result)
+     * 此版本支持的Topic ID
+     * MogoObuTopicId.HV_BASIC
+     * MogoObuTopicId.RV_WARNING
+     * MogoObuTopicId.SPAT_WARNING
+     * MogoObuTopicId.RSI_WARNING
+     * MogoObuTopicId.RSM_WARNING
+     * MogoObuTopicId.MAP_MATCH
+     *
+     * @param topicId id
+     * @since 1.0.0
+     */
+    public void registerTopic(MogoObuTopicId topicId) {
+        MogoObuManager.getInstance().registerTopic(topicId);
+    }
+
+    /**
+     * 注册多个Topic
+     * 调用结果异步返回 listener.onMogoObuCallResult(BaseResult result)
+     * result.function == MogoObuConstants.CALL_FUNCTION.TOPIC_REGIST onMogoObuCallResult(MogoObuCallRegisterResult result)
+     * 此版本支持的Topic ID
+     * MogoObuTopicId.HV_BASIC
+     * MogoObuTopicId.RV_WARNING
+     * MogoObuTopicId.SPAT_WARNING
+     * MogoObuTopicId.RSI_WARNING
+     * MogoObuTopicId.RSM_WARNING
+     * MogoObuTopicId.MAP_MATCH
+     *
+     * @param topicIds ids
+     * @since 1.0.0
+     */
+    public void registerTopic(Set topicIds) {
+        MogoObuManager.getInstance().registerTopic(topicIds);
+    }
+
+    /**
+     * 取消注册Topic
+     * 调用结果异步返回 listener.onMogoObuCallResult(BaseResult result)
+     *
+     * @param topicId id
+     * @since @since 1.0.1
+     */
+    public void unregisterTopic(MogoObuTopicId topicId) {
+        MogoObuManager.getInstance().unregisterTopic(topicId);
+    }
+
+    /**
+     * 取消注册多个Topic
+     * 调用结果异步返回 listener.onMogoObuCallResult(BaseResult result)
+     *
+     * @param topicIds ids
+     * @since 1.0.1
+     */
+    public void unregisterTopic(Set topicIds) {
+        MogoObuManager.getInstance().unregisterTopic(topicIds);
+    }
+
+    /**
+     * OBU SDK 日志配置
+     * 支持日志输出至LogCat和写入文件
+     * 调用结果异步返回 listener.onMogoObuCallResult(BaseResult result)
+     * result.function == MogoObuConstants.CALL_FUNCTION.CONFIG onMogoObuCallResult(MogoObuCallConfigResult result) 日志配置
+     *
+     * @param log 日志配置
+     * @since 1.0.0
+     */
+    public void logConfig(MogoObuLog log) {
+        MogoObuManager.getInstance().logConfig(log);
+    }
+
+    /**
+     * 配置Android日志
+     *
+     * @param isEnableLog 是否开启日志输出
+     * @since 1.0.0
+     */
+    public void setEnableLog(boolean isEnableLog) {
+        MogoObuManager.getInstance().setEnableLog(isEnableLog);
+    }
+
+
+    /**
+     * 检查更新
+     *
+     * @param obuIp    OBU IP
+     * @param listener 升级回调
+     * @since 1.1.0
+     */
+    public boolean checkObuUpgrade(@NonNull Context context, @NonNull String obuIp, OnUpgradeListener listener) {
+        return MogoObuManager.getInstance().checkObuUpgrade(context, obuIp, listener);
+    }
+
+    /**
+     * 检查更新
+     *
+     * @param context      上下文
+     * @param obuIp        OBU IP
+     * @param isUpgradeNow 是否立即升级
+     *                     false:OBU设备下次上电时执行升级程序
+     *                     ture: OBU设备立即执行升级程序 TODO 警告:执行立即升级时请确保车辆是静止状态。车辆在运行过程中升级设备可能会影响驾驶,严重时可能造成安全隐患!!!
+     * @param listener     升级回调
+     * @return 是否调用成功
+     * @since 1.1.0
+     */
+    public boolean checkObuUpgrade(@NonNull Context context, @NonNull String obuIp, boolean isUpgradeNow, OnUpgradeListener listener) {
+        return MogoObuManager.getInstance().checkObuUpgrade(context, obuIp, isUpgradeNow, listener);
+    }
+
+    /**
+     * 获取当前连接OBU的版本号
+     * 如果调用 {@link MogoObuManager#checkObuUpgrade(Context, String, OnUpgradeListener)}方法可以不用调用此方法,检查更新会获取版本号
+     *
+     * @param context  上下文
+     * @param obuIp    OBU IP
+     * @param listener 升级回调
+     * @return 是否调用成功
+     * @since 1.1.0
+     */
+    public boolean getObuVersion(@NonNull Context context, @NonNull String obuIp, OnUpgradeListener listener) {
+        return MogoObuManager.getInstance().getObuVersion(context, obuIp, listener);
+    }
+
+    /**
+     * 传入升级包版本
+     *
+     * @param newVersion 升级包版本
+     * @since 1.1.0
+     */
+    public void setObuUpgradePackageVersion(@NonNull String newVersion) {
+        MogoObuManager.getInstance().setObuUpgradePackageVersion(newVersion);
+    }
+
+    /**
+     * 传入升级包
+     *
+     * @param newUpgradePackage 升级包文件绝对路径 只能包含 升级包MD5文件和升级包文件
+     * @since 1.1.0
+     */
+    public void setObuUpgradePackage(@NonNull String[] newUpgradePackage) {
+        MogoObuManager.getInstance().setObuUpgradePackage(newUpgradePackage);
+    }
+
+    /**
+     * 停止升级或停止版本查询
+     *
+     * @since 1.1.0
+     */
+    public void stopObuUpgrade() {
+        MogoObuManager.getInstance().stopObuUpgrade();
+    }
+
+    private final OnMogoObuListener mogoObuListener = new OnMogoObuListener() {
+        @Override
+        public void onConnectStatus(int connectStatus) {
+            if (listener != null) {
+                listener.onConnectStatus(connectStatus);
+            }
+        }
+
+        @Override
+        public void onMogoObuHvBasics(MogoObuHvBasicsData data) {
+            if (listener != null) {
+//                ObuScene.HvBasicsData.Builder builder = ObuScene.HvBasicsData.newBuilder();
+//                builder.setStatus(data.getStatus());
+                VehBasics vehBasics = data.getVehBasicsMsg();
+//                if (vehBasics != null) {
+//                    builder.setVehBasicsMsg(getVehBasics(vehBasics));
+//                }
+//                listener.onObuHvBasics(builder.build());
+
+
+                //转工控机PB 赋值的包括 satelliteTime systemTime latitude longitude altitude heading gnssSpeed acceleration vehicleSpeed 未赋值:yawRate
+                if (vehBasics != null) {
+                    MessagePad.GnssInfo.Builder gnssInfoBuilder = MessagePad.GnssInfo.newBuilder();
+                    if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.SEC_MARK)) {
+                        double time = vehBasics.getSecMark() / 1000.0D;
+                        gnssInfoBuilder.setSatelliteTime(time);
+                        gnssInfoBuilder.setSystemTime(time);
+                    }
+                    if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.LATITUDE)) {
+                        gnssInfoBuilder.setLatitude(vehBasics.getLatitude());
+                    }
+                    if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.LONGITUDE)) {
+                        gnssInfoBuilder.setLongitude(vehBasics.getLongitude());
+                    }
+                    if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.ELEVATION)) {
+                        gnssInfoBuilder.setAltitude(vehBasics.getElevation());
+                    }
+                    if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.SPEED)) {
+                        gnssInfoBuilder.setGnssSpeed(vehBasics.getSpeed());
+                        gnssInfoBuilder.setVehicleSpeed(vehBasics.getSpeed());
+                    }
+                    if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.HEADING)) {
+                        gnssInfoBuilder.setHeading(vehBasics.getHeading());
+                    }
+                    if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.ACC_FOUR_AXES)) {
+                        AccFourAxes accFourAxes = vehBasics.getAccFourAxes();
+                        if (accFourAxes != null) {
+                            gnssInfoBuilder.setAcceleration(accFourAxes.getAccLng());
+                        }
+                    }
+                    listener.onGnssInfo(gnssInfoBuilder.build());
+                }
+            }
+        }
+
+        @Override
+        public void onMogoObuRvWarning(MogoObuRvWarningData data) {
+            super.onMogoObuRvWarning(data);
+            if (listener != null) {
+                ObuScene.RvWarningData.Builder builder = ObuScene.RvWarningData.newBuilder();
+                builder.setStatus(data.getStatus());
+                VehBasics vehBasics = data.getVehBasicsMsg();
+                if (vehBasics != null) {
+                    builder.setVehBasicsMsg(getVehBasics(vehBasics));
+                }
+                V2xWarning v2xWarning = data.getWarningMsg();
+                if (v2xWarning != null) {
+                    builder.setWarningMsg(getV2xWarning(v2xWarning));
+                }
+                listener.onObuRvWarning(builder.build());
+
+            }
+        }
+
+        @Override
+        public void onMogoObuSpatWarning(MogoObuSpatWarningData data) {
+            super.onMogoObuSpatWarning(data);
+            if (listener != null) {
+                ObuScene.SpatWarningData.Builder builder = ObuScene.SpatWarningData.newBuilder();
+                builder.setStatus(data.getStatus()).setWarningType(data.getWarningType());
+                List lights = data.getLights();
+                if (lights != null && !lights.isEmpty()) {
+                    for (SpatLight light : lights) {
+                        builder.addLights(ObuBase.SpatLight.newBuilder()
+                                .setPhaseID(light.getPhaseId())
+                                .setManeuvers(light.getManeuvers())
+                                .setLight(light.getLight())
+                                .setCountDown(light.getCountDown())
+                                .setSuggestMaxSpeed(light.getSuggestMaxSpeed())
+                                .setSuggestMinSpeed(light.getSuggestMinSpeed()));
+                    }
+                }
+                listener.onObuSpatWarning(builder.build());
+            }
+        }
+
+        @Override
+        public void onMogoObuRsiWarning(MogoObuRsiWarningData data) {
+            super.onMogoObuRsiWarning(data);
+            if (listener != null) {
+                ObuScene.RsiWarningData.Builder builder = ObuScene.RsiWarningData.newBuilder();
+                builder.setStatus(data.getStatus());
+                List list = data.getWarningMsg();
+                if (list != null && !list.isEmpty()) {
+                    for (RsiWarning warning : list) {
+                        ObuBase.RsiWarning.Builder rsiBuilder = ObuBase.RsiWarning.newBuilder();
+                        rsiBuilder.setUnitMask(warning.getUnitMask());
+                        if (warning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_RSI_WARNING.SCENE_TYPE)) {
+                            rsiBuilder.setSceneType(warning.getSceneType());
+                        }
+                        if (warning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_RSI_WARNING.POSITION)) {
+                            PositionLLV positionLLV = warning.getPosition();
+                            int present = positionLLV.getPresent();//由于OBU数据没有给偏移量默认使用的是7
+                            double longitude = positionLLV.getLongitude();
+                            double latitude = positionLLV.getLatitude();
+                            ObuBase.PositionOffset.Builder positionOffsetBuilder = ObuBase.PositionOffset.newBuilder();
+                            if (present == 1) {
+                                positionOffsetBuilder.setPositionLL1(ObuBase.PositionLL1.newBuilder()
+                                        .setLongitude(longitude)
+                                        .setLatitude(latitude));
+                            } else if (present == 2) {
+                                positionOffsetBuilder.setPositionLL2(ObuBase.PositionLL2.newBuilder()
+                                        .setLongitude(longitude)
+                                        .setLatitude(latitude));
+                            } else if (present == 3) {
+                                positionOffsetBuilder.setPositionLL3(ObuBase.PositionLL3.newBuilder()
+                                        .setLongitude(longitude)
+                                        .setLatitude(latitude));
+                            } else if (present == 4) {
+                                positionOffsetBuilder.setPositionLL4(ObuBase.PositionLL4.newBuilder()
+                                        .setLongitude(longitude)
+                                        .setLatitude(latitude));
+                            } else if (present == 5) {
+                                positionOffsetBuilder.setPositionLL5(ObuBase.PositionLL5.newBuilder()
+                                        .setLongitude(longitude)
+                                        .setLatitude(latitude));
+                            } else if (present == 6) {
+                                positionOffsetBuilder.setPositionLL6(ObuBase.PositionLL6.newBuilder()
+                                        .setLongitude(longitude)
+                                        .setLatitude(latitude));
+                            } else {
+                                positionOffsetBuilder.setPositionLatLon(ObuBase.PositionLatLon.newBuilder()
+                                        .setLongitude(longitude)
+                                        .setLatitude(latitude));
+                            }
+                            VerticalLLV verticalLLV = positionLLV.getVertical();
+                            present = verticalLLV.getPresent();//由于OBU数据没有给偏移量默认使用的是7
+                            double elevation = verticalLLV.getElevation();
+                            ObuBase.VerticalLLV.Builder verticalLLVBuilder = ObuBase.VerticalLLV.newBuilder();
+                            if (present == 1) {
+                                verticalLLVBuilder.setOffset1(elevation);
+                            } else if (present == 2) {
+                                verticalLLVBuilder.setOffset2(elevation);
+                            } else if (present == 3) {
+                                verticalLLVBuilder.setOffset3(elevation);
+                            } else if (present == 4) {
+                                verticalLLVBuilder.setOffset4(elevation);
+                            } else if (present == 5) {
+                                verticalLLVBuilder.setOffset5(elevation);
+                            } else if (present == 6) {
+                                verticalLLVBuilder.setOffset6(elevation);
+                            } else {
+                                verticalLLVBuilder.setElevation(elevation);
+                            }
+                            rsiBuilder.setPosition(ObuBase.PositionLLV.newBuilder()
+                                    .setPosition(positionOffsetBuilder)
+                                    .setVertical(verticalLLVBuilder));
+                        }
+                        if (warning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_RSI_WARNING.SIGN_SERIAL_NUM)) {
+                            rsiBuilder.setSignSerialNum(warning.getSignSerialNum());
+                        }
+                        if (warning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_RSI_WARNING.EVENT_SERIAL_NUM)) {
+                            rsiBuilder.setEventSerialNum(warning.getEventSerialNum());
+                        }
+                        if (warning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_RSI_WARNING.SPEED_MAX_LIMIT)) {
+                            rsiBuilder.setSpeedMaxLimit(warning.getSpeedMaxLimit());
+                        }
+                        if (warning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_RSI_WARNING.SPEED_MIN_LIMIT)) {
+                            rsiBuilder.setSpeedMinLimit(warning.getSpeedMinLimit());
+                        }
+                        if (warning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_RSI_WARNING.EVENT_RADIUS)) {
+                            rsiBuilder.setEventRadius(warning.getEventRadius());
+                        }
+                        if (warning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_RSI_WARNING.WARNING_LEVEL)) {
+                            rsiBuilder.setWarningLevel(warning.getWarningLevel());
+                        }
+                        if (warning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_RSI_WARNING.TARGET_POSITION)) {
+                            rsiBuilder.setTargetPosition(warning.getTargetPosition());
+                        }
+                        if (warning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_RSI_WARNING.DISTANCE)) {
+                            rsiBuilder.setDistance(warning.getDistance());
+                        }
+                        builder.addWarningMsg(rsiBuilder);
+                    }
+                }
+                listener.onObuRsiWarning(builder.build());
+            }
+        }
+
+        @Override
+        public void onMogoObuRsmWarning(MogoObuRsmWarningData data) {
+            super.onMogoObuRsmWarning(data);
+            if (listener != null) {
+                ObuScene.RsmWarningData.Builder builder = ObuScene.RsmWarningData.newBuilder();
+                builder.setStatus(data.getStatus());
+                Participant participant = data.getParticipant();
+                if (participant != null) {
+                    ObuBase.Participant.Builder participantBuilder = ObuBase.Participant.newBuilder();
+                    participantBuilder.setPtcType(participant.getPtcType())
+                            .setPtcId(participant.getPtcId())
+                            .setSource(participant.getSource())
+                            .setSecMark(participant.getSecMark())
+                            .setLatitude(participant.getLatitude())
+                            .setLongitude(participant.getLongitude())
+                            .setSpeed(participant.getSpeed())
+                            .setHeading(participant.getHeading());
+                    AccFourAxes accFourAxes = participant.getAccFourAxes();
+                    if (accFourAxes != null) {
+                        participantBuilder.setAccFourAxes(getAccFourAxes(accFourAxes));
+                    }
+                    VehSize vehicleSize = participant.getPtcSize();
+                    if (vehicleSize != null) {
+                        participantBuilder.setPtcSize(getVehSize(vehicleSize));
+                    }
+                    participantBuilder.setVehicleClass(participant.getVehicleClass())
+                            .setTargetPosition(participant.getTargetPosition());
+                    builder.setParticipant(participantBuilder);
+                }
+                V2xWarning v2xWarning = data.getWarningMsg();
+                if (v2xWarning != null) {
+                    builder.setWarningMsg(getV2xWarning(v2xWarning));
+                }
+                listener.onObuRsmWarning(builder.build());
+            }
+        }
+
+        @Override
+        public void onMogoObuMapMath(MogoObuMapMathData data) {
+            super.onMogoObuMapMath(data);
+            if (listener != null) {
+                ObuScene.MapMatchData.Builder builder = ObuScene.MapMatchData.newBuilder();
+                builder.setStatus(data.getStatus()).setUnitMask(data.getUnitMask());
+                if (data.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_MAP_MATH.CURRENT_NODE_ID)) {
+                    NodeId nodeId = data.getCurrentNodeId();
+                    if (nodeId != null) {
+                        builder.setCurrentNodeID(ObuBase.NodeId.newBuilder()
+                                .setRegion(nodeId.getRegion())
+                                .setId(nodeId.getId()));
+                    }
+                }
+                if (data.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_MAP_MATH.UPSTREAM_NODE_ID)) {
+                    NodeId nodeId = data.getUpstreamNodeId();
+                    if (nodeId != null) {
+                        builder.setUpstreamNodeID(ObuBase.NodeId.newBuilder()
+                                .setRegion(nodeId.getRegion())
+                                .setId(nodeId.getId()));
+                    }
+                }
+                if (data.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_MAP_MATH.MATCHING_LANE_ID)) {
+                    builder.setMatchingLaneID(data.getMatchingLaneId());
+                }
+                if (data.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_MAP_MATH.SPEED_MAX_LIMIT)) {
+                    builder.setSpeedMaxLimit(data.getSpeedMaxLimit());
+                }
+                if (data.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_MAP_MATH.SPEED_MIN_LIMIT)) {
+                    builder.setSpeedMinLimit(data.getSpeedMinLimit());
+                }
+                listener.onObuMapMath(builder.build());
+            }
+        }
+    };
+
+    private ObuBase.AccFourAxes.Builder getAccFourAxes(AccFourAxes accFourAxes) {
+        return ObuBase.AccFourAxes.newBuilder()
+                .setAccLng(accFourAxes.getAccLng())
+                .setAccLat(accFourAxes.getAccLat())
+                .setAccVert(accFourAxes.getAccVert())
+                .setAccYaw(accFourAxes.getAccYaw());
+    }
+
+    private ObuBase.VehicleSize.Builder getVehSize(VehSize vehSize) {
+        return ObuBase.VehicleSize.newBuilder()
+                .setWidth(vehSize.getWidth())
+                .setLength(vehSize.getLength())
+                .setHeight(vehSize.getHeight());
+    }
+
+    private ObuBase.VehicleBasics.Builder getVehBasics(VehBasics vehBasics) {
+        ObuBase.VehicleBasics.Builder builder = ObuBase.VehicleBasics.newBuilder();
+        builder.setUnitMask(vehBasics.getUnitMask());
+        if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.ID)) {
+            builder.setId(vehBasics.getId());
+        }
+        if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.SEC_MARK)) {
+            builder.setSecMark(vehBasics.getSecMark());
+        }
+        if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.LATITUDE)) {
+            builder.setLatitude(vehBasics.getLatitude());
+        }
+        if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.LONGITUDE)) {
+            builder.setLongitude(vehBasics.getLongitude());
+        }
+        if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.ELEVATION)) {
+            builder.setElevation(vehBasics.getElevation());
+        }
+        if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.SPEED)) {
+            builder.setSpeed(vehBasics.getSpeed());
+        }
+        if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.HEADING)) {
+            builder.setHeading(vehBasics.getHeading());
+        }
+        if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.ACC_FOUR_AXES)) {
+            AccFourAxes accFourAxes = vehBasics.getAccFourAxes();
+            if (accFourAxes != null) {
+                builder.setAccFourAxes(getAccFourAxes(accFourAxes));
+            }
+        }
+        if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.VEH_SIZE)) {
+            VehSize vehicleSize = vehBasics.getVehSize();
+            if (vehicleSize != null) {
+                builder.setVehSize(getVehSize(vehicleSize));
+            }
+        }
+        if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.VEH_CLASS)) {
+            builder.setVehClass(vehBasics.getVehClass());
+        }
+        if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.VEH_CONTROL_MSG)) {
+            VehControl vehControl = vehBasics.getVehControlMsg();
+            if (vehControl != null) {
+                ObuBase.VehicleControl.Builder vehicleControlBuilder = ObuBase.VehicleControl.newBuilder();
+                vehicleControlBuilder.setUnitMask(vehControl.getUnitMask());
+                if (vehControl.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_CONTROL.BRAKE_PEDAL_STATUS)) {
+                    vehicleControlBuilder.setBrakePedalStatus(vehControl.getBrakePedalStatus());
+                }
+                if (vehControl.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_CONTROL.TRANSMISSION_STATUS)) {
+                    vehicleControlBuilder.setTransmissionStatus(vehControl.getTransmissionStatus());
+                }
+                if (vehControl.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_CONTROL.EXTERIOR_LIGHTS)) {
+                    vehicleControlBuilder.setExteriorLights(vehControl.getExteriorLights());
+                }
+                builder.setVehControlMsg(vehicleControlBuilder);
+            }
+            if (vehBasics.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_VEH_BASICS.TARGET_POSITION)) {
+                builder.setTargetPosition(vehBasics.getTargetPosition());
+            }
+        }
+        return builder;
+    }
+
+    private ObuBase.V2xWarning.Builder getV2xWarning(V2xWarning v2xWarning) {
+        ObuBase.V2xWarning.Builder builder = ObuBase.V2xWarning.newBuilder();
+        builder.setUnitMask(v2xWarning.getUnitMask());
+        if (v2xWarning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_V2X_WARNING.WARNING_DATA)) {
+            List list = v2xWarning.getWarningData();
+            if (list != null && !list.isEmpty()) {
+                for (WarningData warningData : list) {
+                    ObuBase.WarningData.Builder warningDataBuilder = ObuBase.WarningData.newBuilder();
+                    warningDataBuilder.setUnitMask(warningData.getUnitMask());
+                    if (warningData.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_V2X_WARNING_DATA.STATUS)) {
+                        warningDataBuilder.setStatus(warningData.getStatus());
+                    }
+                    if (warningData.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_V2X_WARNING_DATA.WARNING_TYPE)) {
+                        warningDataBuilder.setWarningType(warningData.getWarningType());
+                    }
+                    if (warningData.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_V2X_WARNING_DATA.WARNING_LEVEL)) {
+                        warningDataBuilder.setWarningLevel(warningData.getWarningLevel());
+                    }
+                    if (warningData.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_V2X_WARNING_DATA.WARNING_PRIORITY)) {
+                        warningDataBuilder.setWarningPriority(warningData.getWarningPriority());
+                    }
+                    builder.addWarningData(warningDataBuilder);
+                }
+            }
+        }
+        if (v2xWarning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_V2X_WARNING.WARNING_TIME)) {
+            DateTime dateTime = v2xWarning.getWarningTime();
+            if (dateTime != null) {
+                builder.setWarningTime(ObuBase.DateTime.newBuilder()
+                        .setYear(dateTime.getYear())
+                        .setMonth(dateTime.getMonth())
+                        .setDay(dateTime.getDay())
+                        .setHour(dateTime.getHour())
+                        .setMinute(dateTime.getMinute())
+                        .setMillisecond(dateTime.getMillisecond())
+                        .setOffset(dateTime.getOffset())
+                );
+            }
+        }
+        if (v2xWarning.has(MogoObuConstants.UNIT_MASK.MOGO_OBU_V2X_WARNING.DISTANCE)) {
+            builder.setDistance(v2xWarning.getDistance());
+        }
+        return builder;
+    }
+
+    /**
+     * RV数据转换为转工控机障碍物数据
+     * 赋值的包括:uuid strUuid systemTime satelliteTime latitude longitude altitude speed heading tracked_source.source type
+     *
+     * @param rvWarningData OBU RV数据
+     * @return 工控机障碍物数据
+     */
+    public MessagePad.TrackedObject obuRvToTrackedObject(ObuScene.RvWarningData rvWarningData) {
+        if (rvWarningData != null && rvWarningData.hasVehBasicsMsg()) {
+            ObuBase.VehicleBasics vehBasics = rvWarningData.getVehBasicsMsg();
+            MessagePad.TrackedObject.Builder trackedObjectBuilder = MessagePad.TrackedObject.newBuilder();
+            trackedObjectBuilder.setUuid(vehBasics.getId().hashCode());
+            trackedObjectBuilder.setStrUuid(vehBasics.getId());
+            double time = vehBasics.getSecMark() / 1000.0D;
+            trackedObjectBuilder.setSatelliteTime(time);
+            trackedObjectBuilder.setSystemTime(time);
+            trackedObjectBuilder.setLatitude(vehBasics.getLatitude());
+            trackedObjectBuilder.setLongitude(vehBasics.getLongitude());
+            trackedObjectBuilder.setAltitude(vehBasics.getElevation());
+            trackedObjectBuilder.setSpeed(vehBasics.getSpeed());
+            trackedObjectBuilder.setHeading(vehBasics.getHeading());
+            trackedObjectBuilder.addTrackedSource(MessagePad.TrackedSource.newBuilder().setSource(2));
+            /**
+             * 0 未知车辆
+             * 1 特殊用途车辆
+             * 10 乘用车类型(default type)
+             * 20 轻卡(default type)
+             * 25 卡车(default type)
+             * 27 卡车(Two axle, six tire single units)
+             * 28 卡车( Three axle, single units)
+             * 29 卡车( Four or more axle, single unit)
+             * 30 拖挂车(Four or less axle, single trailer)
+             * 31 拖挂车(Four or less axle, single trailer)
+             * 32 拖挂车(Six or more axle, single trailer)
+             * 33 多轴拖挂车( Five or less axle, multi-trailer)
+             * 34 多轴拖挂车( Six axle, multi-trailer)
+             * 35 多轴拖挂车(Seven or more axle, multi-trailer)
+             * 40 摩托车(default type)
+             * 42 摩托车(motorcycle-Cruiser-Standard)
+             * 43 摩托车(motorcycle - Sport Unclad)
+             * 44 摩托车(motorcycle - Sport Touring)
+             * 45 摩托车(motorcycle - Super Sport)
+             * 46 摩托车(motorcycle-Touring)
+             * 47 摩托车(motorcycle-Trike)
+             * 48 摩托车(motorcycle - w Passengers)
+             * 50 公交车( default type)
+             * 52 公交车(transit-BRT)
+             * 53 公交车(transit-ExpressBus)
+             * 54 公交车(transit-LocalBus)
+             * 55 公交车(transit-SchoolBus)
+             * 56 公交车(transit-FixedGuideway)
+             * 57 公交车(transit-Paratransit)
+             * 58 公交车(transit-Paratransit-Ambulance)
+             * 60 紧急车辆(default type)
+             * 62 紧急车辆(emergency-Fire-Light)
+             * 63 紧急车辆(emergency-Fire-Heavy)
+             * 64 紧急车辆(emergency-Fire-Paramedic)
+             * 65 紧急车辆(emergency-Fire-Ambulance)
+             * 66 紧急车辆(emergency-Police-Light)
+             * 67 紧急车辆(emergency-Police-Heavy)
+             * 68 紧急车辆(emergency-Other-Responder)
+             * 69 紧急车辆(emergency-Other-Ambulance)
+             * 80 其他配备 V2X 的道路参与者(default type)
+             * 82 其他配备 V2X 的道路参与者(otherTraveler-Pedestrian)
+             * 83 其他配备 V2X 的道路参与者(otherTraveler-Visually-Disabled)
+             * 84 其他配备 V2X 的道路参与者(otherTraveler-Physically-Disabled)
+             * 85 其他配备 V2X 的道路参与者(otherTraveler-Bicycle)
+             * 86 其他配备 V2X 的道路参与者(otherTraveler-Vulnerable-Roadworker)
+             */
+            int vehClass = vehBasics.getVehClass();
+            if (vehClass >= 20 && vehClass < 30) {//卡车 20 25 27 28 29
+                vehClass = 8;
+            } else if (vehClass >= 40 && vehClass < 50) {//摩托车 40 42 43 44 45 46 47 48
+                vehClass = 4;
+            } else if (vehClass >= 50 && vehClass < 60) {//公交车 50 52 53 54 55 56 57 58
+                vehClass = 6;
+            } else if (vehClass == 82) {//其他配备 V2X 的道路参与者(otherTraveler-Pedestrian)
+                vehClass = 1;
+            } else if (vehClass == 85) {//其他配备 V2X 的道路参与者(otherTraveler-Bicycle)
+                vehClass = 2;
+            } else {
+                vehClass = 3;
+            }
+            trackedObjectBuilder.setType(vehClass);
+            return trackedObjectBuilder.build();
+        }
+        return null;
+    }
+}
diff --git a/libraries/mogo-obu/src/main/java/com/zhidao/support/obu/OnObuListener.java b/libraries/mogo-obu/src/main/java/com/zhidao/support/obu/OnObuListener.java
new file mode 100644
index 0000000000..cfb3cc76e1
--- /dev/null
+++ b/libraries/mogo-obu/src/main/java/com/zhidao/support/obu/OnObuListener.java
@@ -0,0 +1,70 @@
+package com.zhidao.support.obu;
+
+import com.mogo.support.obu.ObuScene;
+import com.mogo.support.obu.constants.Define;
+
+import mogo.telematics.pad.MessagePad;
+
+
+public interface OnObuListener {
+
+    /**
+     * 连接状态
+     *
+     * @param connectStatus 连接状态
+     */
+    void onConnectStatus(@Define.ConnectStatus int connectStatus);
+
+
+    /**
+     * HV车辆基础信息
+     *
+     * @param hvBasicsData 数据
+     */
+//    void onObuHvBasics(ObuScene.HvBasicsData hvBasicsData);
+
+    /**
+     * HV车辆基础信息转工控机自车数据格式
+     *
+     * @param gnssInfo 数据
+     */
+    void onGnssInfo(MessagePad.GnssInfo gnssInfo);
+
+    /**
+     * V2V预警信息
+     * OBU RV数据转工控机障碍物数据:{@link ObuManager#obuRvToTrackedObject(ObuScene.RvWarningData)}
+     *
+     * @param rvWarningData 数据
+     */
+    void onObuRvWarning(ObuScene.RvWarningData rvWarningData);
+
+    /**
+     * OBU 红绿灯预警信息
+     *
+     * @param spatWarningData 数据
+     */
+    void onObuSpatWarning(ObuScene.SpatWarningData spatWarningData);
+
+    /**
+     * OBU RSI预警信息
+     *
+     * @param rsiWarningData 数据
+     */
+    void onObuRsiWarning(ObuScene.RsiWarningData rsiWarningData);
+
+    /**
+     * OBU RSM预警信息
+     *
+     * @param rsmWarningData 数据
+     */
+    void onObuRsmWarning(ObuScene.RsmWarningData rsmWarningData);
+
+    /**
+     * OBU 地图匹配结果
+     *
+     * @param mapMatchData 数据
+     */
+    void onObuMapMath(ObuScene.MapMatchData mapMatchData);
+
+
+}
diff --git a/modules.txt b/modules.txt
index c49fc8b512..acc4c7544b 100644
--- a/modules.txt
+++ b/modules.txt
@@ -17,7 +17,6 @@
 :test:crashreport
 :test:crashreport-apm
 :test:crashreport-noop
-:test:crashreport-upgrade
 :core:function-impl:mogo-core-function-datacenter
 :core:function-impl:mogo-core-function-hmi
 :core:function-impl:mogo-core-function-map
diff --git a/settings.gradle b/settings.gradle
index db91eb860a..45b91c2c77 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -55,9 +55,7 @@ include ':tts:tts-pad'
 
 // 测试DEBUG
 include ':test:crashreport'
-//include ':test:crashreport-bugly'
 include ':test:crashreport-noop'
-include ':test:crashreport-upgrade'
 include ':test:crashreport-apmbyte'
 
 //OCH 业务模块
diff --git a/test/crashreport-bugly/.gitignore b/test/crashreport-bugly/.gitignore
deleted file mode 100644
index 42afabfd2a..0000000000
--- a/test/crashreport-bugly/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
\ No newline at end of file
diff --git a/test/crashreport-bugly/build.gradle b/test/crashreport-bugly/build.gradle
deleted file mode 100644
index 570f29b445..0000000000
--- a/test/crashreport-bugly/build.gradle
+++ /dev/null
@@ -1,67 +0,0 @@
-plugins {
-    id 'com.android.library'
-    id 'kotlin-android'
-    id 'kotlin-android-extensions'
-    id 'kotlin-kapt'
-    id 'com.alibaba.arouter'
-}
-
-
-android {
-    compileSdkVersion rootProject.ext.android.compileSdkVersion
-    // buildToolsVersion rootProject.ext.android.buildToolsVersion
-    defaultConfig {
-        minSdkVersion rootProject.ext.android.minSdkVersion
-        targetSdkVersion rootProject.ext.android.targetSdkVersion
-        versionCode Integer.valueOf(VERSION_CODE)
-        versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION")
-
-        ndk {
-            // 设置支持的SO库架构
-            abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
-        }
-
-        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
-        consumerProguardFiles 'consumer-rules.pro'
-
-        //ARouter apt 参数
-        kapt {
-            useBuildCache = false
-            arguments {
-                arg("AROUTER_MODULE_NAME", project.getName())
-            }
-        }
-    }
-
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
-        }
-    }
-}
-
-dependencies {
-    implementation fileTree(dir: "libs", include: ["*.jar"])
-    implementation rootProject.ext.dependencies.androidxappcompat
-
-    implementation rootProject.ext.dependencies.arouter
-    kapt rootProject.ext.dependencies.aroutercompiler
-
-    if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
-        api rootProject.ext.dependencies.crashreport
-        implementation rootProject.ext.dependencies.mogo_core_utils
-        implementation rootProject.ext.dependencies.mogocommons
-    } else {
-        api project(":test:crashreport")
-        implementation project(':core:mogo-core-utils')
-        implementation project(":foudations:mogo-commons")
-    }
-
-    implementation 'com.tencent.bugly:crashreport_upgrade:1.6.1'
-    //其中latest.release指代最新Bugly SDK版本号,也可以指定明确的版本号,例如2.1.9
-    implementation 'com.tencent.bugly:nativecrashreport:latest.release'
-    //其中latest.release指代最新Bugly NDK版本号,也可以指定明确的版本号,例如3.0
-}
-
-apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
\ No newline at end of file
diff --git a/test/crashreport-bugly/consumer-rules.pro b/test/crashreport-bugly/consumer-rules.pro
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/test/crashreport-bugly/gradle.properties b/test/crashreport-bugly/gradle.properties
deleted file mode 100644
index 6b451eda5d..0000000000
--- a/test/crashreport-bugly/gradle.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-GROUP=com.mogo.test
-POM_ARTIFACT_ID=crashreport-bugly
-VERSION_CODE=1
diff --git a/test/crashreport-bugly/proguard-rules.pro b/test/crashreport-bugly/proguard-rules.pro
deleted file mode 100644
index 481bb43481..0000000000
--- a/test/crashreport-bugly/proguard-rules.pro
+++ /dev/null
@@ -1,21 +0,0 @@
-# Add project specific ProGuard rules here.
-# You can control the set of applied configuration files using the
-# proguardFiles setting in build.gradle.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
-
-# Uncomment this to preserve the line number information for
-# debugging stack traces.
-#-keepattributes SourceFile,LineNumberTable
-
-# If you keep the line number information, uncomment this to
-# hide the original source file name.
-#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/test/crashreport-bugly/src/main/AndroidManifest.xml b/test/crashreport-bugly/src/main/AndroidManifest.xml
deleted file mode 100644
index d9f7357150..0000000000
--- a/test/crashreport-bugly/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-    /
-
\ No newline at end of file
diff --git a/test/crashreport-bugly/src/main/java/com/mogo/test/crashreport/bugly/BuglyCrashReportProvider.java b/test/crashreport-bugly/src/main/java/com/mogo/test/crashreport/bugly/BuglyCrashReportProvider.java
deleted file mode 100644
index 549dee35e9..0000000000
--- a/test/crashreport-bugly/src/main/java/com/mogo/test/crashreport/bugly/BuglyCrashReportProvider.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.mogo.test.crashreport.bugly;
-
-import android.content.Context;
-import android.text.TextUtils;
-
-import com.alibaba.android.arouter.facade.annotation.Route;
-import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
-import com.mogo.commons.debug.DebugConfig;
-import com.mogo.eagle.core.utilcode.util.AppUtils;
-import com.mogo.test.crashreport.CrashReportConstants;
-import com.mogo.test.crashreport.ITestCrashReportProvider;
-import com.tencent.bugly.Bugly;
-import com.tencent.bugly.crashreport.CrashReport;
-
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-
-
-/**
- * @author congtaowang
- * @since 2020/9/9
- *
- * 描述
- */
-//@Route(path = CrashReportConstants.PATH)
-public class BuglyCrashReportProvider implements ITestCrashReportProvider {
-
-    private static final String TAG = "BuglyCrashReportProvider";
-
-    @Override
-    public void init(Context context) {
-        String packageName = context.getPackageName();
-        String processName = getProcessName(android.os.Process.myPid());
-        CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(context);
-        strategy.setUploadProcess(processName == null || processName.equals(packageName));
-        //该用户本次启动后的异常日志用户ID都将是 sn
-        CrashReport.setUserId(MoGoAiCloudClientConfig.getInstance().getSn());
-        String productFlavor = DebugConfig.getProductFlavor();
-        strategy.setAppChannel(productFlavor);
-        Bugly.init(context, CrashReportConstants.buglyAppID, true, strategy);
-        Bugly.putUserData(context, "serial", MoGoAiCloudClientConfig.getInstance().getSn());
-        String mapSDKVersion = AppUtils.getCustomMapSDKVersion(context);
-        Bugly.putUserData(context, "MAP_SDK_VERSION", mapSDKVersion);
-    }
-
-    /**
-     * 获取进程号对应的进程名
-     *
-     * @param pid 进程号
-     * @return 进程名
-     */
-    private static String getProcessName(int pid) {
-        BufferedReader reader = null;
-        try {
-            reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
-            String processName = reader.readLine();
-            if (!TextUtils.isEmpty(processName)) {
-                processName = processName.trim();
-            }
-            return processName;
-        } catch (Throwable throwable) {
-            throwable.printStackTrace();
-        } finally {
-            try {
-                if (reader != null) {
-                    reader.close();
-                }
-            } catch (IOException exception) {
-                exception.printStackTrace();
-            }
-        }
-        return null;
-    }
-}
-
diff --git a/test/crashreport-upgrade/.gitignore b/test/crashreport-upgrade/.gitignore
deleted file mode 100644
index 42afabfd2a..0000000000
--- a/test/crashreport-upgrade/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
\ No newline at end of file
diff --git a/test/crashreport-upgrade/build.gradle b/test/crashreport-upgrade/build.gradle
deleted file mode 100644
index 5bdd118607..0000000000
--- a/test/crashreport-upgrade/build.gradle
+++ /dev/null
@@ -1,63 +0,0 @@
-plugins {
-    id 'com.android.library'
-    id 'kotlin-android'
-    id 'kotlin-android-extensions'
-    id 'kotlin-kapt'
-    id 'com.alibaba.arouter'
-}
-
-android {
-    compileSdkVersion rootProject.ext.android.compileSdkVersion
-    defaultConfig {
-        minSdkVersion rootProject.ext.android.minSdkVersion
-        targetSdkVersion rootProject.ext.android.targetSdkVersion
-        versionCode Integer.valueOf(VERSION_CODE)
-        versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION")
-
-        ndk {
-            // 设置支持的SO库架构
-            abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
-        }
-
-        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
-        consumerProguardFiles 'consumer-rules.pro'
-
-        //ARouter apt 参数
-        kapt {
-            useBuildCache = false
-            arguments {
-                arg("AROUTER_MODULE_NAME", project.getName())
-            }
-        }
-    }
-
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
-        }
-    }
-}
-
-dependencies {
-    implementation fileTree(dir: "libs", include: ["*.jar"])
-    implementation rootProject.ext.dependencies.androidxappcompat
-
-    implementation rootProject.ext.dependencies.arouter
-    kapt rootProject.ext.dependencies.aroutercompiler
-
-    if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
-        api rootProject.ext.dependencies.crashreport
-        implementation rootProject.ext.dependencies.mogo_core_utils
-        implementation rootProject.ext.dependencies.mogocommons
-    } else {
-        api project(":test:crashreport")
-        implementation project(':core:mogo-core-utils')
-        implementation project(":foudations:mogo-commons")
-    }
-
-    implementation 'com.tencent.bugly:crashreport_upgrade:1.6.1'
-    //其中latest.release指代最新版本号,也可以指定明确的版本号,例如1.2.0
-}
-
-apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()
\ No newline at end of file
diff --git a/test/crashreport-upgrade/consumer-rules.pro b/test/crashreport-upgrade/consumer-rules.pro
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/test/crashreport-upgrade/gradle.properties b/test/crashreport-upgrade/gradle.properties
deleted file mode 100644
index bcb33e8a94..0000000000
--- a/test/crashreport-upgrade/gradle.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-GROUP=com.mogo.test
-POM_ARTIFACT_ID=crashreport-upgrade
-VERSION_CODE=1
diff --git a/test/crashreport-upgrade/proguard-rules.pro b/test/crashreport-upgrade/proguard-rules.pro
deleted file mode 100644
index 68dec0863c..0000000000
--- a/test/crashreport-upgrade/proguard-rules.pro
+++ /dev/null
@@ -1,24 +0,0 @@
-# Add project specific ProGuard rules here.
-# You can control the set of applied configuration files using the
-# proguardFiles setting in build.gradle.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
-
-# Uncomment this to preserve the line number information for
-# debugging stack traces.
-#-keepattributes SourceFile,LineNumberTable
-
-# If you keep the line number information, uncomment this to
-# hide the original source file name.
-#-renamesourcefileattribute SourceFile
--dontwarn com.tencent.bugly.**
--keep public class com.tencent.bugly.**{*;}
--keep class android.support.**{*;}
diff --git a/test/crashreport-upgrade/src/main/AndroidManifest.xml b/test/crashreport-upgrade/src/main/AndroidManifest.xml
deleted file mode 100644
index 9f5b88a7f2..0000000000
--- a/test/crashreport-upgrade/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-    
-        
-            
-        
-
-        
-    
-
\ No newline at end of file
diff --git a/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportConstants.java b/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportConstants.java
deleted file mode 100644
index 8e2b0380b8..0000000000
--- a/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportConstants.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.mogo.test.crashreport.upgrade;
-
-
-/**
- * @author donghongyu
- * @since 2020/9/9
- * 

- * 描述 - */ -public class UpgradeReportConstants { - - public static final String PATH = "/upgradereport/api"; - - public static final String NAME = "UpgradeReportApi"; -} diff --git a/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportProvider.java b/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportProvider.java deleted file mode 100644 index aeb73c0be8..0000000000 --- a/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportProvider.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.mogo.test.crashreport.upgrade; - -import android.content.Context; -import android.text.TextUtils; - -import com.alibaba.android.arouter.facade.annotation.Route; -import com.alibaba.android.arouter.facade.template.IProvider; -import com.mogo.commons.debug.DebugConfig; -import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; -import com.mogo.eagle.core.utilcode.util.AppUtils; -import com.mogo.test.crashreport.CrashReportConstants; -import com.tencent.bugly.Bugly; -import com.tencent.bugly.crashreport.CrashReport; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - - -/** - * @author donghongyu - * @since 2020/9/9 - *

- * 升级模块 - */ -@Route(path = UpgradeReportConstants.PATH) -public class UpgradeReportProvider implements IProvider { - - private static final String TAG = "UpgradeReportProvider"; - - @Override - public void init(Context context) { - String packageName = context.getPackageName(); - String processName = getProcessName(android.os.Process.myPid()); - CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(context); - strategy.setUploadProcess(processName == null || processName.equals(packageName)); - - String productFlavor = DebugConfig.getProductFlavor(); - strategy.setAppChannel(productFlavor); - Bugly.init(context, CrashReportConstants.buglyAppID, true, strategy); - String sn = SharedPrefsMgr.getInstance(context).getString("sn"); - if (sn != null && !sn.isEmpty()) { - Bugly.putUserData(context, "serial", sn); - } - String mapSDKVersion = DebugConfig.getMapVersion(); - Bugly.putUserData(context, "MAP_SDK_VERSION", mapSDKVersion); - } - - /** - * 获取进程号对应的进程名 - * - * @param pid 进程号 - * @return 进程名 - */ - private static String getProcessName(int pid) { - BufferedReader reader = null; - try { - reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline")); - String processName = reader.readLine(); - if (!TextUtils.isEmpty(processName)) { - processName = processName.trim(); - } - return processName; - } catch (Throwable throwable) { - throwable.printStackTrace(); - } finally { - try { - if (reader != null) { - reader.close(); - } - } catch (IOException exception) { - exception.printStackTrace(); - } - } - return null; - } -} - diff --git a/test/crashreport-upgrade/src/main/res/xml/provider_paths.xml b/test/crashreport-upgrade/src/main/res/xml/provider_paths.xml deleted file mode 100644 index 1b4e49502c..0000000000 --- a/test/crashreport-upgrade/src/main/res/xml/provider_paths.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file