From 75dd2cc801a9be176503ef9ab714b535bc1b80a1 Mon Sep 17 00:00:00 2001 From: lixiaopeng Date: Fri, 18 Jun 2021 17:22:05 +0800 Subject: [PATCH] add mogoobu --- config.gradle | 4 +- modules/mogo-module-v2x/build.gradle | 3 +- .../com/mogo/module/v2x/V2XObuManager.java | 154 ++++++++++++++---- .../scene/obu/V2XObuEventScenario.java | 2 +- .../scenario/scene/obu/V2XObuEventWindow.java | 2 +- .../v2x_icon_car_collide_warning.png | Bin 0 -> 4735 bytes .../v2x_icon_car_collide_warning.png | Bin 0 -> 6908 bytes .../v2x_icon_car_collide_warning.png | Bin 0 -> 4735 bytes 8 files changed, 126 insertions(+), 39 deletions(-) create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-xhdpi-1920x1000/v2x_icon_car_collide_warning.png create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-xhdpi-2560x1440/v2x_icon_car_collide_warning.png create mode 100644 modules/mogo-module-v2x/src/main/res/drawable-xhdpi/v2x_icon_car_collide_warning.png diff --git a/config.gradle b/config.gradle index 4530ec1b0f..8b28c2b2ed 100644 --- a/config.gradle +++ b/config.gradle @@ -171,7 +171,9 @@ ext { // obu sdk obusdk : "com.zhidao.enterprise.smartv2x:smartv2x:1.0.0.3", - mebulaobu : 'com.zhidao.support.nebulaobu:nebulaobu:1.0.0.3', +// mebulaobu : 'com.zhidao.support.nebulaobu:nebulaobu:1.0.0.3', + mogoobu : 'com.zhidao.support.obu:mogoobu:1.0.0.2', + // 左侧面板 moduleleftpanel : "com.mogo.module:module-left-panel:${MOGO_MODULE_LEFT_PANEL_VERSION}", // 左侧面板空实现 diff --git a/modules/mogo-module-v2x/build.gradle b/modules/mogo-module-v2x/build.gradle index 4be22e5052..a299f8db01 100644 --- a/modules/mogo-module-v2x/build.gradle +++ b/modules/mogo-module-v2x/build.gradle @@ -94,7 +94,8 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation project(':modules:mogo-module-obu') - implementation rootProject.ext.dependencies.mebulaobu +// implementation rootProject.ext.dependencies.mebulaobu + implementation rootProject.ext.dependencies.mogoobu } diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java index fc56d5c187..70e45e60ce 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/V2XObuManager.java @@ -38,11 +38,20 @@ import com.zhidao.mogo.module.obu.obu.IObuCallback; import com.zhidao.mogo.module.obu.obu.bean.MogoObuEventInfo; import com.zhidao.mogo.module.obu.obu.bean.MogoObuLocationInfo; import com.zhidao.mogo.module.obu.obu.bean.MogoObuTrafficLightInfo; -import com.zhidao.support.nebulaobu.NebulaObuClient; -import com.zhidao.support.nebulaobu.OnObuListener; -import com.zhidao.support.nebulaobu.model.ActiveSafetyInfo; -import com.zhidao.support.nebulaobu.model.ObuInfo; -import com.zhidao.support.nebulaobu.model.ObuInfoMore; +//import com.zhidao.support.nebulaobu.NebulaObuClient; +//import com.zhidao.support.nebulaobu.OnObuListener; +//import com.zhidao.support.nebulaobu.model.ActiveSafetyInfo; +//import com.zhidao.support.nebulaobu.model.ObuInfo; +//import com.zhidao.support.nebulaobu.model.ObuInfoMore; + +import com.zhidao.support.obu.MogoObuManager; +import com.zhidao.support.obu.OnMogoObuListener; +import com.zhidao.support.obu.model.CvxAppInitIndInfo; +import com.zhidao.support.obu.model.CvxHvCarIndInfo; +import com.zhidao.support.obu.model.CvxHvInfoIndInfo; +import com.zhidao.support.obu.model.CvxRvInfoIndInfo; +import com.zhidao.support.obu.model.CvxSetConfigCfmInfo; +import com.zhidao.support.obu.model.CvxV2vThreatIndInfo; import org.json.JSONArray; import org.json.JSONObject; @@ -94,9 +103,14 @@ public class V2XObuManager implements IObuCallback, Handler.Callback { obuManager.registerObuDataChangedListener(this); //使用adas部门obu sdk (星云) - NebulaObuClient.getInstance().init(context); - NebulaObuClient.getInstance().registerObu(100); - NebulaObuClient.getInstance().registerObuListener(listener); +// NebulaObuClient.getInstance().init(context); +// NebulaObuClient.getInstance().registerObu(100); +// NebulaObuClient.getInstance().registerObuListener(listener); + + //自研obu + MogoObuManager.getInstance().init(context); + MogoObuManager.getInstance().registerListener(mogoObuListener); + MogoObuManager.getInstance().unregisterListener(); // UiThreadHandler.postDelayed( () -> { // //TODO 测试 @@ -109,52 +123,122 @@ public class V2XObuManager implements IObuCallback, Handler.Callback { context.registerReceiver(obuTypeExchangeReceiver, filter); } - - public void release() { - NebulaObuClient.getInstance().unregisterObu(); - NebulaObuClient.getInstance().unregisterObuListener(); - } - - - /** - * 星云obu数据监听 - */ - private OnObuListener listener = new OnObuListener() { + private OnMogoObuListener mogoObuListener = new OnMogoObuListener() { @Override - public void onRegister() { + public void onConnected() { + //OBU连接成功 + Logger.d("liyz", "onConnected ------> "); } @Override public void onConnectFail(boolean isNeedReconnect) { Logger.d("liyz", "onConnectFail ------> "); + //OBU连接失败 } @Override - public void onUnregister() { + public void onDisconnect() { + Logger.d("liyz", "onDisconnect ------> "); + //OBU断开连接 } @Override - public void onObuInfo(ObuInfo info) { - Logger.d("liyz", "onObuInfo ------> " + info.toString()); + public void onReceiveOriginData(String data) { + super.onReceiveOriginData(data); + Logger.d("liyz", "onReceiveOriginData ------> data = " + data); + //接收到的原始数据 } @Override - public void onWarningInfo(List infoList) { - if (infoList != null) { - if (infoList.size() > 0) { //一般只有一个 - ActiveSafetyInfo info = infoList.get(0); - Logger.d("liyz", "onWarningInfo type ------> " + info.getWarningtype() + "--size = " + infoList.size()); - if (info.getWarningtype() == 3) { - if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { - handleSdkObu(2); - } - } - } - } + public void onSendData(byte[] bytes) { + super.onSendData(bytes); + //发送的数据 + Logger.d("liyz", "onSendData ------> "); + } + + @Override + public void onCvxAppInitIndInfo(CvxAppInitIndInfo info) { + super.onCvxAppInitIndInfo(info); + Logger.d("liyz", "onCvxAppInitIndInfo ------> " + info.toString()); + //CV2X系统信息 + } + + @Override + public void onCvxSetConfigCfm(CvxSetConfigCfmInfo info) { + super.onCvxSetConfigCfm(info); + Logger.d("liyz", "onCvxSetConfigCfm ------> " + info.toString()); + //设置CV2X系统的配置确认 + } + + @Override + public void onCvxHvCarIndInfo(CvxHvCarIndInfo info) { + //主车车辆信息 + Logger.d("liyz", "onCvxHvCarIndInfo ------> " + info.toString()); + } + + @Override + public void onCvxHvInfoIndInfo(CvxHvInfoIndInfo info) { + //主车信息 + } + + @Override + public void onCvxRvInfoIndInfo(CvxRvInfoIndInfo info) { + //远车信息 + Logger.d("liyz", "onCvxRvInfoIndInfo ------> " + info.toString()); + } + + @Override + public void onCvxV2vThreatIndInfo(CvxV2vThreatIndInfo info) { + //预警信息 + Logger.e("liyz", "onCvxRvInfoIndInfo ------> " + info.toString()); } }; +// public void release() { +// NebulaObuClient.getInstance().unregisterObu(); +// NebulaObuClient.getInstance().unregisterObuListener(); +// } + + /** + * 星云obu数据监听 + */ +// private OnObuListener listener = new OnObuListener() { +// @Override +// public void onRegister() { +// } +// +// @Override +// public void onConnectFail(boolean isNeedReconnect) { +// Logger.d("liyz", "onConnectFail ------> "); +// } +// +// @Override +// public void onUnregister() { +// } +// +// @Override +// public void onObuInfo(ObuInfo info) { +// Logger.d("liyz", "onObuInfo ------> " + info.toString()); +// } +// +// @Override +// public void onWarningInfo(List infoList) { +// if (infoList != null) { +// if (infoList.size() > 0) { //一般只有一个 +// ActiveSafetyInfo info = infoList.get(0); +// Logger.d("liyz", "onWarningInfo type ------> " + info.getWarningtype() + "--size = " + infoList.size()); +// if (info.getWarningtype() == 3) { +// if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { +// handleSdkObu(2); +// } +// } +// } +// } +// } +// }; + + private void handleSdkObu(int type) { V2XMessageEntity messageEntity = new V2XMessageEntity<>(); messageEntity.setType(V2XMessageEntity.V2XTypeEnum.ALERT_OBU_EVENT); diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/obu/V2XObuEventScenario.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/obu/V2XObuEventScenario.java index ec962d4b1b..596734eb33 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/obu/V2XObuEventScenario.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/obu/V2XObuEventScenario.java @@ -44,7 +44,7 @@ public class V2XObuEventScenario extends AbsV2XScenario imple public static final String URGENCY_COLLISION_WARN_TEXT_ONE = "前车急刹,注意保持安全距离!"; public static final String URGENCY_COLLISION_WARN_TEXT = "前车急刹"; - public static final String URGENCY_CROING_WARN_TEXT = "交叉路口碰撞预警"; + public static final String URGENCY_CROING_WARN_TEXT = "注意交叉路口车辆"; private static final int MSG_CLOSE_OBU_WINDOW = 1001; private static final int DEFAULT_EXPIRE_TIME = 20_000; diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/obu/V2XObuEventWindow.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/obu/V2XObuEventWindow.java index 44b5f8a400..fc5bbfb829 100644 --- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/obu/V2XObuEventWindow.java +++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/scenario/scene/obu/V2XObuEventWindow.java @@ -85,7 +85,7 @@ public class V2XObuEventWindow extends FrameLayout implements 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 N002ovPDHLkV1j&P{Ad6G literal 0 HcmV?d00001 diff --git a/modules/mogo-module-v2x/src/main/res/drawable-xhdpi-2560x1440/v2x_icon_car_collide_warning.png b/modules/mogo-module-v2x/src/main/res/drawable-xhdpi-2560x1440/v2x_icon_car_collide_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..e7709ff347368efb266729aed6f8993f6076cca2 GIT binary patch literal 6908 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 N002ovPDHLkV1j&P{Ad6G literal 0 HcmV?d00001