diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/RoadCrossCameraManager.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/RoadCrossCameraManager.kt index 007f9dc927..04db73c100 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/RoadCrossCameraManager.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/RoadCrossCameraManager.kt @@ -7,13 +7,15 @@ import android.os.Handler import android.os.Looper import android.os.Message import com.mogo.commons.debug.DebugConfig -import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.road.CameraDeviceInfo +import com.mogo.eagle.core.data.road.RoadCrossCamera +import com.mogo.eagle.core.function.api.map.listener.IGaoDeMapLocationListener import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener import com.mogo.eagle.core.function.business.roadcross.net.NDERoadCameraNetWorkModel.Companion.ndeRoadCameraNetWorkModel import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.map.CallerGaoDeMapLocationListenerManager import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.map.R @@ -29,11 +31,14 @@ import com.zhidaoauto.map.data.road.StopLine import com.zhjt.service.chain.ChainLog import kotlin.properties.Delegates -class RoadCrossCameraManager : IMoGoMapRoadListener { +@SuppressLint("NewApi") +class RoadCrossCameraManager : IMoGoMapRoadListener, IGaoDeMapLocationListener { companion object { private const val TAG = "RoadCrossCameraManager" private const val REQUEST_CAMERA_MSG = 0 + private const val REMOVE_MARKER_MSG = 1 + private const val REQUEST_CAMERA_DELAY_TIME = 50000L private const val REMOVE_MARKER_DELAY_TIME = 10000L val instance: RoadCrossCameraManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { @@ -47,25 +52,71 @@ class RoadCrossCameraManager : IMoGoMapRoadListener { private var isCameraRequest = false @Volatile - private var roadCrossCameraList: List? = null + private var roadCrossCameraList: List? = null private val overlayManager = CallerMapUIServiceManager.getOverlayManager() - private val handler = object :Handler(Looper.getMainLooper()){ + private val handler = object : Handler(Looper.getMainLooper()) { override fun handleMessage(msg: Message) { super.handleMessage(msg) - CallerLogger.d("$M_MAP$TAG", "remove marker") - overlayManager?.removeAllPointsInOwner(TAG) + when (msg.what) { + REQUEST_CAMERA_MSG -> { + getAllRoadCross() + } + + REMOVE_MARKER_MSG -> { + CallerLogger.d("$M_MAP$TAG", "remove marker") + overlayManager?.removeAllPointsInOwner(TAG) + } + } } } fun init(context: Context?) { mContext = context CallerMapRoadListenerManager.addListener(TAG, this) + CallerGaoDeMapLocationListenerManager.addListener(TAG, this) + getAllRoadCross() + } + + private fun getAllRoadCross() { + val cityCode = CallerMapUIServiceManager.getCityCode() + if (cityCode.isNullOrEmpty() || (cityCode.isNotEmpty() && cityCode == "010")) { + handler.removeMessages(REQUEST_CAMERA_MSG) + handler.sendEmptyMessageDelayed(REQUEST_CAMERA_MSG, REQUEST_CAMERA_DELAY_TIME + 100000) + return + } + ndeRoadCameraNetWorkModel.getRoadCrossInfo( + onSuccess = { it -> + if (it.isNotEmpty()) { + roadCrossCameraList = it + val map = mutableMapOf() + it.forEach { road -> + road.crossingId?.let { id -> + map[id] = road + } + } + roadCrossTrace(TAG, map) + } else { + traceError("roadCrossInfo request size is zero") + } + }, + onError = { + handler.removeMessages(REQUEST_CAMERA_MSG) + handler.sendEmptyMessageDelayed(REQUEST_CAMERA_MSG, REQUEST_CAMERA_DELAY_TIME) + traceError("roadCrossInfo request errorMsg: $it") + }) + } + + override fun onCityCodeChanged(cityCode: String) { + super.onCityCodeChanged(cityCode) + if (cityCode != "010") { + getAllRoadCross() + } } private var distance: Double by Delegates.observable(0.0) { _, _, newV -> - if(!AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ + if (!AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) { return@observable } if (!isCameraRequest && newV < 100) { @@ -75,34 +126,29 @@ class RoadCrossCameraManager : IMoGoMapRoadListener { "$M_MAP$TAG", "触发接口调用 dis: $distance , roadCrossEnd: ${roadCrossEnd ?: "null"} " ) - if(roadCrossEnd == null){ + if (roadCrossEnd == null) { roadCrossTrace( - TAG, mapOf("errorMsg" to "触发接口调用,roadCrossEnd获取为null",) + TAG, mapOf("errorMsg" to "触发接口调用,roadCrossEnd获取为null") ) } if (roadCrossEnd != null) { - ndeRoadCameraNetWorkModel.getRoadCrossInfo(roadCrossEnd, - onSuccess = { - if (it.crossingId == null) { - traceError("roadUniqueId is null") - return@getRoadCrossInfo - } - if (it.deviceInfoList.isEmpty()) { - traceError("deviceInfoList isEmpty") - return@getRoadCrossInfo - } - roadCrossCameraList = it.deviceInfoList - // 地图上打marker(注意marker方向),marker点击获取对应ip - ThreadUtils.runOnUiThread { + if (roadCrossCameraList != null) { + roadCrossCameraList?.forEach { + //todo 多个匹配,需要修改 + if (!it.roadUniqueId.isNullOrEmpty() + && it.roadUniqueId!!.contains(roadCrossEnd) + ) { it.deviceInfoList.forEach { deviceInfo -> addCameraDeviceMarker(deviceInfo) } + } else { + requestSingleCross(roadCrossEnd) } - }, - onError = { - traceError("roadCrossInfo request errorMsg: $it") - }) + } + } else { + requestSingleCross(roadCrossEnd) + } } else { traceError("roadCross is null") } @@ -111,6 +157,30 @@ class RoadCrossCameraManager : IMoGoMapRoadListener { } } + private fun requestSingleCross(roadCrossEnd: String) { + ndeRoadCameraNetWorkModel.getRoadCrossInfo(roadCrossEnd, + onSuccess = { result -> + val it = result[0] + if (it.crossingId == null) { + traceError("roadUniqueId is null") + return@getRoadCrossInfo + } + if (it.deviceInfoList.isEmpty()) { + traceError("deviceInfoList isEmpty") + return@getRoadCrossInfo + } + // 地图上打marker(注意marker方向),marker点击获取对应ip + ThreadUtils.runOnUiThread { + it.deviceInfoList.forEach { deviceInfo -> + addCameraDeviceMarker(deviceInfo) + } + } + }, + onError = { + traceError("roadCrossInfo request errorMsg: $it") + }) + } + private fun addCameraDeviceMarker(cameraDeviceInfo: CameraDeviceInfo) { mContext?.let { val builder = @@ -141,6 +211,44 @@ class RoadCrossCameraManager : IMoGoMapRoadListener { } } + fun hasCrossCamera(): Boolean { + if(CallerMapUIServiceManager.getCityCode() == "010"){ + roadCrossTrace( + TAG, mapOf("errorMsg" to "cityCode限制 - 北京无路口设备") + ) + return false + } + + val roadCrossEnd = CallerMapRoadListenerManager.getCrossEndInfo() + if(roadCrossEnd == null){ + roadCrossTrace( + TAG, mapOf("errorMsg" to "hasCrossCamera - 未获取到地图crossEnd数据") + ) + return false + } + + if (roadCrossCameraList == null) { + roadCrossTrace( + TAG, mapOf("errorMsg" to "hasCrossCamera - 未获取到全市路口设备信息") + ) + return false + } + + roadCrossCameraList?.forEach { + val result = (!it.roadUniqueId.isNullOrEmpty() + && it.roadUniqueId!!.contains(roadCrossEnd)) + roadCrossTrace( + TAG, mapOf("errorMsg" to "hasCrossCamera - 遍历匹配路口数据:$result - $roadCrossEnd") + ) + return result + } + + roadCrossTrace( + TAG, mapOf("errorMsg" to "hasCrossCamera - 均不匹配上述条件") + ) + return false + } + @SuppressLint("NewApi") private fun batchRequestCrossLive(cameraDeviceInfo: List) { val list = mutableListOf() @@ -163,7 +271,7 @@ class RoadCrossCameraManager : IMoGoMapRoadListener { override fun onRoadChange(cross: Boolean, roadCross: RoadCross?) { super.onRoadChange(cross, roadCross) // 出路口 - if(!isCameraRequest){ + if (!isCameraRequest) { CallerLogger.d("$M_MAP$TAG", "未触发路口获取marker") return } @@ -172,7 +280,7 @@ class RoadCrossCameraManager : IMoGoMapRoadListener { ndeRoadCameraNetWorkModel.cancelRequest("roadCross") // 清除marker CallerLogger.d("$M_MAP$TAG", "remove marker handler") - handler.sendEmptyMessageDelayed(REQUEST_CAMERA_MSG, REMOVE_MARKER_DELAY_TIME) + handler.sendEmptyMessageDelayed(REMOVE_MARKER_MSG, REMOVE_MARKER_DELAY_TIME) // 释放控制 isCameraRequest = false CallerLogger.d("$M_MAP$TAG", "经过路口,释放控制") @@ -197,7 +305,7 @@ class RoadCrossCameraManager : IMoGoMapRoadListener { linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_MAP, nodeAliasCode = ChainConstant.CHAIN_CODE_MAP_ROAD_CROSS_ERROR, - paramIndexes = [0] + paramIndexes = [0, 1] ) private fun roadCrossTrace(tag: String, paramMap: Any) { CallerLogger.d("$M_MAP$tag", "$paramMap") diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/net/NDERoadCameraNetWorkModel.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/net/NDERoadCameraNetWorkModel.kt index 5a406db1cf..682caba32d 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/net/NDERoadCameraNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/roadcross/net/NDERoadCameraNetWorkModel.kt @@ -27,8 +27,8 @@ class NDERoadCameraNetWorkModel private constructor() { } fun getRoadCrossInfo( - crossID: String, - onSuccess: ((RoadCrossCamera) -> Unit), + crossID: String? = null, + onSuccess: ((List) -> Unit), onError: ((String) -> Unit) ) { request>>("roadCross") { @@ -39,7 +39,7 @@ class NDERoadCameraNetWorkModel private constructor() { getNetWorkApi().roadCameraRequest( pair.first, pair.second, - crossID, + crossID?:"", loc.longitude, loc.latitude, CallerMapUIServiceManager.getCityCode() ?: "" @@ -48,7 +48,7 @@ class NDERoadCameraNetWorkModel private constructor() { } onSuccess { if (it.result.isNotEmpty()) { - onSuccess.invoke(it.result[0]) + onSuccess.invoke(it.result) } else { onError.invoke("getRoadCrossInfo empty camera info") } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/RoadCrossRoamView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/RoadCrossRoamView.kt index 1dede72e9c..056fb38e57 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/RoadCrossRoamView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/RoadCrossRoamView.kt @@ -19,6 +19,8 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.V2X_EVENT_TAG import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener +import com.mogo.eagle.core.function.business.roadcross.RoadCrossCameraManager +import com.mogo.eagle.core.function.business.roadcross.RoadCrossCameraManager.Companion.instance import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.map.CallerMapIdentifyManager @@ -208,6 +210,11 @@ class RoadCrossRoamView @JvmOverloads constructor( CallerLogger.d("$M_MAP$TAG", "attachView return , mainPageVisible is false") return } + // 没有路侧设备,不做处理 + if(!instance.hasCrossCamera()){ + CallerLogger.d("$M_MAP$TAG", "没有路侧设备,不做处理") + return + } //播放语音 val dis = CallerMapRoadListenerManager.getStopLineDistance()?.toInt() ?: 0 if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/listener/IGaoDeMapLocationListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/listener/IGaoDeMapLocationListener.kt index e45c2b085d..e20d369956 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/listener/IGaoDeMapLocationListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/listener/IGaoDeMapLocationListener.kt @@ -14,5 +14,10 @@ interface IGaoDeMapLocationListener { * * @param location 新定位点 */ - fun onMoGoLocationChanged(location: MogoLocation) + fun onMoGoLocationChanged(location: MogoLocation){} + + /** + * 城市代码改变 + */ + fun onCityCodeChanged(cityCode: String){} } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerGaoDeMapLocationListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerGaoDeMapLocationListenerManager.kt index 8be7f1f7fb..c967ab13bc 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerGaoDeMapLocationListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerGaoDeMapLocationListenerManager.kt @@ -20,4 +20,11 @@ object CallerGaoDeMapLocationListenerManager : CallerBase