add func of identify obj to filter source and add limit twice , demo mode in take over

This commit is contained in:
zhongchao
2022-09-22 14:29:22 +08:00
parent efb57d550c
commit d7f2c3dad1
9 changed files with 366 additions and 260 deletions

View File

@@ -1374,6 +1374,7 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
HmiBuildConfig.isShowSnBindingView = isOpen
}
private var takeOver = false
/**
* 工控机监控节点上报
@@ -1381,31 +1382,6 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) {
ThreadUtils.runOnUiThread {
guardianInfo?.let {
when (it.code) {
EXIT_AUTOPILOT_FOR_PLANNING,
EXIT_AUTOPILOT_FOR_LOCATION,
EXIT_AUTOPILOT_FOR_CHASSIS,
EXIT_AUTOPILOT_FOR_DISTANCE -> {
showWarningV2X(
EventTypeEnum.TAKE_OVER_EVENT.poiType,
EventTypeEnum.TAKE_OVER_EVENT.content,
EventTypeEnum.TAKE_OVER_EVENT.tts,
EventTypeEnum.TAKE_OVER_EVENT.poiType,
object : IMoGoWarningStatusListener {
override fun onShow() {
clTakeOverView.visibility = View.VISIBLE
}
override fun onDismiss() {
clTakeOverView.visibility = View.GONE
}
},
true,
6000L
)
}
}
if (reportList.size > 49) {
reportList.removeLast()
}
@@ -1418,6 +1394,38 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
)
reportListFloatWindow?.refreshData(reportList)
if(FunctionBuildConfig.isDemoMode){
return@let
}
if(takeOver){
return@let
}
when (it.code) {
EXIT_AUTOPILOT_FOR_PLANNING,
EXIT_AUTOPILOT_FOR_LOCATION,
EXIT_AUTOPILOT_FOR_CHASSIS,
EXIT_AUTOPILOT_FOR_DISTANCE -> {
showWarningV2X(
EventTypeEnum.TAKE_OVER_EVENT.poiType,
EventTypeEnum.TAKE_OVER_EVENT.content,
EventTypeEnum.TAKE_OVER_EVENT.tts,
EventTypeEnum.TAKE_OVER_EVENT.poiType,
object : IMoGoWarningStatusListener {
override fun onShow() {
takeOver = true
clTakeOverView.visibility = View.VISIBLE
}
override fun onDismiss() {
takeOver = false
clTakeOverView.visibility = View.GONE
}
},
true,
6000L
)
}
}
}
}
}

View File

@@ -9,6 +9,7 @@ import android.graphics.Color
import android.os.Build
import android.text.Html
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.widget.*
@@ -21,7 +22,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
import chassis.Chassis
import com.mogo.cloud.passport.MoGoAiCloudClient
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.debug.DebugConfig
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.autopilot.*
@@ -57,7 +57,6 @@ import com.mogo.eagle.core.function.call.map.CallerSmpManager
import com.mogo.eagle.core.function.call.obu.CallerOBUManager
import com.mogo.eagle.core.function.call.obu.CallerObuListenerManager
import com.mogo.eagle.core.function.call.setting.CallerMoGoUiSettingManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.logcatch.ILogViewListener
import com.mogo.eagle.core.function.hmi.ui.logcatch.LogInfoView
@@ -633,33 +632,20 @@ class DebugSettingView @JvmOverloads constructor(
}
// 初始化 GSP数据源 数据
rgGpsProvider.check(
when (FunctionBuildConfig.gpsProvider) {
0 -> {
R.id.rbGpsProviderAndroid
}
1 -> {
R.id.rbGpsProviderRTK
}
2 -> {
R.id.rbGpsProviderOBU
}
0 -> R.id.rbGpsProviderAndroid
1 -> R.id.rbGpsProviderRTK
2 -> R.id.rbGpsProviderOBU
else -> R.id.rbGpsProviderAndroid
}
)
rgGpsProvider.setOnCheckedChangeListener { _, checkedId ->
when (checkedId) {
R.id.rbGpsProviderAndroid -> {
FunctionBuildConfig.gpsProvider = 0
}
R.id.rbGpsProviderRTK -> {
FunctionBuildConfig.gpsProvider = 1
}
R.id.rbGpsProviderOBU -> {
FunctionBuildConfig.gpsProvider = 2
}
R.id.rbGpsProviderAndroid -> FunctionBuildConfig.gpsProvider = 0
R.id.rbGpsProviderRTK -> FunctionBuildConfig.gpsProvider = 1
R.id.rbGpsProviderOBU -> FunctionBuildConfig.gpsProvider = 2
}
}
@@ -690,22 +676,18 @@ class DebugSettingView @JvmOverloads constructor(
trackerIPCProvider.check(
when (FunctionBuildConfig.trackerIPCProvider) {
0 -> R.id.trackerIPCUnion
1 -> R.id.trackerIPCObu
2 -> R.id.trackerIPCV2N
1 -> R.id.trackerIPC
2 -> R.id.trackerIPCObu
3 -> R.id.trackerIPCV2I
else -> R.id.trackerIPCUnion
}
)
trackerProvider.setOnCheckedChangeListener{ _, checkedId ->
when(checkedId){
R.id.trackerIPCUnion -> {
FunctionBuildConfig.trackerIPCProvider = 0
}
R.id.trackerIPCObu -> {
FunctionBuildConfig.trackerIPCProvider = 1
}
R.id.trackerIPCV2N -> {
FunctionBuildConfig.trackerIPCProvider = 2
}
trackerIPCProvider.setOnCheckedChangeListener { _, checkedId ->
when (checkedId) {
R.id.trackerIPCUnion -> FunctionBuildConfig.trackerIPCProvider = 0
R.id.trackerIPC -> FunctionBuildConfig.trackerIPCProvider = 1
R.id.trackerIPCObu -> FunctionBuildConfig.trackerIPCProvider = 2
R.id.trackerIPCV2I -> FunctionBuildConfig.trackerIPCProvider = 3
}
}

View File

@@ -1796,6 +1796,16 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="@dimen/dp_10"
android:text="融合全部感知数据"
android:textColor="#000"
android:textSize="@dimen/dp_24" />
<RadioButton
android:id="@+id/trackerIPC"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="@dimen/dp_10"
android:text="融合感知数据"
android:textColor="#000"
android:textSize="@dimen/dp_24" />
@@ -1811,12 +1821,12 @@
android:textSize="@dimen/dp_24" />
<RadioButton
android:id="@+id/trackerIPCV2N"
android:id="@+id/trackerIPCV2I"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="@dimen/dp_10"
android:text="融合V2N感知数据"
android:text="融合V2I感知数据"
android:textColor="#000"
android:textSize="@dimen/dp_24" />

View File

@@ -1,21 +1,14 @@
package com.mogo.eagle.core.function.map.identify
import android.annotation.SuppressLint
import android.text.TextUtils
import androidx.collection.ArraySet
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.enums.TrafficTypeEnum
import com.mogo.eagle.core.data.traffic.TrafficData
import com.mogo.eagle.core.data.traffic.threatLevelColor
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.w
import com.mogo.map.MogoMarkerManager
import com.mogo.module.common.MogoApisHandler
import mogo.telematics.pad.MessagePad
import mogo.telematics.pad.MessagePad.*
import mogo.telematics.pad.MessagePad.PlanningObject
import mogo.telematics.pad.MessagePad.TrackedObject
import java.util.concurrent.ConcurrentHashMap
/**
@@ -23,20 +16,12 @@ import java.util.concurrent.ConcurrentHashMap
* @date 2021/10/19 10:45 上午
* 域控制器识别信息绘制
*/
class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener {
class IdentifyOriginDataDrawer : Identify {
companion object {
private const val TAG = "IdentifyDataDrawer"
}
init {
// 添加 ADAS状态 监听
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
}
@Volatile
private var mAutopilotStatus: Int = 0 //自动驾驶状态
/**
* 上一帧数据的缓存
*/
@@ -54,58 +39,13 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener {
@SuppressLint("NewApi")
private val mFilterTrafficData = HashMap<String, TrackedObject>()
/**
* planning 感知物预警缓存用于重置color状态
*/
private val pncWarningTrafficData = ConcurrentHashMap<String, PlanningTrack>()
/**
* obu 感知物预警缓存用于重置color状态
*/
private val obuWarningTrafficData = ConcurrentHashMap<String, TrafficData>()
@SuppressLint("NewApi")
override fun renderPlanningWarningObj(planningObjects: List<MessagePad.PlanningObject>?) {
pncWarningTrafficData.clear()
if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || mAutopilotStatus == 2) {
if (planningObjects == null) {
return
}
planningObjects.forEach { planningObj ->
val trackId = planningObj.uuid.toString()
if (mMarkersCaches.containsKey(trackId)) {
val trackObj = mMarkersCaches[trackId]
if (planningObj.type == 0) {
//0是leading障碍物障碍物车身红色提示
trackObj?.let {
pncWarningTrafficData[trackId] = PlanningTrack(
"#D65D5AFF",
CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime()
)
}
} else if (planningObj.type == 1) {
//1是避障和择机的障碍物障碍物车身黄色提示
trackObj?.let {
pncWarningTrafficData[trackId] = PlanningTrack(
"#E4DD94FF",
CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime()
)
}
}
}
}
}
override fun renderPlanningWarningObj(planningObjects: List<PlanningObject>?) {
WarningHelper.renderPlanningOriginWarningObj(planningObjects, mMarkersCaches)
}
override fun renderOBUWarningObj(exist: Boolean, obuTrafficData: TrafficData) {
if (obuTrafficData.uuid.isNullOrEmpty()) {
return
}
if (exist) {
obuWarningTrafficData[obuTrafficData.uuid!!] = obuTrafficData
} else {
obuWarningTrafficData.remove(obuTrafficData.uuid!!)
}
WarningHelper.renderOBUWarningObj(exist, obuTrafficData)
}
/**
@@ -129,7 +69,7 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener {
//清除缓存
for (data in resultList) {
if (trafficDataUuidList.size > 0 && trafficDataUuidList.contains("" + data.uuid)) {
if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type) {
if (TrackerSourceHelper.filterData(data)) {
continue
}
trafficDataUuidList.remove("" + data.uuid)
@@ -165,7 +105,7 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener {
trafficDataUuidList.clear()
for (data in trafficData) {
// 过滤掉未知感知数据
if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type) {
if (TrackerSourceHelper.filterData(data)) {
continue
}
var temp: TrackedObject = data
@@ -173,38 +113,8 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener {
//首次过来的数据不添加,首次未添加的感知物在调用完绘制方法后再塞入cache map
val cacheData = mMarkersCaches[uuid]
if (cacheData != null) {
//OBU数据颜色标记
val first = data.trackedSourceList.stream()
.filter { trackedSource: TrackedSource -> trackedSource.source == 4 }
.findFirst()
if (first.isPresent) {
val subFirst = first.get().subSourceList.stream()
.filter { subSource: SubSource -> subSource.source == 1 }
.findFirst()
if (subFirst.isPresent) {
val subID = subFirst.get().id
if (!TextUtils.isEmpty(subID)) {
temp = data.toBuilder().setColor("#36D3FE").build()
if (obuWarningTrafficData.containsKey(subID)) {
temp = data.toBuilder()
.setColor(obuWarningTrafficData[subID]!!.threatLevelColor())
.build()
}
}
}
}
//预警颜色变化
if (pncWarningTrafficData.containsKey(uuid)) {
val planningTrack = pncWarningTrafficData[uuid]
if (!timeOut(planningTrack!!.time)) {
temp = data.toBuilder().setColor(planningTrack.color).build()
} else {
pncWarningTrafficData.remove(uuid)
}
}
val color = TrackerSourceHelper.getDefaultColor(data)
temp = data.toBuilder().setColor(color).build()
mFilterTrafficData[uuid] = temp
}
mMarkersCaches[uuid] = temp
@@ -223,17 +133,7 @@ class IdentifyOriginDataDrawer : Identify, IMoGoAutopilotStatusListener {
.removeMarker(uuid)
}
trafficDataUuidList.clear()
pncWarningTrafficData.clear()
}
override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) {
mAutopilotStatus = autoPilotStatusInfo.state
}
private fun timeOut(time: Double): Boolean {
val duration =
(CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime() * 1000).toLong() - (time * 1000).toLong()
return duration >= 500
WarningHelper.clear()
}
}

View File

@@ -9,8 +9,6 @@ import androidx.annotation.RequiresApi;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.data.enums.TrafficTypeEnum;
import com.mogo.eagle.core.data.traffic.TrafficData;
import com.mogo.eagle.core.data.traffic.TrafficDataKt;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
@@ -22,7 +20,6 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import mogo.telematics.pad.MessagePad;
@@ -64,57 +61,13 @@ public class TrackManager {
@SuppressLint("NewApi")
private final HashMap<String, MessagePad.TrackedObject> mFilterTrafficData = new HashMap<>();
//感知物预警各自先以帧数更新保持,不做同一个集合的融合处理(以卫星时间做判断先后可能会出现不同ip节点间的回溯问题)
/**
* planning 感知物预警缓存用于重置color状态
*/
private final ConcurrentHashMap<String, PlanningTrack> pncWarningTrafficData = new ConcurrentHashMap<>();
/**
* obu 感知物预警缓存用于重置color状态
*/
private final ConcurrentHashMap<String, TrafficData> obuWarningTrafficData = new ConcurrentHashMap<>();
@SuppressLint("NewApi")
public synchronized void renderPlanningWarningObj(List<MessagePad.PlanningObject> planningObjects) {
pncWarningTrafficData.clear();
//处于美化模式或者自动驾驶状态下展示
if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == 2) {
if (planningObjects == null) {
return;
}
planningObjects.forEach(planningObj -> {
String trackId = "" + planningObj.getUuid();
if (mMarkersCaches.containsKey(trackId)) {
TrackObj trackObj = mMarkersCaches.get(trackId);
if (trackObj == null) {
return;
}
if (planningObj.getType() == 0) {
pncWarningTrafficData.put(trackId, new PlanningTrack(
"#D65D5AFF",
CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84SatelliteTime()
));
} else if (planningObj.getType() == 1) {
pncWarningTrafficData.put(trackId, new PlanningTrack(
"#E4DD94FF",
CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84SatelliteTime()
));
}
}
});
}
WarningHelper.INSTANCE.renderPlanningWarningObj(planningObjects, mMarkersCaches);
}
public synchronized void renderOBUWarningObj(boolean exist, TrafficData obuTrafficData) {
if (obuTrafficData.getUuid() == null || obuTrafficData.getUuid().isEmpty()) {
return;
}
if (exist) {
obuWarningTrafficData.put(obuTrafficData.getUuid(), obuTrafficData);
} else {
obuWarningTrafficData.remove(obuTrafficData.getUuid());
}
WarningHelper.INSTANCE.renderOBUWarningObj(exist, obuTrafficData);
}
/**
@@ -126,39 +79,14 @@ public class TrackManager {
mFilterTrafficData.clear();
//进入过滤机制的感知物体,首先从缓存队列中进行查找 uuid
for (MessagePad.TrackedObject data : trafficData) {
if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.getType() == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.getType()) {
if (TrackerSourceHelper.INSTANCE.filterData(data)) {
continue;
}
String uuid = "" + data.getUuid();
TrackObj trackObj = mMarkersCaches.get(uuid);
//OBU数据颜色标记
Optional<MessagePad.TrackedSource> first = data.getTrackedSourceList().stream()
.filter(trackedSource -> trackedSource.getSource() == 4).findFirst();
if (first.isPresent()) {
Optional<MessagePad.SubSource> subFirst = first.get().getSubSourceList().stream().filter(subSource -> subSource.getSource() == 1).findFirst();
if (subFirst.isPresent()) {
String subID = subFirst.get().getId();
if (!TextUtils.isEmpty(subID)) {
data = data.toBuilder().setColor("#36D3FE").build();
if (obuWarningTrafficData.containsKey(subID)) {
data = data.toBuilder()
.setColor(TrafficDataKt.threatLevelColor(obuWarningTrafficData.get(subID)))
.build();
}
}
}
}
// 判断物体是否与预警信息
if (pncWarningTrafficData.containsKey(uuid)) {
PlanningTrack planningTrack = pncWarningTrafficData.get(uuid);
if (planningTrack != null && !timeOut(planningTrack.getTime())) {
data = data.toBuilder().setColor(planningTrack.getColor()).build();
} else {
pncWarningTrafficData.remove(uuid);
}
}
String color = TrackerSourceHelper.INSTANCE.getDefaultColor(data);
data = data.toBuilder().setColor(color).build();
if (trackObj != null) {
trackObj.updateObj(data);
@@ -178,7 +106,7 @@ public class TrackManager {
if (cache != null) {
//相对静止物体并且非obu数据则不改变为感知融合同位置物体使用缓存数据做覆盖
if (cacheTrack.relativeStatic()) {
if(data.getColor()!= null && !data.getColor().isEmpty()){
if (data.getColor() != null && !data.getColor().isEmpty()) {
cache = cache.toBuilder().setColor(data.getColor()).build();
}
data = cache;
@@ -206,7 +134,7 @@ public class TrackManager {
//过滤现有元素
for (MessagePad.TrackedObject data : resultList) {
String uuid = "" + data.getUuid();
if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.getType() == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.getType()) {
if (TrackerSourceHelper.INSTANCE.filterData(data)) {
continue;
}
if (trafficDataUuid.size() > 0) {
@@ -234,13 +162,8 @@ public class TrackManager {
@SuppressLint("NewApi")
public void clearAll() {
trafficDataUuid.clear();
pncWarningTrafficData.clear();
WarningHelper.INSTANCE.clear();
mMarkersCaches.forEach((uuid, trackObj) -> removeKey(uuid));
}
private Boolean timeOut(Double time) {
long duration = (long) (CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84SatelliteTime() * 1000) - (long) (time * 1000);
return duration >= 500;
}
}

View File

@@ -0,0 +1,135 @@
package com.mogo.eagle.core.function.map.identify
import android.annotation.SuppressLint
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.enums.TrafficTypeEnum
import mogo.telematics.pad.MessagePad.*
object TrackerSourceHelper {
@SuppressLint("NewApi")
fun filterData(data: TrackedObject): Boolean {
if (!FunctionBuildConfig.isDrawUnknownIdentifyData
&& data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type
) {
return true
}
var trackIPCFilter = true
when (FunctionBuildConfig.trackerIPCProvider) {
0 -> trackIPCFilter = false
1 -> if (isIPC(data)) {
trackIPCFilter = false
}
2 -> {
if (isObu(data).second) {
trackIPCFilter = false
}
}
3 -> {
if (isV2I(data).second) {
trackIPCFilter = false
}
}
}
return trackIPCFilter
}
fun getDefaultColor(data: TrackedObject): String {
var color = ""
if (!FunctionBuildConfig.isDrawUnknownIdentifyData
&& data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type
) {
return ""
}
if (isV2I(data).second) {
color = "#00AEFF"
}
//等级最高
if (isObu(data).second) {
color = "#36D3FE"
// obu预警
isObu(data).first?.let {
val obuColor = WarningHelper.getObuColor(it.id)
if (obuColor.isNotBlank()) {
color = obuColor
}
}
}
// pnc预警
val pncColor = WarningHelper.getPncColor(data.uuid.toString())
if (pncColor.isNotBlank()) {
color = pncColor
}
return color
}
/**
* 过滤所有 工控感知数据 all match
*/
@SuppressLint("NewApi")
fun isIPC(data: TrackedObject): Boolean {
val source = data.trackedSourceList.stream().allMatch {
it.source != 4
}
return source
}
/**
* any match 任何一个匹配到OBU则认为是存在obu数据
*/
@SuppressLint("NewApi")
fun isObu(data: TrackedObject): Pair<SubSource?, Boolean> {
val source = data.trackedSourceList.stream().anyMatch {
it.source == 4
}
if (source) {
val first = data.trackedSourceList.stream()
.filter { trackedSource: TrackedSource -> trackedSource.source == 4 }.findFirst()
if (first.isPresent) {
val subObu = first.get().subSourceList.stream().anyMatch {
it.source == 1
}
if (subObu) {
val subFirst = first.get().subSourceList.stream()
.filter { subSource: SubSource -> subSource.source == 1 }
.findFirst()
if (subFirst.isPresent) {
return Pair(subFirst.get(), true)
}
}
}
}
return Pair(null, false)
}
/**
* 过滤所有 v2i 感知数据 all match
*/
@SuppressLint("NewApi")
fun isV2I(data: TrackedObject): Pair<SubSource?, Boolean> {
val source = data.trackedSourceList.stream().allMatch {
it.source == 4
}
if (source) {
val first = data.trackedSourceList.stream()
.filter { trackedSource: TrackedSource -> trackedSource.source == 4 }.findFirst()
if (first.isPresent) {
val subV2I = first.get().subSourceList.stream().allMatch {
it.source == 6
}
if (subV2I) {
val subFirst = first.get().subSourceList.stream()
.filter { subSource: SubSource -> subSource.source == 6 }
.findFirst()
if (subFirst.isPresent) {
return Pair(subFirst.get(), true)
}
}
}
}
return Pair(null, false)
}
}

View File

@@ -0,0 +1,148 @@
package com.mogo.eagle.core.function.map.identify
import android.annotation.SuppressLint
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.traffic.TrafficData
import com.mogo.eagle.core.data.traffic.threatLevelColor
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getCurWgs84SatelliteTime
import mogo.telematics.pad.MessagePad
import mogo.telematics.pad.MessagePad.PlanningObject
import java.util.concurrent.ConcurrentHashMap
import java.util.function.Consumer
object WarningHelper {
//感知物预警各自先以帧数更新保持,不做同一个集合的融合处理(以卫星时间做判断先后可能会出现不同ip节点间的回溯问题)
/**
* planning 感知物预警缓存用于重置color状态
*/
private val pncWarningBeautyTrafficData = ConcurrentHashMap<String, PlanningTrack>()
/**
* planning 感知物预警缓存用于重置color状态
*/
private val pncWarningOriginTrafficData = ConcurrentHashMap<String, PlanningTrack>()
/**
* obu 感知物预警缓存用于重置color状态
*/
private val obuWarningTrafficData = ConcurrentHashMap<String, TrafficData>()
@SuppressLint("NewApi")
fun renderPlanningWarningObj(
planningObjects: List<PlanningObject>?,
mMarkersCaches: ConcurrentHashMap<String, TrackObj>
) {
pncWarningBeautyTrafficData.clear()
//处于美化模式或者自动驾驶状态下展示
if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || getAutoPilotStatusInfo().state == 2) {
if (planningObjects == null) {
return
}
planningObjects.forEach(Consumer { planningObj: PlanningObject ->
val trackId = "" + planningObj.uuid
if (mMarkersCaches.containsKey(trackId)) {
mMarkersCaches[trackId] ?: return@Consumer
if (planningObj.type == 0) { //0是leading障碍物障碍物车身红色提示
pncWarningBeautyTrafficData[trackId] = PlanningTrack(
"#D65D5AFF",
getCurWgs84SatelliteTime()
)
} else if (planningObj.type == 1) { //1是避障和择机的障碍物障碍物车身黄色提示
pncWarningBeautyTrafficData[trackId] = PlanningTrack(
"#E4DD94FF",
getCurWgs84SatelliteTime()
)
}
}
})
}
}
@SuppressLint("NewApi")
fun renderPlanningOriginWarningObj(
planningObjects: List<PlanningObject>?,
mMarkersCaches: ConcurrentHashMap<String, MessagePad.TrackedObject>
) {
pncWarningOriginTrafficData.clear()
//处于美化模式或者自动驾驶状态下展示
if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || getAutoPilotStatusInfo().state == 2) {
if (planningObjects == null) {
return
}
planningObjects.forEach(Consumer { planningObj: PlanningObject ->
val trackId = "" + planningObj.uuid
if (mMarkersCaches.containsKey(trackId)) {
mMarkersCaches[trackId] ?: return@Consumer
if (planningObj.type == 0) { //0是leading障碍物障碍物车身红色提示
pncWarningOriginTrafficData[trackId] = PlanningTrack(
"#D65D5AFF",
getCurWgs84SatelliteTime()
)
} else if (planningObj.type == 1) { //1是避障和择机的障碍物障碍物车身黄色提示
pncWarningOriginTrafficData[trackId] = PlanningTrack(
"#E4DD94FF",
getCurWgs84SatelliteTime()
)
}
}
})
}
}
fun renderOBUWarningObj(exist: Boolean, obuTrafficData: TrafficData) {
if (obuTrafficData.uuid == null || obuTrafficData.uuid!!.isEmpty()) {
return
}
if (exist) {
obuWarningTrafficData[obuTrafficData.uuid!!] = obuTrafficData
} else {
obuWarningTrafficData.remove(obuTrafficData.uuid)
}
}
fun getObuColor(uuid: String): String {
if (obuWarningTrafficData.containsKey(uuid)) {
return obuWarningTrafficData[uuid]!!.threatLevelColor()
}
return ""
}
fun getPncColor(uuid: String): String {
if (FunctionBuildConfig.isBeautyMode) {
// 判断物体是否有预警信息
if (pncWarningBeautyTrafficData.containsKey(uuid)) {
val planningTrack = pncWarningBeautyTrafficData[uuid]
if (planningTrack != null && !timeOut(planningTrack.time)) {
return planningTrack.color
} else {
pncWarningBeautyTrafficData.remove(uuid)
}
}
return ""
} else {
// 判断物体是否有预警信息
if (pncWarningOriginTrafficData.containsKey(uuid)) {
val planningTrack = pncWarningOriginTrafficData[uuid]
if (planningTrack != null && !timeOut(planningTrack.time)) {
return planningTrack.color
} else {
pncWarningOriginTrafficData.remove(uuid)
}
}
return ""
}
}
fun clear() {
pncWarningBeautyTrafficData.clear()
pncWarningOriginTrafficData.clear()
obuWarningTrafficData.clear()
}
private fun timeOut(time: Double): Boolean {
val duration = (getCurWgs84SatelliteTime() * 1000).toLong() - (time * 1000).toLong()
return duration >= 500
}
}

View File

@@ -80,7 +80,7 @@ object FunctionBuildConfig {
var debugTrackerProvider = 0
/**
* 感知物识别使用的数据来源 0 = 默认输出 1 = 只显示工控硬件数据感知来源 2 = 只显示V2V数据来源 3 = 只显示V2N数据来源
* 感知物识别使用的数据来源 0 = 默认输出 1 = 只显示工控硬件数据感知来源 2 = 只显示V2V数据来源 3 = 只显示V2I数据来源
*/
@Volatile
@JvmField

View File

@@ -363,8 +363,8 @@ enum class EventTypeEnum(
tts = ""
),
TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯请优先通行"),
TYPE_VIP_ERROR_IDENTIFICATION("10023", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败请稍后重试"),
TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯,请优先通行"),
TYPE_VIP_ERROR_IDENTIFICATION("10023", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败,请稍后重试"),
TYPE_OPTIMAL_ROUTE_RECOMMEND("2000", "", "", R.drawable.icon_warning_v2x_optimal_route, "为您推荐最优路线", "已为您选择最优路线");