From 62f1e116818739434e03a64ddd135f06d8990193 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Mon, 13 Feb 2023 16:02:17 +0800 Subject: [PATCH] =?UTF-8?q?[3.0][OBU=E6=95=B0=E6=8D=AE=E8=9E=8D=E5=90=88]?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9EOBU=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E5=B0=86OBU=20SDK=E6=95=B0=E6=8D=AE=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E6=88=90=E4=B8=8E=E5=9F=9F=E6=8E=A7=E7=9B=B8=E5=90=8C=E7=9A=84?= =?UTF-8?q?PB=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zhidao/adas/client/DataDistribution.java | 12 - .../zhidao/adas/client/ui/InfoFragment.java | 6 +- .../zhidao/adas/client/ui/MainActivity.java | 8 - .../zhidao/adas/client/utils/Constants.java | 1 - .../zhidao/adas/magic/ui/MainActivity.java | 5 - config.gradle | 2 +- .../src/main/proto/message_pad.proto | 4 +- .../src/main/proto/personal/obu_base.proto | 149 ++-- .../src/main/proto/personal/obu_scene.proto | 44 +- libraries/mogo-obu/build.gradle | 31 +- .../com/zhidao/support/obu/ObuManager.java | 825 ++++++++++++++++++ .../com/zhidao/support/obu/OnObuListener.java | 70 ++ 12 files changed, 1017 insertions(+), 140 deletions(-) create mode 100644 libraries/mogo-obu/src/main/java/com/zhidao/support/obu/ObuManager.java create mode 100644 libraries/mogo-obu/src/main/java/com/zhidao/support/obu/OnObuListener.java diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java index d8f82d25ce..fd80d8d570 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/DataDistribution.java @@ -19,7 +19,6 @@ 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.ObuWarningData; import com.zhidao.adas.client.bean.OriginalPointCloudData; import com.zhidao.adas.client.bean.PerceptionTrafficLight; import com.zhidao.adas.client.bean.PlanningDecisionState; @@ -131,7 +130,6 @@ public class DataDistribution { public final List 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<>(); @@ -159,7 +157,6 @@ 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; @@ -189,7 +186,6 @@ public class DataDistribution { listFSMFunctionStatesSize = 1; listRoboSweeperTaskIndexSize = 1; listBagManagerCmdSize = 1; - listObuWarningDataSize = 1; listObuSpatSize = 1; listObuRsiSize = 1; listObuRsmSize = 1; @@ -246,14 +242,6 @@ 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); - } - if (listener != null && Constants.TITLE.RECEIVE_OBU_WARNING_DATA.equals(listener.first)) { - listener.second.onRefresh(); - } } else if (data instanceof ObuSpat) { listObuSpat.add(0, new DataShow(listObuSpatSize++, time + str)); if (listObuSpat.size() > LIST_SIZE) { 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 83e8d67fb7..9f355337f5 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 @@ -134,9 +134,7 @@ 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)) { + } 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); @@ -144,7 +142,7 @@ public class InfoFragment extends BaseFragment { 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)) { + } 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)) { adapter.setData(DataDistribution.getInstance().listGlobalPathResp); 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 4f27b36e6a..50ddaa22bc 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 @@ -73,7 +73,6 @@ 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.ObuWarningData; import com.zhidao.adas.client.bean.OriginalPointCloudData; import com.zhidao.adas.client.bean.PerceptionTrafficLight; import com.zhidao.adas.client.bean.PlanningDecisionState; @@ -128,7 +127,6 @@ import chassis.VehicleStateOuterClass; 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; @@ -668,7 +666,6 @@ 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); @@ -1038,11 +1035,6 @@ 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); - DataDistribution.getInstance().addData(base); - } @Override public void onObuSpatWarning(MessagePad.Header header, ObuScene.SpatWarningData spatWarningData) { 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 e9b2ae2466..f13f2de4e5 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 @@ -172,7 +172,6 @@ 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信息"; 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 7900d8cbdf..685f84610c 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 @@ -69,7 +69,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; @@ -546,10 +545,6 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } - @Override - public void onObuWarningData(MessagePad.Header header, ObuWarningEvent.ObuWarningData obuWarningData) { - - } @Override public void onObuSpatWarning(MessagePad.Header header, ObuScene.SpatWarningData spatWarningData) { diff --git a/config.gradle b/config.gradle index e75a0bb462..5365d0898b 100644 --- a/config.gradle +++ b/config.gradle @@ -93,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", 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 a024bb74ee..4fbde4e724 100644 --- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto +++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto @@ -135,6 +135,8 @@ message TrackedObject repeated Location polygon = 15; geometry.Point center = 16; AdditionalAttribute add_attribute = 17; // 事件类型 + reserved 18 to 100; + string strUuid = 101;//String类型车辆ID } message TrackedObjects @@ -188,7 +190,7 @@ message AutopilotState message PlanningObject { uint32 uuid = 1; - uint32 type = 2; //影响自车决策的类型, 和感知的障碍物类型不是一回事 + uint32 type = 2; //影响自车决策的类型, 和感知的障碍物类型不是一回事 0是leading障碍物,1是避障和择机的障碍物 } message PlanningObjects 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-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); + + +}